From 9da8ac113f97e68e91e3a1ef26467f9814eb4312 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Mon, 8 Apr 2019 17:23:59 +0000 Subject: pgf revert to previous release (r49607, committed 5jan19) git-svn-id: svn://tug.org/texlive/trunk@50867 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/doc/generic/pgf/ChangeLog | 4452 ++++++++++---------- Master/texmf-dist/doc/generic/pgf/FILES | 2 - Master/texmf-dist/doc/generic/pgf/README | 2 +- .../gnu-free-documentation-license-1.2.txt | 4 +- .../generic/pgf/licenses/gnu-public-license-2.txt | 14 +- .../doc/generic/pgf/macros/pgfmanual-en-macros.tex | 38 +- Master/texmf-dist/doc/generic/pgf/pgfmanual.pdf | Bin 10529271 -> 10438379 bytes .../pgf/text-en/pgfmanual-en-base-decorations.tex | 2 +- .../pgf/text-en/pgfmanual-en-base-points.tex | 6 +- .../pgf/text-en/pgfmanual-en-base-transparency.tex | 1 - .../pgf/text-en/pgfmanual-en-library-circuits.tex | 2 +- .../text-en/pgfmanual-en-library-decorations.tex | 2 +- .../text-en/pgfmanual-en-library-perspective.tex | 418 -- .../generic/pgf/text-en/pgfmanual-en-main-body.tex | 4 +- .../pgf/text-en/pgfmanual-en-main-preamble.tex | 1 - .../generic/pgf/text-en/pgfmanual-en-pgffor.tex | 13 - .../pgf/text-en/pgfmanual-en-tikz-coordinates.tex | 2 +- .../pgf/text-en/pgfmanual-en-tikz-decorations.tex | 11 +- .../pgf/text-en/pgfmanual-en-tutorial-Euclid.tex | 2 +- .../generic/pgf/version-for-dvisvgm/en/Makefile | 2 +- .../pgf/version-for-dvisvgm/pgfmanual-dvisvgm.cfg | 7 +- .../pgf/version-for-luatex/pgfmanual-luatex.cfg | 7 +- .../pgf/version-for-pdftex/pgfmanual-pdftex.cfg | 7 +- .../testsuite/external/tikzexternaltest.code.tex | 24 +- .../external/tikzexternaltest.sharedpreamble.tex | 12 +- .../pgf/testsuite/mathtest/pgfmathtestsuite.tex | 1384 +++--- .../testsuite/mathtest/unittest_luamathparser.tex | 266 +- .../pgf/basiclayer/pgfcoreexternal.code.tex | 2 +- .../generic/pgf/basiclayer/pgfcorepoints.code.tex | 87 +- .../generic/pgf/basiclayer/pgfcorescopes.code.tex | 1 - .../generic/pgf/basiclayer/pgfcoreshade.code.tex | 173 +- .../libraries/graphs/tikzlibrarygraphs.code.tex | 26 +- .../tikz/libraries/tikzexternalshared.code.tex | 2139 +++++----- .../tikz/libraries/tikzlibraryangles.code.tex | 2 +- .../tikz/libraries/tikzlibrarycalc.code.tex | 19 - .../libraries/tikzlibraryintersections.code.tex | 13 +- .../tikz/libraries/tikzlibrarymath.code.tex | 2 +- .../tikz/libraries/tikzlibraryperspective.code.tex | 111 - .../generic/pgf/frontendlayer/tikz/tikz.code.tex | 31 +- .../tex/generic/pgf/graphdrawing/lua/pgf.lua | 2 +- .../tex/generic/pgf/graphdrawing/lua/pgf/gd.lua | 10 +- .../graphdrawing/lua/pgf/gd/bindings/Binding.lua | 33 +- .../lua/pgf/gd/bindings/BindingToPGF.lua | 98 +- .../lua/pgf/gd/circular/Tantau2012.lua | 38 +- .../pgf/graphdrawing/lua/pgf/gd/circular/doc.lua | 56 +- .../graphdrawing/lua/pgf/gd/control/Anchoring.lua | 30 +- .../lua/pgf/gd/control/ComponentAlign.lua | 198 +- .../lua/pgf/gd/control/ComponentDirection.lua | 51 +- .../lua/pgf/gd/control/ComponentDistance.lua | 134 +- .../lua/pgf/gd/control/ComponentOrder.lua | 94 +- .../graphdrawing/lua/pgf/gd/control/Components.lua | 142 +- .../graphdrawing/lua/pgf/gd/control/Distances.lua | 343 +- .../graphdrawing/lua/pgf/gd/control/FineTune.lua | 76 +- .../lua/pgf/gd/control/LayoutPipeline.lua | 743 ++-- .../lua/pgf/gd/control/NodeAnchors.lua | 123 +- .../lua/pgf/gd/control/Orientation.lua | 281 +- .../graphdrawing/lua/pgf/gd/control/Sublayouts.lua | 306 +- .../pgf/graphdrawing/lua/pgf/gd/control/doc.lua | 37 +- .../graphdrawing/lua/pgf/gd/control/library.lua | 133 +- .../graphdrawing/lua/pgf/gd/deprecated/Cluster.lua | 2 +- .../graphdrawing/lua/pgf/gd/deprecated/Edge.lua | 34 +- .../graphdrawing/lua/pgf/gd/deprecated/Graph.lua | 22 +- .../lua/pgf/gd/deprecated/Iterators.lua | 42 +- .../graphdrawing/lua/pgf/gd/deprecated/Node.lua | 42 +- .../graphdrawing/lua/pgf/gd/deprecated/Vector.lua | 24 +- .../generic/pgf/graphdrawing/lua/pgf/gd/doc.lua | 46 +- .../lua/pgf/gd/doc/ogdf/energybased.lua | 2 +- .../lua/pgf/gd/doc/ogdf/energybased/FMMMLayout.lua | 20 +- .../doc/ogdf/energybased/FastMultipoleEmbedder.lua | 12 +- .../lua/pgf/gd/doc/ogdf/energybased/GEMLayout.lua | 42 +- .../gd/doc/ogdf/energybased/MultilevelLayout.lua | 4 +- .../gd/doc/ogdf/energybased/SpringEmbedderFR.lua | 21 +- .../doc/ogdf/energybased/SpringEmbedderFRExact.lua | 14 +- .../gd/doc/ogdf/energybased/SpringEmbedderKK.lua | 50 +- .../multilevelmixer/BarycenterPlacer.lua | 6 +- .../energybased/multilevelmixer/CirclePlacer.lua | 10 +- .../multilevelmixer/EdgeCoverMerger.lua | 6 +- .../multilevelmixer/IndependentSetMerger.lua | 6 +- .../multilevelmixer/LocalBiconnectedMerger.lua | 6 +- .../energybased/multilevelmixer/MatchingMerger.lua | 6 +- .../energybased/multilevelmixer/MedianPlacer.lua | 4 +- .../energybased/multilevelmixer/RandomMerger.lua | 6 +- .../energybased/multilevelmixer/RandomPlacer.lua | 6 +- .../energybased/multilevelmixer/SolarMerger.lua | 8 +- .../energybased/multilevelmixer/SolarPlacer.lua | 4 +- .../energybased/multilevelmixer/ZeroPlacer.lua | 4 +- .../graphdrawing/lua/pgf/gd/doc/ogdf/layered.lua | 2 +- .../gd/doc/ogdf/layered/CoffmanGrahamRanking.lua | 4 +- .../gd/doc/ogdf/layered/FastHierarchyLayout.lua | 14 +- .../doc/ogdf/layered/FastSimpleHierarchyLayout.lua | 28 +- .../pgf/gd/doc/ogdf/layered/GreedyCycleRemoval.lua | 4 +- .../pgf/gd/doc/ogdf/layered/LongestPathRanking.lua | 18 +- .../lua/pgf/gd/doc/ogdf/layered/OptimalRanking.lua | 6 +- .../pgf/gd/doc/ogdf/layered/SiftingHeuristic.lua | 6 +- .../lua/pgf/gd/doc/ogdf/layered/SugiyamaLayout.lua | 55 +- .../lua/pgf/gd/doc/ogdf/misclayout.lua | 2 +- .../pgf/gd/doc/ogdf/misclayout/BalloonLayout.lua | 2 +- .../pgf/gd/doc/ogdf/misclayout/CircularLayout.lua | 12 +- .../graphdrawing/lua/pgf/gd/doc/ogdf/planarity.lua | 2 +- .../gd/doc/ogdf/planarity/PlanarizationLayout.lua | 30 +- .../lua/pgf/gd/examples/ASCIIDisplayer.lua | 4 +- .../lua/pgf/gd/examples/BindingToASCII.lua | 36 +- .../lua/pgf/gd/examples/SimpleDemo.lua | 32 +- .../lua/pgf/gd/examples/SimpleEdgeDemo.lua | 53 +- .../lua/pgf/gd/examples/SimpleHuffman.lua | 136 +- .../graphdrawing/lua/pgf/gd/examples/library.lua | 2 +- .../evolving/GraphAnimationCoordination.lua | 526 +-- .../evolving/GreedyTemporalCycleRemoval.lua | 114 +- .../pgf/gd/experimental/evolving/Skambath2016.lua | 362 +- .../pgf/gd/experimental/evolving/Supergraph.lua | 197 +- .../evolving/SupergraphVertexSplitOptimization.lua | 186 +- .../lua/pgf/gd/experimental/evolving/TimeSpec.lua | 58 +- .../lua/pgf/gd/experimental/evolving/doc.lua | 50 +- .../lua/pgf/gd/experimental/evolving/layered.lua | 56 +- .../graphdrawing/lua/pgf/gd/force/CoarseGraph.lua | 98 +- .../lua/pgf/gd/force/ControlCoarsening.lua | 180 +- .../lua/pgf/gd/force/ControlDeclare.lua | 2 +- .../lua/pgf/gd/force/ControlElectric.lua | 89 +- .../lua/pgf/gd/force/ControlIteration.lua | 134 +- .../lua/pgf/gd/force/ControlSprings.lua | 18 +- .../graphdrawing/lua/pgf/gd/force/ControlStart.lua | 5 +- .../pgf/graphdrawing/lua/pgf/gd/force/QuadTree.lua | 28 +- .../lua/pgf/gd/force/SpringElectricalHu2006.lua | 190 +- .../lua/pgf/gd/force/SpringElectricalLayouts.lua | 20 +- .../pgf/gd/force/SpringElectricalWalshaw2000.lua | 374 +- .../graphdrawing/lua/pgf/gd/force/SpringHu2006.lua | 113 +- .../lua/pgf/gd/force/SpringLayouts.lua | 10 +- .../force/jedi/algorithms/FruchtermanReingold.lua | 64 +- .../force/jedi/algorithms/HuSpringElectricalFW.lua | 48 +- .../pgf/gd/force/jedi/algorithms/SimpleSpring.lua | 51 +- .../jedi/algorithms/SocialGravityCloseness.lua | 119 +- .../force/jedi/algorithms/SocialGravityDegree.lua | 143 +- .../lua/pgf/gd/force/jedi/base/CoarseGraphFW.lua | 112 +- .../lua/pgf/gd/force/jedi/base/ForceController.lua | 141 +- .../lua/pgf/gd/force/jedi/base/ForceTemplate.lua | 10 +- .../lua/pgf/gd/force/jedi/base/InitialTemplate.lua | 16 +- .../lua/pgf/gd/force/jedi/base/PathLengthsFW.lua | 28 +- .../lua/pgf/gd/force/jedi/base/Preprocessing.lua | 144 +- .../pgf/graphdrawing/lua/pgf/gd/force/jedi/doc.lua | 164 +- .../force/jedi/forcetypes/ForceAbsoluteValue.lua | 28 +- .../force/jedi/forcetypes/ForceCanvasDistance.lua | 36 +- .../force/jedi/forcetypes/ForceCanvasPosition.lua | 26 +- .../force/jedi/forcetypes/ForceGraphDistance.lua | 42 +- .../gd/force/jedi/forcetypes/ForcePullToGrid.lua | 36 +- .../gd/force/jedi/forcetypes/ForcePullToPoint.lua | 40 +- .../CircularInitialPositioning.lua | 6 +- .../initialpositioning/GridInitialPositioning.lua | 6 +- .../RandomInitialPositioning.lua | 10 +- .../graphdrawing/lua/pgf/gd/force/jedi/library.lua | 12 +- .../pgf/graphdrawing/lua/pgf/gd/force/library.lua | 102 +- .../lua/pgf/gd/interface/InterfaceCore.lua | 8 +- .../lua/pgf/gd/interface/InterfaceToAlgorithms.lua | 312 +- .../lua/pgf/gd/interface/InterfaceToC.lua | 59 +- .../lua/pgf/gd/interface/InterfaceToDisplay.lua | 277 +- .../graphdrawing/lua/pgf/gd/interface/Scope.lua | 22 +- .../pgf/graphdrawing/lua/pgf/gd/layered.lua | 26 +- .../layered/CrossingMinimizationGansnerKNV1993.lua | 42 +- .../pgf/gd/layered/CycleRemovalBergerS1990a.lua | 19 +- .../pgf/gd/layered/CycleRemovalBergerS1990b.lua | 18 +- .../pgf/gd/layered/CycleRemovalGansnerKNV1993.lua | 8 +- .../lua/pgf/gd/layered/NetworkSimplex.lua | 88 +- .../gd/layered/NodePositioningGansnerKNV1993.lua | 6 +- .../pgf/gd/layered/NodeRankingGansnerKNV1993.lua | 2 +- .../pgf/gd/layered/NodeRankingMinimumHeight.lua | 6 +- .../graphdrawing/lua/pgf/gd/layered/Ranking.lua | 10 +- .../graphdrawing/lua/pgf/gd/layered/Sugiyama.lua | 204 +- .../lua/pgf/gd/layered/crossing_minimization.lua | 28 +- .../lua/pgf/gd/layered/cycle_removal.lua | 111 +- .../lua/pgf/gd/layered/edge_routing.lua | 23 +- .../graphdrawing/lua/pgf/gd/layered/library.lua | 57 +- .../lua/pgf/gd/layered/node_positioning.lua | 26 +- .../lua/pgf/gd/layered/node_ranking.lua | 40 +- .../generic/pgf/graphdrawing/lua/pgf/gd/lib.lua | 94 +- .../pgf/graphdrawing/lua/pgf/gd/lib/Bezier.lua | 14 +- .../pgf/graphdrawing/lua/pgf/gd/lib/Direct.lua | 14 +- .../pgf/graphdrawing/lua/pgf/gd/lib/Event.lua | 52 +- .../graphdrawing/lua/pgf/gd/lib/LookupTable.lua | 6 +- .../graphdrawing/lua/pgf/gd/lib/PathLengths.lua | 12 +- .../graphdrawing/lua/pgf/gd/lib/PriorityQueue.lua | 6 +- .../graphdrawing/lua/pgf/gd/lib/Simplifiers.lua | 16 +- .../pgf/graphdrawing/lua/pgf/gd/lib/Stack.lua | 2 +- .../pgf/graphdrawing/lua/pgf/gd/lib/Storage.lua | 12 +- .../pgf/graphdrawing/lua/pgf/gd/lib/Transform.lua | 12 +- .../pgf/graphdrawing/lua/pgf/gd/model/Arc.lua | 265 +- .../graphdrawing/lua/pgf/gd/model/Collection.lua | 32 +- .../graphdrawing/lua/pgf/gd/model/Coordinate.lua | 22 +- .../pgf/graphdrawing/lua/pgf/gd/model/Digraph.lua | 178 +- .../pgf/graphdrawing/lua/pgf/gd/model/Edge.lua | 58 +- .../graphdrawing/lua/pgf/gd/model/Hyperedge.lua | 20 +- .../pgf/graphdrawing/lua/pgf/gd/model/Path.lua | 651 ++- .../graphdrawing/lua/pgf/gd/model/Path_arced.lua | 116 +- .../pgf/graphdrawing/lua/pgf/gd/model/Vertex.lua | 46 +- .../lua/pgf/gd/pedigrees/Koerner2015.lua | 81 +- .../gd/phylogenetics/AuthorDefinedPhylogeny.lua | 24 +- .../gd/phylogenetics/BalancedMinimumEvolution.lua | 184 +- .../BalancedNearestNeighbourInterchange.lua | 114 +- .../lua/pgf/gd/phylogenetics/DistanceMatrix.lua | 283 +- .../lua/pgf/gd/phylogenetics/Maeusle2012.lua | 308 +- .../lua/pgf/gd/phylogenetics/PhylogeneticTree.lua | 46 +- .../lua/pgf/gd/phylogenetics/SokalMichener1958.lua | 72 +- .../lua/pgf/gd/phylogenetics/library.lua | 2 +- .../lua/pgf/gd/planar/BoyerMyrvold2004.lua | 878 ++-- .../graphdrawing/lua/pgf/gd/planar/Embedding.lua | 1445 ++++--- .../graphdrawing/lua/pgf/gd/planar/LinkedList.lua | 112 +- .../pgf/graphdrawing/lua/pgf/gd/planar/List.lua | 46 +- .../pgf/graphdrawing/lua/pgf/gd/planar/PDP.lua | 1092 ++--- .../lua/pgf/gd/planar/PlanarLayout.lua | 274 +- .../graphdrawing/lua/pgf/gd/planar/ShiftMethod.lua | 192 +- .../graphdrawing/lua/pgf/gd/planar/parameters.lua | 198 +- .../pgf/graphdrawing/lua/pgf/gd/routing/Hints.lua | 14 +- .../lua/pgf/gd/routing/NecklaceRouting.lua | 58 +- .../graphdrawing/lua/pgf/gd/tools/make_gd_wrap.lua | 88 +- .../graphdrawing/lua/pgf/gd/trees/ChildSpec.lua | 188 +- .../lua/pgf/gd/trees/ReingoldTilford1981.lua | 30 +- .../lua/pgf/gd/trees/SpanningTreeComputation.lua | 598 ++- .../pgf/graphdrawing/lua/pgf/gd/trees/doc.lua | 110 +- .../pgf/graphdrawing/lua/pgf/gd/trees/library.lua | 2 +- .../tex/pgflibrarygraphdrawing.circular.code.tex | 2 +- .../tex/pgflibrarygraphdrawing.examples.code.tex | 4 +- .../tex/pgflibrarygraphdrawing.force.code.tex | 6 +- .../tex/pgflibrarygraphdrawing.layered.code.tex | 4 +- .../tex/pgflibrarygraphdrawing.trees.code.tex | 6 +- .../pgflibrarydecorations.pathmorphing.code.tex | 2 +- .../pgflibrarydecorations.shapes.code.tex | 22 +- .../libraries/luamath/pgf/luamath/functions.lua | 616 +-- .../pgf/libraries/luamath/pgf/luamath/parser.lua | 475 +-- .../libraries/luamath/pgflibraryluamath.code.tex | 10 +- .../generic/pgf/lua/pgf/manual/DocumentParser.lua | 202 +- .../tex/generic/pgf/math/pgfmath.code.tex | 2 +- .../tex/generic/pgf/math/pgfmathcalc.code.tex | 24 +- .../tex/generic/pgf/math/pgfmathfloat.code.tex | 3445 +++++++-------- .../pgf/math/pgfmathfunctions.base.code.tex | 353 +- .../pgf/math/pgfmathfunctions.basic.code.tex | 1086 ++--- .../tex/generic/pgf/math/pgfmathfunctions.code.tex | 329 +- .../pgf/math/pgfmathfunctions.comparison.code.tex | 110 +- .../pgfmathfunctions.integerarithmetics.code.tex | 30 +- .../pgf/math/pgfmathfunctions.misc.code.tex | 446 +- .../pgf/math/pgfmathfunctions.random.code.tex | 260 +- .../pgf/math/pgfmathfunctions.round.code.tex | 156 +- .../math/pgfmathfunctions.trigonometric.code.tex | 124 +- .../tex/generic/pgf/math/pgfmathode.code.tex | 20 +- .../tex/generic/pgf/math/pgfmathparser.code.tex | 144 +- .../tex/generic/pgf/math/pgfmathutil.code.tex | 172 +- .../pgf/modules/pgfmoduleanimations.code.tex | 394 +- .../generic/pgf/modules/pgfmodulebending.code.tex | 75 +- .../modules/pgfmoduledatavisualization.code.tex | 1047 ++--- .../pgf/modules/pgfmoduledecorations.code.tex | 494 +-- .../generic/pgf/modules/pgfmodulematrix.code.tex | 111 +- .../pgfmodulenonlineartransformations.code.tex | 56 +- .../tex/generic/pgf/modules/pgfmoduleoo.code.tex | 170 +- .../generic/pgf/modules/pgfmoduleparser.code.tex | 36 +- .../tex/generic/pgf/modules/pgfmoduleplot.code.tex | 106 +- .../generic/pgf/modules/pgfmoduleshapes.code.tex | 398 +- .../generic/pgf/modules/pgfmodulesnakes.code.tex | 58 +- .../generic/pgf/modules/pgfmodulesorting.code.tex | 12 +- Master/texmf-dist/tex/generic/pgf/pgf.revision.tex | 8 +- .../texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg | 6 +- .../pgf/systemlayer/pgfsys-common-pdf-via-dvi.def | 25 +- .../generic/pgf/systemlayer/pgfsys-common-pdf.def | 10 +- .../pgf/systemlayer/pgfsys-common-postscript.def | 32 +- .../generic/pgf/systemlayer/pgfsys-common-svg.def | 47 +- .../tex/generic/pgf/systemlayer/pgfsys-dvi.def | 24 +- .../tex/generic/pgf/systemlayer/pgfsys-dvipdfm.def | 6 +- .../generic/pgf/systemlayer/pgfsys-dvipdfmx.def | 46 +- .../tex/generic/pgf/systemlayer/pgfsys-dvips.def | 10 +- .../tex/generic/pgf/systemlayer/pgfsys-dvisvgm.def | 6 +- .../tex/generic/pgf/systemlayer/pgfsys-luatex.def | 40 +- .../tex/generic/pgf/systemlayer/pgfsys-pdftex.def | 32 +- .../tex/generic/pgf/systemlayer/pgfsys-tex4ht.def | 68 +- .../generic/pgf/systemlayer/pgfsys-textures.def | 8 +- .../tex/generic/pgf/systemlayer/pgfsys-vtex.def | 18 +- .../tex/generic/pgf/systemlayer/pgfsys-xetex.def | 12 +- .../tex/generic/pgf/systemlayer/pgfsys.code.tex | 202 +- .../pgf/systemlayer/pgfsysanimations.code.tex | 112 +- .../pgf/systemlayer/pgfsysprotocol.code.tex | 2 +- .../pgf/systemlayer/pgfsyssoftpath.code.tex | 16 +- .../tex/generic/pgf/utilities/pgfcalendar.code.tex | 58 +- .../tex/generic/pgf/utilities/pgfexternal.tex | 2 +- .../generic/pgf/utilities/pgfexternalwithdepth.tex | 22 +- .../tex/generic/pgf/utilities/pgffor.code.tex | 663 ++- .../tex/generic/pgf/utilities/pgfkeys.code.tex | 46 +- .../generic/pgf/utilities/pgfkeysfiltered.code.tex | 1239 +++--- .../tex/generic/pgf/utilities/pgfrcs.code.tex | 66 +- .../generic/pgf/utilities/pgfutil-common-lists.tex | 206 +- .../tex/generic/pgf/utilities/pgfutil-common.tex | 42 +- .../tex/generic/pgf/utilities/pgfutil-context.def | 88 +- .../tex/generic/pgf/utilities/pgfutil-latex.def | 95 +- .../tex/generic/pgf/utilities/pgfutil-plain.def | 114 +- .../tex/latex/pgf/doc/pgfmanual.code.tex | 53 +- .../tex/latex/pgf/doc/pgfmanual.pdflinks.code.tex | 574 +-- .../latex/pgf/doc/pgfmanual.prettyprinter.code.tex | 1765 ++++---- .../libraries/tikzlibraryexternal.code.tex | 89 +- .../tex/latex/pgf/utilities/pgfcalendar.sty | 1 - .../tex/latex/pgf/utilities/tikzexternal.sty | 137 +- 294 files changed, 21360 insertions(+), 22406 deletions(-) delete mode 100644 Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-library-perspective.tex delete mode 100644 Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryperspective.code.tex diff --git a/Master/texmf-dist/doc/generic/pgf/ChangeLog b/Master/texmf-dist/doc/generic/pgf/ChangeLog index ee370607121..c304aad27ea 100644 --- a/Master/texmf-dist/doc/generic/pgf/ChangeLog +++ b/Master/texmf-dist/doc/generic/pgf/ChangeLog @@ -1,3449 +1,3321 @@ -2019-04-04 Christian Feuersaenger - - - 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 - - - Release 3.1.1! + + - Release 3.1.1! 2019-02-01 Christian Feuersaenger - - - fixed bug #503: regression prevented the use of dvips. This reverts the - bugfix for bug #362 + + - fixed bug #503: regression prevented the use of dvips. This reverts the + bugfix for bug 362 2019-01-05 Christian Feuersaenger - - - Release 3.1! + + - Release 3.1! 2018-12-28 Christian Feuersaenger - - \pgfmathprintnumber: implemented 'retain unit mantissa=true|false' (feature #92) + - \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) + - 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) + - 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=` now works fine when in the nodes' text `\textcolor` is used (bug #362) + - 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=` 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) + - 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) + - 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) + - 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) + - (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) + - 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 + 2018-12-20 Henri Menke - - fixed pgf_lookup_and_require for new luaotfload (bug #493) - - fixed graphdrawing for ConTeXt (bug #477) + - fixed pgf_lookup_and_require for new luaotfload (bug #493) + - fixed graphdrawing for ConTeXt (bug #477) 2018-04-30 Christian Feuersaenger - - added utility \pgfmathifexpression (and special treatment in luamath - library and fpu library) + - added utility \pgfmathifexpression (and special treatment in luamath + library and fpu library) 2017-11-14 Christian Feuersaenger - - intersections lib: improved accuracy of intersections for linear paths + - intersections lib: improved accuracy of intersections for linear paths 2017-02-08 Christian Feuersaenger - - fixed incompatibility issue of tikzmath and fpu reported in - http://tex.stackexchange.com/questions/349766/pgfplots-on-tikzmath-function-with-conditionals-returns-an-error + - 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 - - 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!) + - 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 - - Fixed bugs that caused pgfsys-dvips.def to generate corrupt - PostScript for all nodes. + - Fixed bugs that caused pgfsys-dvips.def to generate corrupt + PostScript for all nodes. 2016-07-16 Till Tantau - - Bounding box computations for animations implemented. - - Animated arrow tips are now possible. + - Bounding box computations for animations implemented. + - Animated arrow tips are now possible. 2016-07-13 Christian Feuersaenger - - fixed incompatibility between textpos (absolute mode) and external + - fixed incompatibility between textpos (absolute mode) and external 2016-06-17 Christian Feuersaenger - - fixed \write18 issues in luatex 0.87 and later (by using os.execute()) - affects external lib and plot function. + - fixed \write18 issues in luatex 0.87 and later (by using os.execute()) + affects external lib and plot function. 2016-03-31 Till Tantau - - 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!). + - 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 - - First working, fully documented version of TikZ animations! + - First working, fully documented version of TikZ animations! 2016-02-24 Till Tantau - - Fixed manual stuff to compile it with dvisvgm. + - Fixed manual stuff to compile it with dvisvgm. 2016-02-02 Till Tantau - - Rewrote tikz animation lib. + - Rewrote tikz animation lib. 2016-01-06 Christian Feuersaenger - - added context-related aux file fix of Hans Hagen + - added context-related aux file fix of Hans Hagen 2016-01-02 Christian Feuersaenger - - fixed save stack issues (eliminated 'retaining' issues) about pgf@x and pgf@y + - fixed save stack issues (eliminated 'retaining' issues) about pgf@x and pgf@y 2015-12-29 Christian Feuersaenger - - external lib: 'force remake' now also updates .md5 files + - external lib: 'force remake' now also updates .md5 files 2015-11-28 Christian Feuersaenger - - 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 + - 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 - - activated math parser in foreach's end notation to allow \foreach \i in {0,...,10-9} + - activated math parser in foreach's end notation to allow \foreach \i in {0,...,10-9} 2015-09-09 Till Tantau - - 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. + - 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 - - fixed bug in luamath library + - fixed bug in luamath library 2015-08-29 Christian Feuersaenger - - external lib: added support to automatically externalize references and - labels with 'mode=convert with system call' + - external lib: added support to automatically externalize references and + labels with 'mode=convert with system call' 2015-08-24 Till Tantau - - Reworked implementation of animations for tikz and started - on documentation of the backend. + - Reworked implementation of animations for tikz and started + on documentation of the backend. 2015-08-20 Till Tantau - - First complete implementation of animations for tikz! (for - svg backend). Documentation still missing, but works nicely. + - First complete implementation of animations for tikz! (for + svg backend). Documentation still missing, but works nicely. 2015-08-13 Till Tantau - - First work on animations for svg. Added commands in pgfsys - and added module pgfmoduleanimations. No documnetation yet. + - First work on animations for svg. Added commands in pgfsys + and added module pgfmoduleanimations. No documnetation yet. 2015-08-07 Christian Feuersaenger - - Release 3.0.1! + - Release 3.0.1! 2015-08-03 Christian Feuersaenger - - 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 + - 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 - - fixed fpu math functions for int, ceil, and floor - - added \pgfmathlogtwo and \pgfmathlogten as requested in bug #359 + - fixed fpu math functions for int, ceil, and floor + - added \pgfmathlogtwo and \pgfmathlogten as requested in bug #359 2015-06-06 Till Tantau - - 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. + - 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 - - Added number nodes option to graph lib. + - Added number nodes option to graph lib. 2015-05-18 Till Tantau - - Fixed nullfont warnings in axes in datavisualization. - - Fixed wrong axes for school book plots. + - Fixed nullfont warnings in axes in datavisualization. + - Fixed wrong axes for school book plots. 2015-05-15 Mark Wibrow - - Fixed nullfont warnings when parsing logic gate inputs. + - Fixed nullfont warnings when parsing logic gate inputs. 2015-05-08 Till Tantau - - 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. + - 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 - - Updated patterns.meta library. + - Updated patterns.meta library. 2015-05-02 Christian Feuersaenger - - context: committed patch to adopt pgfutil-context for new (incompatible) - context handling of colors -- contains some cleanup by Hans Hagen. + - 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 - - fixed bug in external lib: braces in external filenames confused the generator + - fixed bug in external lib: braces in external filenames confused the generator 2015-01-02 Christian Feuersaenger - - fixed bug in fpu: equal(x, 0) failed for x<0 + - fixed bug in fpu: equal(x, 0) failed for x<0 2014-12-30 Christian Feuersaenger - - fixed bug in atan2 (returned wrong sign for atan2(4e-5,-5)) - - implemented atan2 in FPU + - fixed bug in atan2 (returned wrong sign for atan2(4e-5,-5)) + - implemented atan2 in FPU 2014-11-02 Christian Feuersaenger - - fixed save stack issue (TeX capacity exceeded, sorry [save size=250000]) - if the color changes a _huge_ number of times during a single path. + - 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 - - worked on LUA math parser: ensured that a suitable first scope of - functions works. I also added support for 'declare function' + - 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 - - Added provisional code for patterns.meta library. Patterns + - 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). + at back-end (uses \pgfsys@declarepattern@meta in pgfsys-pdftex.def). 2014-08-04 Christian Feuersaenger - - 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. + - 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 - - fixed bug (regression of bug #229): external lib with dvips produced - wrong bounding box (was broken entirely) + - fixed bug (regression of bug #229): external lib with dvips produced + wrong bounding box (was broken entirely) 2014-07-08 Christian Feuersaenger - - 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. + - 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 - - 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) + - 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 - - 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. + - 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 - - Fixed bug #308 fixedpointarithmetic: unwanted spaces by line ends + - Fixed bug #308 fixedpointarithmetic: unwanted spaces by line ends 2014-03-30 Christian Feuersaenger - - Fixed feature #81: signum function (fpu + pgf basic layer) + - Fixed feature #81: signum function (fpu + pgf basic layer) 2014-03-24 Till Tantau - - Fixed all \begin{scope} and \end{scope} in foldings lib, - changed them to \scope and \endscope. + - Fixed all \begin{scope} and \end{scope} in foldings lib, + changed them to \scope and \endscope. 2014-03-21 Till Tantau - - 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. + - 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 - - 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. + - 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 - - 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." + - 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 - - Added first edge routing algorithm to gd. - + - Added first edge routing algorithm to gd. + 2014-02-02 Christian Feuersaenger - - - intersections libs: improved robustness and accuracy for curveto paths - by using the floating point library together with Mark Wibrow. + + - intersections libs: improved robustness and accuracy for curveto paths + by using the floating point library together with Mark Wibrow. 2014-01-08 Christian Feuersaenger - - fixed bug in latex/plain tex shipout routines for xdvipdfmx and xelatex: - combination of shadings and standalone package failed to work. + - 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 - - Fix for 'rotate around x/y/z' keys which now evaluate - the argument provided. - + - Fix for 'rotate around x/y/z' keys which now evaluate + the argument provided. + 2013-12-25 Christian Feuersaenger - - 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 + - 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 - - Release 3.0.0! + - Release 3.0.0! 2013-12-20 Till Tantau - - 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. - + - 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 - - Fixed a bug in Vertex.lua that returned wrong anchor - positions for non-centered vertices. - + - Fixed a bug in Vertex.lua that returned wrong anchor + positions for non-centered vertices. + 2013-12-13 Till Tantau - - 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. - + - 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 - - intersections lib: ensured that 'name path global' is reset between main paths. + - intersections lib: ensured that 'name path global' is reset between main paths. 2013-11-30 Christian Feuersaenger - - worked on intersections lib (internals only); added O(N) list - append/prepend utilities + - worked on intersections lib (internals only); added O(N) list + append/prepend utilities 2013-11-18 Mark Wibrow - - 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. - + - 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 - - Fixes for 'text effects along path' decoration and docs. + - Fixes for 'text effects along path' decoration and docs. 2013-11-16 Christian Feuersaenger - - 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}) + - 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 - - Finalised 'text effects along path' decoration and docs. - + - Finalised 'text effects along path' decoration and docs. + 2013-11-11 Mark Wibrow - - Changed keyval example (and references to define@key) - in pgfcalendar documentation to pgfkeys stuff. + - Changed keyval example (and references to define@key) + in pgfcalendar documentation to pgfkeys stuff. 2013-11-08 Mark Wibrow - - Minor fixes to decorations.text and math libraries documentation - + - Minor fixes to decorations.text and math libraries documentation + 2013-11-07 Mark Wibrow - - Added 'text effects along path' decoration. + - Added 'text effects along path' decoration. 2013-11-01 Christian Feuersaenger - - Fixed regression/bug in 'name path global'. + - Fixed regression/bug in 'name path global'. 2013-10-31 Till Tantau - - - Applied path for bug #277 "\beforeforegroundpath not working". - + + - Applied path for bug #277 "\beforeforegroundpath not working". + 2013-10-09 Till Tantau - - Prepared manual for new release (fixed overful boxes and - index problems). - + - Prepared manual for new release (fixed overful boxes and + index problems). + 2013-10-08 Mark Wibrow - - Updated math library (minor fixes). + - Updated math library (minor fixes). 2013-10-07 Till Tantau - - - 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. - + + - 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 - - 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 + - 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 - - Fixed problem with math parser inserting extraneous - spaces when parsing \dimenexpr - + - Fixed problem with math parser inserting extraneous + spaces when parsing \dimenexpr + 2013-09-30 Till Tantau - - 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. - + - 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 - - - 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. - + + - 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 - - - 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.) + + - 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 - - Started working on arrow doc. - + - Started working on arrow doc. + 2013-09-20 Mark Wibrow - - Added macro to convert string of digits to comma separated list. - + - Added macro to convert string of digits to comma separated list. + 2013-09-18 Till Tantau - - 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. - + - 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 - - Fixed bug #264: "\pgfkeys /errors/unknown key should (?) expand first argument" - - Fixed bug #268: "`matrix of nodes' isn't working properly any more" - + - 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 - - Corrected typos (bug #266 and bug #265) + - Corrected typos (bug #266 and bug #265) 2013-09-11 Mark Wibrow - - added magnetic tape shape. + - added magnetic tape shape. 2013-09-09 Till Tantau - - 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. - + - 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 - - external lib: fixed bug: file dependency handling was incorrect and - suffered from regression caused by MD5 checks + - external lib: fixed bug: file dependency handling was incorrect and + suffered from regression caused by MD5 checks 2013-08-31 Christian Feuersaenger - - repaired incompatibility with pgfplots <= 1.8: samples key was - evaluated in context of floating point unit and new pgf code relied on dimension - registers. + - 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 - - Added "turn" key. - + - Added "turn" key. + 2013-08-28 Till Tantau - - Added "angle" pic type and "angles" library. - - Patched gd loader code so that it works with context mark IV. - + - Added "angle" pic type and "angles" library. + - Patched gd loader code so that it works with context mark IV. + 2013-08-27 Till Tantau - - 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. - + - 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 - - - fixed bug in fpu: 0^0 and 0^x both produced nan. Now we get - 0^0=1 and 0^x = 0. + + - 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 - - 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. - + - 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 - - Fixed pgf intersection library to ensure that - specialround tokens are processed. + - Fixed pgf intersection library to ensure that + specialround tokens are processed. 2013-08-06 Till Tantau - - Added support for dvisvgm. Quite nice... - + - Added support for dvisvgm. Quite nice... + 2013-08-05 Till Tantau - - 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. + - 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 - - Fixed bug #256 "The special \pgfcoordinate macro doesn't - expand \pgfpictureid." + - Fixed bug #256 "The special \pgfcoordinate macro doesn't + expand \pgfpictureid." 2013-08-04 Christian Feuersaenger - - - external lib: fixed incompatibility of pdflscape with - external lib + + - external lib: fixed incompatibility of pdflscape with + external lib 2013-08-01 Till Tantau - - Fixed a problem with pdf resources of transparency groups in - dvipdfmx. - + - Fixed a problem with pdf resources of transparency groups in + dvipdfmx. + 2013-07-31 Till Tantau - - 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" - + - 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 - - Added "math" library. Could be integrated with calc library. - + - Added "math" library. Could be integrated with calc library. + 2013-07-26 Christian Feuersaenger - - Fixed bug in external lib: mode=list and make did not cope well with - \ref in externalized images. These will be remade now. + - 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 - - 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. - + - 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 - - 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. + - 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 - - - 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) + + - 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 - - 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. + - 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 - - 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" - + - 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 - - - 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 - + + - 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 - - - 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" - + + - 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 - - - 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" - + + - 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 - - - Fixed bug "#250 pgfkyes: .append style and similar undouble # tokens" - - Fixed bug "#143 label changes center of a matrix node" + + - 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 - - - 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" + + - 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 - - - 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". - + + - 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 - - - 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. - + + - 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 - - Fixed bug #116 "Decorations can't be repositioned when - pre/post used." - + - Fixed bug #116 "Decorations can't be repositioned when + pre/post used." + 2013-06-25 Till Tantau - - - 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. - + + - 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 - - - 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. - + + - 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 - - 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." - + - 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 - - - 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 - + + - 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 - - - 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. + + - 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 - - 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. - + - 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 - - - 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 - + + - 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 - - fixed incompatibility of fixltx2e and external lib + - fixed incompatibility of fixltx2e and external lib 2013-02-08 Till Tantau - - - Reworked Storage mechanism of graph drawing system. - - Added phylogenetics library for graph drawing; documentation - still only rudimentary. - + + - Reworked Storage mechanism of graph drawing system. + - Added phylogenetics library for graph drawing; documentation + still only rudimentary. + 2012-12-30 Till Tantau - - - 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. + + - 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 - - - fixed bug in external lib: \tikzexternalgetnextfilename did reset the - value of \tikzsetnextfilename and 'export next' + + - fixed bug in external lib: \tikzexternalgetnextfilename did reset the + value of \tikzsetnextfilename and 'export next' 2012-11-30 Christian Feuersaenger - - updated driver pgfsys-xetex: now, it supports all that the new driver - for dvipdfmx does which includes fadings, functional shadings, and - patterns. + - 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 - - - First complete documentation of the graph drawing - system. (Finally!) - + + - First complete documentation of the graph drawing + system. (Finally!) + 2012-11-27 Till Tantau - - 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. - + - 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 - - Worked on gd documentation. - + - Worked on gd documentation. + 2012-11-21 Till Tantau - - - 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. + + - 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 - - - external lib: fixed spurious white space (caused by 'up to date check') + + - external lib: fixed spurious white space (caused by 'up to date check') 2012-11-01 Christian Feuersaenger - - manual styles: improved robustness of auto cross references & active spaces + - manual styles: improved robustness of auto cross references & active spaces 2012-10-18 Christophe Jorssen - - Fixed a bug with active colon in circuits lib. Probably more to - fix in other libraries. - + - Fixed a bug with active colon in circuits lib. Probably more to + fix in other libraries. + 2012-10-11 Christian Feuersaenger - - Improved precision of math functions asin and acos (using linear - interpolation instead of constant interpolation) + - Improved precision of math functions asin and acos (using linear + interpolation instead of constant interpolation) 2012-09-27 Till Tantau - - Worked on gd. - + - Worked on gd. + 2012-09-26 Christian Feuersaenger - - fixed pgfsys-pdftex.def : very old regression with \setbeamercovered{transparent} and \pause - Patch by Hendrik Vogt + - fixed pgfsys-pdftex.def : very old regression with \setbeamercovered{transparent} and \pause + Patch by Hendrik Vogt 2012-08-29 Till Tantau - - Added support for sublayouts in gd (not yet fully - documented). This allows one to use several algorithms inside - a single graph. - + - 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 - - - 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!). - + + - 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 - - - Redone handling of clusters in gd. - - Worked on gd documentation. + + - Redone handling of clusters in gd. + - Worked on gd documentation. 2012-06-18 Christian Feuersaenger - - fixed minor expansion issue \foreach \x in {a,...,d} lead to unexpanded value \x - + - fixed minor expansion issue \foreach \x in {a,...,d} lead to unexpanded value \x + 2012-06-18 Christian Feuersaenger - - externalization: added special switch to deactivate incompatible - geometry drivers during externalization + - externalization: added special switch to deactivate incompatible + geometry drivers during externalization 2012-05-31 Till Tantau - - - Redone pgf.gd.model.Arc - - Added documentation for said class. - + + - Redone pgf.gd.model.Arc + - Added documentation for said class. + 2012-05-23 Till Tantau - - Worked on gd documentation. - - Replaced old luadoc by customized version. Gets called - directly from tex. - + - Worked on gd documentation. + - Replaced old luadoc by customized version. Gets called + directly from tex. + 2012-05-17 Christian Feuersaenger - - - 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. + + - 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 - - Fix bug #3527068 (\pgfmathatantwo did not exist) + - Fix bug #3527068 (\pgfmathatantwo did not exist) 2012-05-14 Till Tantau - - 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". + - 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 - - context: fixed catcode issues by means of suitable module - \protect/\unprotect statements. + - context: fixed catcode issues by means of suitable module + \protect/\unprotect statements. 2012-05-06 Till Tantau - - 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. + - 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 - - Attempt to fix bug in calc lib when '!' or ':' are active (not - fully tested but should work). + - Attempt to fix bug in calc lib when '!' or ':' are active (not + fully tested but should work). 2012-05-02 Christophe Jorssen - - Attempt to fix bug with label and pin when ':' is active (not - fully tested but should work). + - Attempt to fix bug with label and pin when ':' is active (not + fully tested but should work). 2012-04-19 Till Tantau - - 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. - + - 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 - - 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. - + - 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 - - Implemented packing procedure for graph drawing. - - Cleaned up graph drawing source some more. - - Renamed lots of files (still not happy with it, though). + - 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 - - Implemented Reingold-Tilford tree layout. + - Implemented Reingold-Tilford tree layout. 2012-04-05 Till Tantau - - Implemented my first graph drawing algorithm: circular layout. + - Implemented my first graph drawing algorithm: circular layout. 2012-04-03 Till Tantau - - Introduced new declaration mechanism for graph drawing - algorithm classes - - Implemented preprocessing step of decomposing a graph into - connected components. - + - Introduced new declaration mechanism for graph drawing + algorithm classes + - Implemented preprocessing step of decomposing a graph into + connected components. + 2012-04-02 Till Tantau - - 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. + - 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 - - 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). - + - 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 - - Added anchoring and orientation to graph drawing library. - + - Added anchoring and orientation to graph drawing library. + 2012-03-21 Till Tantau - - Added arrows.spaced library. - - Added quotation syntax to graph lib. - - Renamed some graph drawing layouts. - - Worked on documentation of graph drawing lib. + - 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 - - 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. + - 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 - - Fixed wrong edef in graph lib that broke the /-syntax when - text contained expandable stuff. - + - Fixed wrong edef in graph lib that broke the /-syntax when + text contained expandable stuff. + 2012-02-21 Christophe Jorssen - - More work on the luamath parser and evaluator. + - More work on the luamath parser and evaluator. 2012-01-24 Christophe Jorssen - - 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. + - 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 - - Fix a bug in pgfmath != operator (reported and fixed on tex.se - http://tex.stackexchange.com/questions/40605/using-in-pgfmathparse) + - 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 - - Fix a pgfmath dependency for pgffor. + - Fix a pgfmath dependency for pgffor. 2012-01-03 Till Tantau - - 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. + - 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 - - Added the 'fixed relative' number formatting style. + - Added the 'fixed relative' number formatting style. 2011-12-28 Christian Feuersaenger - - - Added 'const plot mark mid' and 'jump mark mid' plot handlers. + + - Added 'const plot mark mid' and 'jump mark mid' plot handlers. 2011-12-02 Till Tantau - - Renamed "layered drawing" to "layered layout" for - consistency. + - Renamed "layered drawing" to "layered layout" for + consistency. 2011-11-12 Christophe Jorssen - - 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 + - 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 - - Work on the lua math parser and evaluator. Begin to merge Mark's - code with mine. + - Work on the lua math parser and evaluator. Begin to merge Mark's + code with mine. 2011-11-03 Christian Feuersaenger - - - added FPU support for ==, !=, <=, >=, ? + + - added FPU support for ==, !=, <=, >=, ? 2011-10-29 Christian Feuersaenger - - fixed problem with pgf number printer: it introduced spurious spaces - tracker id 3430171. Thanks to Clemens Koppensteiner for the bugfix. + - 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 - - \pgfsetlayers can now be given inside of a pgfpicture (or tikzpicture) + - \pgfsetlayers can now be given inside of a pgfpicture (or tikzpicture) 2011-06-22 Christophe Jorssen - - The lua math parser now works on basic expressions (no units, no - arrays, no strings, no functions, ...?). + - The lua math parser now works on basic expressions (no units, no + arrays, no strings, no functions, ...?). 2011-06-02 Christophe Jorssen - - Some work on a lua (lpeg based) math parser. + - Some work on a lua (lpeg based) math parser. 2011-05-31 Christophe Jorssen - - Added a gnuplot call key to pgfmoduleplot.code.tex (feature - request #3308340). + - Added a gnuplot call key to pgfmoduleplot.code.tex (feature + request #3308340). 2011-05-30 Jannis Pohlmann - - graph drawing: - - Initial work on layered drawing algorithms. + - graph drawing: + - Initial work on layered drawing algorithms. 2011-05-25 Christophe Jorssen - - Added dim function for array to pgfmath (to be documented) - - Some work on a ODE solver - + - Added dim function for array to pgfmath (to be documented) + - Some work on a ODE solver + 2011-05-20 Christian Feuersaenger - - removed spurious white spaces in my bugfix for pgfmathdivide + - removed spurious white spaces in my bugfix for pgfmathdivide 2011-05-19 Till Tantau - - Second attempt at fixing spy lib... + - Second attempt at fixing spy lib... 2011-05-18 Matthias Schulz - - graph drawing: - - added short overview for nodes and edges (lua class documentation) + - graph drawing: + - added short overview for nodes and edges (lua class documentation) 2011-05-17 Jannis Pohlmann - - 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. + - 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 - - 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. + - 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 - - Fixed bug 3297817 (spy postscript problem). - - Fixed bug of missing newpath in postscript and opacity - settings. - + - Fixed bug 3297817 (spy postscript problem). + - Fixed bug of missing newpath in postscript and opacity + settings. + 2011-05-13 Jannis Pohlmann - - 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. + - 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 - - 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. + - 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 - - graph drawing: - - Fix several interpolation bugs in the coarse graph class. - - Use the coarse graph class in the Walshaw2000 algorithm. + - 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 - - Worked on documentation of gd backend. Still need to - document graph parameters. - + - Worked on documentation of gd backend. Still need to + document graph parameters. + 2011-05-10 Jannis Pohlmann - - graph drawing: - - Remove files from the old graph drawing library tree. - - Disable verbose logging by default. - - Specify sane initial values for spring algorithm parameters. + - 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 - - Added .graph drawing parameter initial key. + - Added .graph drawing parameter initial key. 2011-05-09 Jannis Pohlmann - - graph drawing: - - Implement graph coarsening in the Hu2006 algorithm. - - Name force-based algorithms after the paper author and year. + - graph drawing: + - Implement graph coarsening in the Hu2006 algorithm. + - Name force-based algorithms after the paper author and year. 2011-05-09 Till Tantau - - Reorganized graph drawing documentation. + - Reorganized graph drawing documentation. 2011-05-06 Jannis Pohlmann - - Finished the graph drawing library reorganization started by Till. + - Finished the graph drawing library reorganization started by Till. 2011-05-06 Till Tantau - - 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. - + - 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 - - 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). + - 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 - - 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. + - 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 - - graph drawing: Started to cleanup pgf and tikz layers. Ongoing... + - graph drawing: Started to cleanup pgf and tikz layers. Ongoing... 2011-05-03 Jannis Pohlmann - - graph drawing: - - Fix Walshaw algorithm to properly set the subnodes when copying - the coarse graphs. Simplify the code that updates the node - coordinates. + - 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 - - 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. + - 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 - - fpu: added support for log10 and log2 + - fpu: added support for log10 and log2 2011-05-02 Jannis Pohlmann - - 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(). + - 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 - - 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. + - 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 - - number printing: added '1000 sep in fractionals' switch + - number printing: added '1000 sep in fractionals' switch 2011-04-29 Christophe Jorssen - - Work on pgflibraryluamath (added pgfpointnormalised) + - Work on pgflibraryluamath (added pgfpointnormalised) 2011-04-27 Matthias Schulz - - Graphdrawing library documentation, split into two files, removed - noluatex file, reworked the text (added information). + - Graphdrawing library documentation, split into two files, removed + noluatex file, reworked the text (added information). 2011-04-25 Christophe Jorssen - - First attempt to do math with lua (very basical): pgflibraryluamath + - First attempt to do math with lua (very basical): pgflibraryluamath 2011-04-18 Christian Feuersaenger - - 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) + - 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 - - Implemented a G_n subgraph for creating grid (or: mesh) graphs. - This also introduces a new key /tikz/graphs/wrap after= 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. + - Implemented a G_n subgraph for creating grid (or: mesh) graphs. + This also introduces a new key /tikz/graphs/wrap after= 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 - - - external lib: reduced number of \newwrite allocations and allowed to disable features - to safe more of them (aux in dpth=false,disable dependency files) + + - 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 - - - added '/pgf/number format/relative' formatting style. + + - added '/pgf/number format/relative' formatting style. 2011-03-22 Till Tantau - - Finished documentation of data visualization (sort of)! - - First usable version of data visualization! + - Finished documentation of data visualization (sort of)! + - First usable version of data visualization! 2011-03-15 Till Tantau - - Worked on dv documentation. Finished chapter on visualizers, - style sheets. Legends still missing + - Worked on dv documentation. Finished chapter on visualizers, + style sheets. Legends still missing 2011-03-07 Till Tantau - - Worked on dv documentation. Finished chapter on axes. + - Worked on dv documentation. Finished chapter on axes. 2011-03-07 Christian Feuersaenger - - - 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. + + - 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 - - Worked on dv documentation. - + - Worked on dv documentation. + 2011-01-05 Christophe Jorssen - - Attempt to fix a bug #1911195 with pgfpages and rotation (fix - contributed by Mark Wibrow). Note: Mark was not sure it has side - effects. + - 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 - - 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. + - 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 - - Changed the graph syntax for anonymous nodes in the graph - library and simplified the as= syntax. - - Added fresh nodes options to graph library. + - 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 - - Fixed graph lib so that it compiles with plain TeX. + - Fixed graph lib so that it compiles with plain TeX. 2010-12-10 Till Tantau - - Small fixed in the graph library. + - Small fixed in the graph library. 2010-12-07 Till Tantau - - Finished graph library! + - Finished graph library! 2010-12-06 Till Tantau - - Nearly finished graph lib and its documentation. + - Nearly finished graph lib and its documentation. 2010-11-30 Till Tantau - - Fixed bug #3123605 (hopefully...). - - Worked on graph lib. + - Fixed bug #3123605 (hopefully...). + - Worked on graph lib. 2010-11-19 Christophe Jorssen - - Some integer arithmetics functions for the math parser - (contributed by Alain Matthes): gcd, isprime, isodd, iseven + - Some integer arithmetics functions for the math parser + (contributed by Alain Matthes): gcd, isprime, isodd, iseven 2010-11-19 Till Tantau - - 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. + - 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 - - A luatex version of the doc is available (fixed inputenc issues - since luatex works with utf8 by default). + - A luatex version of the doc is available (fixed inputenc issues + since luatex works with utf8 by default). 2010-11-04 Christophe Jorssen - - 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). + - 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 - - 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) - + - 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 - - fixed bug 3096333 (Fix contributed by Mark Wibrow): pgffor - failed to update \lastx in some cases - + - fixed bug 3096333 (Fix contributed by Mark Wibrow): pgffor + failed to update \lastx in some cases + 2010-10-25 Christian Feuersaenger - Released version 2.10 + Released version 2.10 2010-10-22 Christian Feuersaenger - - closed a lot of bugs on sourceforge, especially documentation bugs - - fixed bug 2429749: gnuplot invocation in tabularx did not work. + - 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 - - fixed bug: there was an incompatibility between pgf and beamer due to a - missing \interlineskip in the shipout handling for latex. + - 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 - - renamed 'halfcircle' marker to 'halfcircle*' and added 'halfcircle'. - - provided special case 'mark color=none' for the half-filled markers. + - renamed 'halfcircle' marker to 'halfcircle*' and added 'halfcircle'. + - provided special case 'mark color=none' for the half-filled markers. 2010-10-13 Christian Feuersaenger - - 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. + - 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 - - Imported spell checking results of Stefan Pinnow (thanks!) - - Dealed with typo in 'sci generic' number formatting style: it now - accepts 'mantissa' *and* 'mantisse' + - 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 - - - External lib: Fixed bug. The 'failed ref warnings for' was not properly \protect'ed. + + - External lib: Fixed bug. The 'failed ref warnings for' was not properly \protect'ed. 2010-09-27 Till Tantau - - Started on graph lib. Not yet finished and not documented. - + - Started on graph lib. Not yet finished and not documented. + 2010-09-21 Christian Feuersaenger - - Added plot markers of Magnus Tewes and Tomek: halfcircle, halfsquare*, - halfsquare left*, halfsquare right*, heart + - Added plot markers of Magnus Tewes and Tomek: halfcircle, halfsquare*, + halfsquare left*, halfsquare right*, heart 2010-09-08 Till Tantau - - Added \pgfpositionnodelater and \pgfpositionnodenow - commands. - + - Added \pgfpositionnodelater and \pgfpositionnodenow + commands. + 2010-08-31 Christian Feuersaenger - - externalization+\ref: fixed a bug + - externalization+\ref: fixed a bug 2010-08-30 Christian Feuersaenger - - external lib: documented how to generate .png graphics and added support - switches. + - external lib: documented how to generate .png graphics and added support + switches. 2010-08-26 Christian Feuersaenger - - added 'baseline=default', 'trim left=default' and 'trim right=default' choices to reset these keys. + - added 'baseline=default', 'trim left=default' and 'trim right=default' choices to reset these keys. 2010-08-25 Christian Feuersaenger - - added support to provide paragraphs in "pin" arguments + - added support to provide paragraphs in "pin" arguments 2010-08-24 Till Tantau - - Worked on data visualization and its documentation. + - Worked on data visualization and its documentation. 2010-08-23 Christian Feuersaenger - - - 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 - - ConTeXt support: fixed loading problem of calendar lib + + - 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 + - ConTeXt support: fixed loading problem of calendar lib 2010-08-18 Christian Feuersaenger - - 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 + - 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 - - - basic level image externalization: added '/pgf/images/trim external={}{}{}{}' - 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. + + - basic level image externalization: added '/pgf/images/trim external={}{}{}{}' + 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 - - external lib: documented how to solve compatibility problems with - \tikzifexternalizing + - external lib: documented how to solve compatibility problems with + \tikzifexternalizing 2010-08-11 Christian Feuersaenger - - - added \deferredanchor feature contributed by Christophe Jorssen + + - added \deferredanchor feature contributed by Christophe Jorssen 2010-08-03 Christian Feuersaenger - - added optimized and numerically stable arc path command - \pgfpatharctoprecomputed which interpolates start- and end points - + - added optimized and numerically stable arc path command + \pgfpatharctoprecomputed which interpolates start- and end points + 2010-07-10 Christian Feuersaenger - - - external lib: fixed incompatibility with 2010/06/08 v2.0b eso-pic package + + - external lib: fixed incompatibility with 2010/06/08 v2.0b eso-pic package 2010-07-06 Christian Feuersaenger - - external lib: added sanity checking for failed \ref,\pageref,\cite commands in external images. + - external lib: added sanity checking for failed \ref,\pageref,\cite commands in external images. 2010-07-01 Christian Feuersaenger - - - math parser: improved error messages by providing the complete math expression. + + - math parser: improved error messages by providing the complete math expression. 2010-06-30 Christian Feuersaenger - - - added 'trim left' and 'trim right' features to simplify bounding box - modifications and allow support for restricted bounding boxes and image - externalization. + + - 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 - - - pgfutil-latex.def: changed \usepackage to \RequirePackage (thanks to Christophe Jorssen) - - external lib: added \tikzappendtofigurename{} shortcut for '\tikzset{external/figure name/.add={}{suffix}}' + + - 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 - - - external lib: added warning at end of document if not all graphics have - been found. + + - external lib: added warning at end of document if not all graphics have + been found. 2010-06-10 Christian Feuersaenger - - - 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. + + - 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 - - added \tikzifinpicture{}{} macro + - added \tikzifinpicture{}{} macro 2010-05-31 Till Tantau - - Worked on data visualization. + - Worked on data visualization. 2010-05-30 Till Tantau - - Added .list key handler. + - Added .list key handler. 2010-05-26 Till Tantau - - Worked on data visualization. - + - Worked on data visualization. + 2010-05-06 Christian Feuersaenger - - improved sanity checking in number printer: now, the zero flag is - checked even if its exponent > 0 + - improved sanity checking in number printer: now, the zero flag is + checked even if its exponent > 0 2010-04-22 Christian Feuersaenger - - floatparsenumber: number format errors after exponents now contain the offending - character instead of '\relax' + - floatparsenumber: number format errors after exponents now contain the offending + character instead of '\relax' 2010-04-12 Christian Feuersaenger - - number printer: added 'frac denom' and 'frac whole' for fine tuning of - fractional number printing. + - number printer: added 'frac denom' and 'frac whole' for fine tuning of + fractional number printing. 2010-04-10 Christian Feuersaenger - - number printer: made \protect portable across TeX variants (doesn't - produce bugs with context anymore) - - fpu: optimized \pgfmathfloatgetflagstomacro + - number printer: made \protect portable across TeX variants (doesn't + produce bugs with context anymore) + - fpu: optimized \pgfmathfloatgetflagstomacro 2010-04-09 Christian Feuersaenger - - added \pgfresetboundingbox - - added \pgfgetlastxy coordinate macro - - added '/pgf/images/include external/' code key. + - added \pgfresetboundingbox + - added \pgfgetlastxy coordinate macro + - added '/pgf/images/include external/' code key. 2010-04-08 Christian Feuersaenger - - fpu: added convenience method \pgfmathfloattoint + - fpu: added convenience method \pgfmathfloattoint 2010-03-31 Christian Feuersaenger - - number printer: added 'frac' style to automatically create fractionals. + - number printer: added 'frac' style to automatically create fractionals. 2010-03-25 Christian Feuersaenger - - splitted basic level file pgfcoreimage.code.tex: there is now a - pgfcoreexternal.code.tex file. + - splitted basic level file pgfcoreimage.code.tex: there is now a + pgfcoreexternal.code.tex file. 2010-03-24 Christian Feuersaenger - - \pgfmathprintnumber is no longer a "fragile" command (it is \protect'ed - automatically in LaTeX). + - \pgfmathprintnumber is no longer a "fragile" command (it is \protect'ed + automatically in LaTeX). 2010-03-23 Till Tantau - - Fixed baseline alignment with "text width" option in LaTeX. + - Fixed baseline alignment with "text width" option in LaTeX. 2010-03-23 Mark Wibrow - - 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. - + - 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 - - 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. + - 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 - - 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 + - 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 - - 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. + - 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 - - external lib: partially fixed incompatibility with glossary package and - documented work-around + - external lib: partially fixed incompatibility with glossary package and + documented work-around 2010-03-05 Christian Feuersaenger - - FPU: added \pgfmathfloatifapproxequalrel - - number printing: added style to configure |sci precision| - - number printing: added style to configure |std=:| + - FPU: added \pgfmathfloatifapproxequalrel + - number printing: added style to configure |sci precision| + - number printing: added style to configure |std=:| 2010-03-03 Christian Feuersaenger - - - external lib: the argument from \tikzexternalize is - now optional. It can be deduced automatically if it is missing. + + - external lib: the argument from \tikzexternalize is + now optional. It can be deduced automatically if it is missing. 2010-02-18 Christian Feuersaenger - - 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. + - 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 - - 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. + - 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 - - Added \ifpgfexternalreadmainaux switch. Will be used to avoid buffering - problems during externalization mode 'convert with system call'. + - Added \ifpgfexternalreadmainaux switch. Will be used to avoid buffering + problems during externalization mode 'convert with system call'. 2010-02-16 Till Tantau - - Fixed bug "papersize not supported by pgfsys-xetex.def - ID: 2934982" + - Fixed bug "papersize not supported by pgfsys-xetex.def - ID: 2934982" 2010-02-09 Christian Feuersaenger - - Improved automatic cross referencing: auto key path prefixing failed for - spaces in key paths. + - Improved automatic cross referencing: auto key path prefixing failed for + spaces in key paths. 2010-02-08 Till Tantau - - Added "on background layer" key to backgrounds lib. + - Added "on background layer" key to backgrounds lib. 2010-02-02 Christian Feuersaenger - - added \pgfmathifisint - - supported \nofiles in auto xref generation + - added \pgfmathifisint + - supported \nofiles in auto xref generation 2010-02-01 Christian Feuersaenger - - - 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) + + - 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 - - 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 + - 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 - - 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). + - 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 - - external lib: added support for file dependencies. - For mode=list and make, any file dependencies configured with - \tikzpicturedependsonfile{} will be checked by the generated - makefile. + - external lib: added support for file dependencies. + For mode=list and make, any file dependencies configured with + \tikzpicturedependsonfile{} will be checked by the generated + makefile. 2010-01-16 Christian Feuersaenger - - 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). + - 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 - - profiler library can now profile macros with arbitrary argument pattern - and is more rebust with respect to save stack usage + - 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 - - worked on profiler library and added docs for it. + - worked on profiler library and added docs for it. 2010-01-10 Christian Feuersaenger - - added first draft of the pgf 'profiler' library + - added first draft of the pgf 'profiler' library 2010-01-07 Mark Wibrow - - Fix for rounded corners affecting custom fills in rectangle - split shape. + - Fix for rounded corners affecting custom fills in rectangle + split shape. 2009-12-29 Christian Feuersaenger - - 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). + - 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 - - 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 + - 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 - - external lib: improved the tikzexternal.sty package which can be used - without pgf installed. + - external lib: improved the tikzexternal.sty package which can be used + without pgf installed. 2009-12-04 Till Tantau - - added spy library. - + - added spy library. + 2009-12-02 Christian Feuersaenger - - - imported a patch of Andy Schlaikjer which extends the 'plot gnuplot' - feature to read the ``unbounded point'' information provided by gnuplot. + + - 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 - - added \r@pgf@reada temporary \openin register for compatibility with - other packages + - added \r@pgf@reada temporary \openin register for compatibility with + other packages 2009-11-19 Christian Feuersaenger - - fixed an auto xref bug which wrote '\pgfkeys{}' although the manual - contained |\pgfkeys|. + - fixed an auto xref bug which wrote '\pgfkeys{}' although the manual + contained |\pgfkeys|. 2009-11-18 Christian Feuersaenger - - 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 + - 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 - - 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 ""' by 'set table ""' - to maintain compatibility with the new gnuplot version. + - 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 ""' by 'set table ""' + to maintain compatibility with the new gnuplot version. 2009-11-14 Christian Feuersaenger - - 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 + - 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 - - Added the 'small mindmap' style. + - Added the 'small mindmap' style. 2009-11-06 Christian Feuersaenger - - FPU: improved sanity checks and exception handling for the decompose - routines (pgfmathfloatgetexponent etc) and the number parser. - Added exception 'wrong lowlevel format'. + - 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 - - 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. + - 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 - - - improved error recovery of external lib. + + - improved error recovery of external lib. 2009-10-16 Christian Feuersaenger - - temporarily disabled the auto cross references -- it seems they compile - only with increased memory. + - temporarily disabled the auto cross references -- it seems they compile + only with increased memory. 2009-10-15 Christian Feuersaenger - - 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. + - 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 - - 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 + - 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 - - Defined \pgfdeclaregenericanchor to allow anchors which get the shape - name as argument. Only useful internally. + - Defined \pgfdeclaregenericanchor to allow anchors which get the shape + name as argument. Only useful internally. 2009-09-15 Christian Feuersaenger - - Fixed buggy treatment of white spaces in \jobname and 'plot function' - using \pgfutilpreparefilename. + - Fixed buggy treatment of white spaces in \jobname and 'plot function' + using \pgfutilpreparefilename. 2009-09-04 Till Tantau - - 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. + - 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 - - external lib: added 'mode=list and make'. Now, image externalisation - time can be reduced with 'make -j 2 -f mainfile.makefile'. + - 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 - - external lib: fixed treatment of long arguments in \tikz ... ; shortcut - command. + - external lib: fixed treatment of long arguments in \tikz ... ; shortcut + command. 2009-06-30 Christian Feuersaenger - - fixed white space bug in \pgfkeysdeactivatefamily - - added \pgfmathfloatvalueof + - fixed white space bug in \pgfkeysdeactivatefamily + - added \pgfmathfloatvalueof 2009-06-22 Christian Feuersaenger - - added a '*' feature to '\pgfmathdeclarefunction' which overwrites - existing functions. + - added a '*' feature to '\pgfmathdeclarefunction' which overwrites + existing functions. 2009-06-11 Christian Feuersaenger - - added '/tikz/no marks' key. - - fixed typo in external lib documentation: the key is called 'figure name', - not 'file name' + - 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 - - - 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 + + - 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 - - provided two new aliases for key filters, added \pgfkeyssetfamily. + - provided two new aliases for key filters, added \pgfkeyssetfamily. 2009-05-29 Christian Feuersaenger - - allowed numbers like '.9' in fpu. + - allowed numbers like '.9' in fpu. 2009-02-29 Mark Wibrow - - Fix for signal shape. + - Fix for signal shape. 2009-05-22 Jin-Hwan Cho - - Applied the patches for dvipdfmx driver, - pgf-doc-diff.version2cvs (2009-04-18) and - pgf-generic-diff.version2cvs (2009-04-19). + - 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 - - Restored processing of unknown keys in the predefined key filters 'and', - 'not', 'or' and 'false': it was not improvement... + - Restored processing of unknown keys in the predefined key filters 'and', + 'not', 'or' and 'false': it was not improvement... 2009-05-17 Christian Feuersaenger - - fixed the sequence of arguments of - \pgfqkeysactivatefamiliesandfilteroptions and - \pgfqkeysactivatesinglefamilyandfilteroptions - in the reference manual. + - fixed the sequence of arguments of + \pgfqkeysactivatefamiliesandfilteroptions and + \pgfqkeysactivatesinglefamilyandfilteroptions + in the reference manual. 2009-05-16 Christian Feuersaenger - - 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. + - 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 - - provided API function \pgfmathfloatifflags to simplify special cases in - FPU. + - provided API function \pgfmathfloatifflags to simplify special cases in + FPU. 2009-04-23 Christian Feuersaenger - - added (primitive) veclen implementation for FPU. - - added cosh, sinh, tanh to FPU + - added (primitive) veclen implementation for FPU. + - added cosh, sinh, tanh to FPU 2009-04-21 Christian Feuersaenger - - fixed bug in external lib: empty lines in tikzpicture environments were not accepted - for some operating modes. + - fixed bug in external lib: empty lines in tikzpicture environments were not accepted + for some operating modes. 2009-04-18 Christian Feuersaenger - - added \pgfqpointscale + - added \pgfqpointscale 2009-04-08 Christian Feuersaenger - - added an optional argument count to 'optimize command away' in external - library. + - added an optional argument count to 'optimize command away' in external + library. 2009-04-03 Christian Feuersaenger - - added the |figure name| key to the externalization library - - improved docs for externalization library + - added the |figure name| key to the externalization library + - improved docs for externalization library 2009-03-30 Christian Feuersaenger - - 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) + - 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 - - Replaced \z@ by 0pt for context. + - Replaced \z@ by 0pt for context. 2009-03-21 Christian Feuersaenger - - external library: fixed the 'optimize' feature: pictures which won't be - exported could not be optimized away (although they should) + - 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 - - Replaced \toks@ and \voidb@x by \pgfutil@toks@ and - \pgfutil@voidb@x. + - Replaced \toks@ and \voidb@x by \pgfutil@toks@ and + \pgfutil@voidb@x. 2009-03-14 Christian Feuersaenger - - improved docs for .search also. - - fixed initial value for 'domain' such that it really uses the default - samples=25. - + - improved docs for .search also. + - fixed initial value for 'domain' such that it really uses the default + samples=25. + 2009-03-09 Till Tantau - - Added patch for context color support in luatex. + - Added patch for context color support in luatex. 2009-02-26 Christian Feuersaenger - - improved the optimization facilities of the external library: - |optimize=false| will now properly restore any optimized material - when used in \tikzset - + - 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 - - 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' + - 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 - - added |\pgfkeyssetdefaultpathforhandled| feature as improvement for - multiple key paths to pgfkeys. Reference documentation and an - application example is in the manual. + - 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 - - added 'mark=text' which draws arbitrary TeX content as plot marks to - plot mark library. + - added 'mark=text' which draws arbitrary TeX content as plot marks to + plot mark library. 2009-02-06 Mark Wibrow - - Added key 'define function' to define simple local functions. + - Added key 'define function' to define simple local functions. 2009-02-04 Till Tantau - - Worked on dv stuff. - + - Worked on dv stuff. + 2009-02-01 Mark Wibrow - - 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. + - 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 - - the FPU deactivation command is now assembled once and for all during - its first usage. + - the FPU deactivation command is now assembled once and for all during + its first usage. 2009-01-23 Till Tantau - - 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... + - 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 - - fixed fpu 'round' method - it rounded mantissas instead of the complete - number before. + - fixed fpu 'round' method - it rounded mantissas instead of the complete + number before. 2009-01-22 Till Tantau - - 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. + - 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 - - Added tutorial for mind/lecture maps. + - Added tutorial for mind/lecture maps. 2009-01-06 Christian Feuersaenger - - implemented fpu factorial - - if the fixed point library is activated, the fpu will be deactivated - automatically. - - added draft for FPU documentation + - 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 - - - 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. + + - 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 - - 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. + - 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 - - added further functions to fpu; improved sanity checking; fixed smaller - bugs related to fpu + - added further functions to fpu; improved sanity checking; fixed smaller + bugs related to fpu 2008-12-29 Christian Feuersaenger - - 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. + - 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 - - added trigonometric functions to floating point unit. + - added trigonometric functions to floating point unit. 2008-12-17 Till Tantau - - Added \colorlet to ConTeXt stuff. + - Added \colorlet to ConTeXt stuff. 2008-12-14 Till Tantau - - Worked some more on data visualization stuff. Still in - pre-alpha. + - Worked some more on data visualization stuff. Still in + pre-alpha. 2008-12-11 Christian Feuersaenger - - added \pgfmathfloatexp. + - added \pgfmathfloatexp. 2008-12-07 Christian Feuersaenger - - floating point macros now always use the basic pgf math methods for - mantisse computations, even if the fixed point library is active. + - 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 - - '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). + - '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 - - 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. + - 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 - - 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. + - 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 - - 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. + - 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 - - - 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). + + - 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 - - Fixed \pgfnodealias bug that caused chains to fail in matrices. + - Fixed \pgfnodealias bug that caused chains to fail in matrices. 2008-10-30 Till Tantau - - Added shading library, mainly containing the new color wheel - shading donated by Ken Starks. + - Added shading library, mainly containing the new color wheel + shading donated by Ken Starks. 2008-10-27 Mark Wibrow - - More fixes for insertion of spaces. + - More fixes for insertion of spaces. 2008-10-27 Till Tantau - - Added square arrow send by - gvtjongahung@users.sourceforge.net. - - Changed pgfutil-context.def so that driver detection should - work once more. + - 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 - - Fixed insertion of space when parsing exponents. + - Fixed insertion of space when parsing exponents. 2008-10-23 Christian Feuersaenger - - added int truncation to floating point unit. + - added int truncation to floating point unit. 2008-10-22 Christian Feuersaenger - - added abs, abserror and relerror to floating point unit. + - added abs, abserror and relerror to floating point unit. 2008-10-21 Christian Feuersaenger - - added sqrt for floating point unit, built on top of pgfmathsqrt. + - added sqrt for floating point unit, built on top of pgfmathsqrt. 2008-10-09 Till Tantau - - 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. + - 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 - - Fixed rounded rectangle right arc bug. + - Fixed rounded rectangle right arc bug. 2008-10-06 Christian Feuersaenger - - Fixed missing treatment of 'assume math mode' in \pgfmathprintnumber' + - Fixed missing treatment of 'assume math mode' in \pgfmathprintnumber' 2008-10-05 Till Tantau - - Fixed missing switching off of auto anchors in positioning - library. + - Fixed missing switching off of auto anchors in positioning + library. 2008-10-01 Till Tantau - - Fixed matrix/pdfsync incompatibility. + - Fixed matrix/pdfsync incompatibility. 2008-09-30 Mark Wibrow - - Fixed some parsing bugs with arrays. - - Fix for parsing of arrays in TikZ coordinates. + - Fixed some parsing bugs with arrays. + - Fix for parsing of arrays in TikZ coordinates. 2008-09-25 Christian Feuersaenger - - Added number formatting option 'min exponent for 1000 sep'. + - Added number formatting option 'min exponent for 1000 sep'. 2008-09-21 Mark Wibrow - - Fixed bug in math parser which inserted spaces into text - or picture. + - Fixed bug in math parser which inserted spaces into text + or picture. 2008-09-17 Christian Feuersaenger - - added number formatting style 'sci superscript' - Example: formats the number 42 as 4.2^1 instead of 4.2 \cdot 10^1 + - 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 - - Fixed bug "TikZ, the shadow library and ConTeXt MKIV - (LuaTeX)". - + - Fixed bug "TikZ, the shadow library and ConTeXt MKIV + (LuaTeX)". + 2008-09-14 Mark Wibrow - - Fixed bug #2105132 for rounded rectangle. - - Fixed bug #2044129 for chamfered rectangle. - + - Fixed bug #2105132 for rounded rectangle. + - Fixed bug #2044129 for chamfered rectangle. + 2008-09-12 Mark Wibrow - - Added \pgfpathcurvebetweentime. + - Added \pgfpathcurvebetweentime. 2008-09-10 Till Tantau - - 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. + - 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 - - 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); + - 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 - - fixed small bug related to '@dec sep mark' and not-a-number in number - formatting routines. + - fixed small bug related to '@dec sep mark' and not-a-number in number + formatting routines. 2008-09-03 Mark Wibrow - - Solutions for path intersections can now be sorted along either path. - - \pgfintersectionsolutions is now a macro, not a count register. + - 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 - - - fix for ``Missing character...' warnings in logfile when using - foreach. - - removed `trim integers' option from foreach as int function - can now be used. + + - 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 - - 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. + - 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 - - added '/tikz/external/export={true,false}' key for externalization - library. + - added '/tikz/external/export={true,false}' key for externalization + library. 2008-08-05 Christian Feuersaenger - - added documentation for basic layer externalization and baseline option. + - added documentation for basic layer externalization and baseline option. 2008-07-28 Christian Feuersaenger - - added 'showpos' key to number printing (and alias 'print sign'). + - added 'showpos' key to number printing (and alias 'print sign'). 2008-07-22 Christian Feuersaenger - - 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). + - 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 - - Fixed bug in system layer path collecting. Very long paths - are now processed more efficiently (the bug disabled an optimization). + - 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 - - 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. + - 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 - - 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.}; + - 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 - - added \pgfqpointxy and \pgfqpointxyz to complement the "quick" point - commands in basic layer. + - added \pgfqpointxy and \pgfqpointxyz to complement the "quick" point + commands in basic layer. 2008-07-09 Christian Feuersaenger - - added 'every mark' style. - - 'mark options' simply overwrites 'every mark' (consistent with its old - definition) + - added 'every mark' style. + - 'mark options' simply overwrites 'every mark' (consistent with its old + definition) 2008-07-07 Till Tantau - - Finished circuit library and documentation (well, some - shapes still missing, but that's something users should - contribute). + - Finished circuit library and documentation (well, some + shapes still missing, but that's something users should + contribute). 2008-07-01 Christian Feuersaenger - - 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. + - 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 - - 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". + - 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 - - Minor changes on float stuff, wrote pgfmathfloatmultiply and - pgfmathfloatdivide on top of pgfmathmultiply and pgfmathdivide + - Minor changes on float stuff, wrote pgfmathfloatmultiply and + pgfmathfloatdivide on top of pgfmathmultiply and pgfmathdivide 2008-06-29 Mark Wibrow - - 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. + - 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 - - Complete change of TikZ intersections (PGF unchanged). - - Slight hack of the TikZ scopes library to permit local - path naming. Should work... + - 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 - - Continued with circuit library. - - Introduced subdirectories inside the pgf library - directory and moved libs into them. - You may need to update your checkout. + - 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 - - The external library now typesets as horizontal material by issueing - \leavevmode. This fixes an inconsistency with the normal tikzpictures. + - The external library now typesets as horizontal material by issueing + \leavevmode. This fixes an inconsistency with the normal tikzpictures. 2008-06-25 Mark Wibrow - - Added intersection library + documentation for - intersecting ``named'' paths. + - Added intersection library + documentation for + intersecting ``named'' paths. 2008-06-25 Christian Feuersaenger - - Fixed bug in external library. Now, strings like '#1' occuring - somewhere in an image is collected correctly. + - Fixed bug in external library. Now, strings like '#1' occuring + somewhere in an image is collected correctly. 2008-06-24 Mark Wibrow - - Removed new intersection stuff. Need to restart from scratch... + - Removed new intersection stuff. Need to restart from scratch... 2008-06-23 Till Tantau - - Started working on circuit library documentation. + - Started working on circuit library documentation. 2008-06-23 Mark Wibrow - - 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. - + - 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 - - 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. + - 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 - - 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. + - 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 - - 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 + - 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 - - 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. + - 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 - - 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. + - 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 - - 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. + - 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 - - 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. - + - 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 - - Fixed the bug fix for character checking in foreach. - - Updates and fixes for new foreach code. + - Fixed the bug fix for character checking in foreach. + - Updates and fixes for new foreach code. 2008-06-13 Till Tantau - - 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. + - 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 - - 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. + - 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 - - Worked a bit on data visualization stuff. - + - Worked a bit on data visualization stuff. + 2008-06-07 Christian Feuersaenger - - 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... + - 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 - - Fixed the "local bounding box" option so that it honors the - "relevant for picture size"-if. - + - Fixed the "local bounding box" option so that it honors the + "relevant for picture size"-if. + 2008-06-04 Till Tantau - - 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. + - 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 - - 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) + - 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 - - Fixed pgfpages in conjunction with everyshi. + - Fixed pgfpages in conjunction with everyshi. 2008-05-31 Christian Feuersaenger - - - 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. + + - 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 - - Provided \pgfmathprintnumberto macro in addition to - \pgfmathprintnumber. + - Provided \pgfmathprintnumberto macro in addition to + \pgfmathprintnumber. 2008-05-22 Mark Wibrow - - Revised Lindenmayer system stuff. Documentation should - now be up to date. + - Revised Lindenmayer system stuff. Documentation should + now be up to date. 2008-05-22 Christian Feuersaenger - - 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. + - 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 - - Added missing documentation of moveto-decoration. + - Added missing documentation of moveto-decoration. 2008-05-20 Mark Wibrow - - Changed the processing of \pgflsystemstep. Now a TeX - dimension, it permits a symbol to shorten the step. + - Changed the processing of \pgflsystemstep. Now a TeX + dimension, it permits a symbol to shorten the step. 2008-05-19 Mark Wibrow - - Added Lindemayer system drawing library. - - Renamed the ranomization keys for the step and angle. - - Updated the L-system docs. + - Added Lindemayer system drawing library. + - Renamed the ranomization keys for the step and angle. + - Updated the L-system docs. 2008-05-19 Till Tantau - - Added documentation of oo-subsystem. - - Started documentation of data visualization-subsystem. - - Fixed hyperlink problem in dvipdfm(x)/xetex. - - Fixed typos in Lindemayer system doc. + - 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 - - 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. + - 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 - - 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. + - 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 - - 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). + - 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 - - Fixed compatability issue with old calc code. - + - Fixed compatability issue with old calc code. + 2008-05-13 Christian Feuersaenger - - 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. + - 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 - - Multiple fixes for signal shape. + - Multiple fixes for signal shape. 2008-05-03 Christian Feuersaenger - - 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. + - 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 - - Fixed parser for expressions that begin and end with braces. + - Fixed parser for expressions that begin and end with braces. 2008-04-27 Christian Feuersaenger - - - 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 + + - 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 - - 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 + - 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 - - Documented changed double line handling. - - Made some arrow tips work with double lines. + - Documented changed double line handling. + - Made some arrow tips work with double lines. 2008-04-22 Till Tantau - - 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. + - 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 - - - New version of rectangle split shape. Now supports horizontal - as well as vertical spliting. Also supports up to 20 parts. + + - 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 - - 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 + - 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 - - Added \tikzaddtikzonlycommandshortcutlet and - \tikzaddtikzonlycommandshortcutdef to install shortcut commands at the - beginning of tikzpicture. - - pgfkeys.code.tex: fixed incompatibility .try with .is choice + - 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 - - Fixed patterns in dvips mode (were broken). - + - Fixed patterns in dvips mode (were broken). + 2008-04-03 Till Tantau - - - 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. - + + - 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 - - - Reimplemented parsing of operands. + + - Reimplemented parsing of operands. 2008-04-01 Till Tantau - - Added cirlce solidus shape by Manuel Lacruz. + - Added cirlce solidus shape by Manuel Lacruz. 2008-03-19 Mark Wibrow - - - `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). + + - `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 - - 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 + - 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 - - Fixed minimum width handling in rounded rectangle shape. + - Fixed minimum width handling in rounded rectangle shape. 2008-03-12 Mark Wibrow - - Added key for rectangle split to ignore empty parts. - - Extended \pgfshadecolortorgb to define macros for the - individual color components. + - Added key for rectangle split to ignore empty parts. + - Extended \pgfshadecolortorgb to define macros for the + individual color components. 2008-03-08 Mark Wibrow - - Added `curve control points' decoration for drawing - curve controls. NB: names/keys may change. + - Added `curve control points' decoration for drawing + curve controls. NB: names/keys may change. 2008-03-07 Mark Wibrow - - Fix for (some) `hidden' bugs: ``Missing character: - There is no in font nullfont!''. This is usually - only seen in log file. Fixed for star, circular sector - and math macros. + - Fix for (some) `hidden' bugs: ``Missing character: + There is no in font nullfont!''. This is usually + only seen in log file. Fixed for star, circular sector + and math macros. 2008-03-03 Till Tantau - - 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. + - 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 - - 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 + - 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 - Released version 2.00 + Released version 2.00 2008-02-14 Till Tantau - - Fixed "initial"/"accepting" distance bug. - - Fixed wrong intersection computation bug. - + - Fixed "initial"/"accepting" distance bug. + - Fixed wrong intersection computation bug. + 2008-02-13 Till Tantau - - Added "local bounding box" option for Fabien... + - Added "local bounding box" option for Fabien... 2008-02-12 Till Tantau - - Finished chains and chain tutorial. - - Fixed height of rounded rectangle shape. - + - Finished chains and chain tutorial. + - Fixed height of rounded rectangle shape. + 2008-02-11 Till Tantau - - 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. - + - 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 - - 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. + - 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 - - 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). + - 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 - - 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. + - 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 - - Removed internal asin tables as asin is now calculated from - acos tables. - - Misc. updates for shapes docs. + - Removed internal asin tables as asin is now calculated from + acos tables. + - Misc. updates for shapes docs. 2008-02-06 Till Tantau - - Changed fit library, so that nodes are now "completely" - fitted. - - Changed tutorial so that fit library is now used. - - Added placement library and documentation. + - 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 - - Fixes in snake compatibility code. - - Added dvipdfmx support (identical to dvipdfm). - - Fixed missing braces and color stack problem in - shapes.logic.IEC. + - 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 - - 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. + - 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 - - - Added through library (still very simple...). - - Added computation of intersection of circles and tangent to - a circle. + + - Added through library (still very simple...). + - Added computation of intersection of circles and tangent to + a circle. 2008-01-31 Mark Wibrow - - 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. + - 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 - - Reimplemented shape `tape'. Anchors should behave a bit - better now. + - Reimplemented shape `tape'. Anchors should behave a bit + better now. 2008-01-29 Till Tantau - - Fixed problem with pin a relative coordinates. + - Fixed problem with pin a relative coordinates. 2008-01-27 Mark Wibrow - - 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. + - 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 - - Modified calc library. Working on documentation. - - Added calc library and ($...$) notation for coordinates. + - Modified calc library. Working on documentation. + - Added calc library and ($...$) notation for coordinates. 2008-01-25 Mark Wibrow - - - 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. + + - 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 - - Added decorations.markings. + - Added decorations.markings. 2008-01-22 Till Tantau - - 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. + - 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 - - - Added logic shapes library. Includes AND gate, NAND gate, - OR gate, NOR gate, XOR gate, XNOR gate and NOT gate. + + - 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 - - 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! - + - 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 - - - Removed \externalcode command for decoration states as - persistent pre/postcomputation stuff does a similar job. + + - Removed \externalcode command for decoration states as + persistent pre/postcomputation stuff does a similar job. 2008-01-18 Mark Wibrow - - - Added \externalcode command for decoration states. Allows - code to be executed outside the TeX-group the state code - is executed in. + + - 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 - - 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. + - 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 - - Started merging snakes and decorations. Not yet finished. + - Started merging snakes and decorations. Not yet finished. 2008-01-16 Till Tantau - - (Partly) rewrote the tikz support for decorations. There is - now a "decorate" path command: - \draw ... decorate [decoration=zigzag] { (0,0) -- (1,2) }; + - (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. - + - 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 - - 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. - + - 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 - - - Fix for minimum size in ellipse split shape. - - Added decorations documentation. + + - Fix for minimum size in ellipse split shape. + - Added decorations documentation. 2008-01-14 Till Tantau - - 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. + - 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 - - - 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. + + - 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 - - Changed shadow lib once more and added it to CVS. + - Changed shadow lib once more and added it to CVS. 2008-01-13 Mark Wibrow - - Added decorations files. Docs to follow soon(ish). - - Fix for `star point ratio' and `star point height' - keys in star shape. + - 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 - - - Added copy shadow. + + - Added copy shadow. 2008-01-10 Till Tantau - - Added random steps snake. - + - Added random steps snake. + 2008-01-09 Till Tantau - - 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. + - 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 - - 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. + - 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 - - Added `ellipse split' shape. + - Added `ellipse split' shape. 2007-12-17 Till Tantau - - 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". - + - 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 - - Added fadings. - - Added functional shadings. - - Fixed bug in double drawing with arrows. + - Added fadings. + - Added functional shadings. + - Fixed bug in double drawing with arrows. 2007-11-24 Mark Wibrow - - 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. - + - 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 - - - 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. - + + - 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 - - Updated math documentation. Code examples now consistent with - the rest of the manual. + - Updated math documentation. Code examples now consistent with + the rest of the manual. 2007-11-12 Till Tantau - - - Fixed hyperref-dvipdfm-problem. - + + - Fixed hyperref-dvipdfm-problem. + 2007-11-10 Mark Wibrow - - Updated cloud shape for minimum size calculations. - - Reimplemented rounded rectangle. Now supports concave arcs. - - Removed all stuff for Fancy hyperlinked picture of shapes. + - 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 - - - \foreach will now allow a macro name to be given as list - argument (as in \foreach \x in \mylist {...}) - + + - \foreach will now allow a macro name to be given as list + argument (as in \foreach \x in \mylist {...}) + 2007-10-29 Till Tantau - - Fixed keys problem when .try is used with a comma. - + - Fixed keys problem when .try is used with a comma. + 2007-10-28 Mark Wibrow - - Fixed shape snake for drawing to other pictures. - - Added shapes `arrow box' shape, `rectangle callout` and - `ellipse callout'. + - Fixed shape snake for drawing to other pictures. + - Added shapes `arrow box' shape, `rectangle callout` and + `ellipse callout'. 2007-10-26 Till Tantau - - Fixed dvipdfm problem with hyperref. + - Fixed dvipdfm problem with hyperref. 2007-10-13 Mark Wibrow - - 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. + - 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 - - Fixed bug #1803811 gobbling of tokens after \pgfmathaddtocounter. - - Fixed insertion of spaces after \pgfmath stuff. - - Fixed bug #1811862. + - Fixed bug #1803811 gobbling of tokens after \pgfmathaddtocounter. + - Fixed insertion of spaces after \pgfmath stuff. + - Fixed bug #1811862. 2007-09-19 Mark Wibrow @@ -3471,21 +3343,21 @@ 2007-08-20 Mark Wibrow - - 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). + - 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 - - Trapezium shape updated. No longer uses left and right - extensions. Uses internal angles instead. + - Trapezium shape updated. No longer uses left and right + extensions. Uses internal angles instead. - Updated pgfkeys for shapes (not done \pgfsetshapeaspect for - diamond shape) + diamond shape) 2007-08-09 Mark Wibrow @@ -3494,7 +3366,7 @@ 2007-08-08 Till Tantau - - Added fitting library. + - Added fitting library. 2007-07-28 Mark Wibrow @@ -3506,373 +3378,373 @@ 2007-07-23 Till Tantau - - Started to use new pgfkeys also in pgf. In particular, - commands like \pgfsetshape... are now replaced by keys. - (Not yet finished.) - + - 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 - - Added new geometric shape: `circular sector'. - - Updated pgfbaseshapes.code.tex for saved macro support. + - Added new geometric shape: `circular sector'. + - Updated pgfbaseshapes.code.tex for saved macro support. 2007-07-12 Till Tantau - - Added overlay functionality to \node. - - Added pgfkeys and its documentation. + - Added overlay functionality to \node. + - Added pgfkeys and its documentation. 2007-07-10 Mark Wibrow - - 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. + - 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 - - Added support for sec, cosec and cot. + - Added support for sec, cosec and cot. 2007-07-03 Till Tantau - - Fixed missing compatibility \pgfsincos - - Fixed wrong \pgfmathsincos + - Fixed missing compatibility \pgfsincos + - Fixed wrong \pgfmathsincos 2007-06-23 Mark Wibrow - - Added semicircle shape. - - Updated documentation for all new shapes. + - Added semicircle shape. + - Updated documentation for all new shapes. 2007-06-22 Mark Wibrow - - 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. + - 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 - - Fixed text width problem in matrix of nodes. + - Fixed text width problem in matrix of nodes. 2007-01-18 Till Tantau - 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. + 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 - Version 1.10: + Version 1.10: - - Renamed \pgf@sys@pdf@mark to \pgfsyspdfmark. - - Fixed the ConTeXt support so that it is usable (which is wasn't). - + - 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 - 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. - + 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 - Version 1.01: + 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. + - 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 - Version 1.00: + Version 1.00: - - There have not been any real changes since 0.99. - - + - There have not been any real changes since 0.99. + + 2005-10-11 Till Tantau - Version 0.99: + 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). + - 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 - Version 0.98: + 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. + - 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 - 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.) + 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 - 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. + 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 - 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. - + 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 - Version 0.65: - - Fixed bug in pgfshade.sty that arises in conjunction with - calc.sty and latex+dvips. + Version 0.65: + - Fixed bug in pgfshade.sty that arises in conjunction with + calc.sty and latex+dvips. 2004-10-08 Till Tantau - Version 0.64: - - Fixed missing depth of \pgfnodebox. - - Fixed bug that caused infinite stack loop with pictures inside - nodes. + Version 0.64: + - Fixed missing depth of \pgfnodebox. + - Fixed bug that caused infinite stack loop with pictures inside + nodes. 2004-07-08 Till Tantau - 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. + 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 - 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. + 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 - 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). + 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 - 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. - + 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 - 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. - + 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 - Version 0.43: - - Fixed \normalcolor, so that it works also in preamble. + Version 0.43: + - Fixed \normalcolor, so that it works also in preamble. 2003-11-20 Till Tantau - Version 0.42: - - Documented masks. - - Fixed bug in pgf.sty for nested pictures. + Version 0.42: + - Documented masks. + - Fixed bug in pgf.sty for nested pictures. 2003-11-18 Till Tantau - Version 0.41: - - Added masks (not yet documented). + Version 0.41: + - Added masks (not yet documented). 2003-11-12 Till Tantau - 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. + 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 - Version 0.34: - - Shadings now work together with color mix-ins. - - Shadings can now take color names as parameters. - + Version 0.34: + - Shadings now work together with color mix-ins. + - Shadings can now take color names as parameters. + 2003-10-24 Till Tantau - 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. + 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 - Version 0.32: - - Updated installation procedure information. + Version 0.32: + - Updated installation procedure information. 2003-09-18 Till Tantau - Version 0.31: - - One parameter for \pgfdeclareimage may now be omitted. It will - be computed automatically. - + Version 0.31: + - One parameter for \pgfdeclareimage may now be omitted. It will + be computed automatically. + 2003-08-21 Till Tantau - Version 0.30: - - Created ChangeLog - - Added pgfshade.sty - + Version 0.30: + - Created ChangeLog + - Added pgfshade.sty + ;;; Local Variables: diff --git a/Master/texmf-dist/doc/generic/pgf/FILES b/Master/texmf-dist/doc/generic/pgf/FILES index d49e5add7e3..7dc4c280031 100644 --- a/Master/texmf-dist/doc/generic/pgf/FILES +++ b/Master/texmf-dist/doc/generic/pgf/FILES @@ -83,7 +83,6 @@ pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryfit.code.tex pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryspy.code.tex pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarythrough.code.tex pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryshadings.code.tex -pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryperspective.code.tex pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarylindenmayersystems.code.tex pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarypositioning.code.tex pgf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryautomata.code.tex @@ -593,7 +592,6 @@ 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/text-en/pgfmanual-en-gd-usage-tikz.tex -pgf/doc/generic/pgf/text-en/pgfmanual-en-library-perspective.tex pgf/doc/generic/pgf/text-en/pgfmanual-en-library-circuits.tex pgf/doc/generic/pgf/text-en/pgfmanual-en-library-babel.tex pgf/doc/generic/pgf/text-en/pgfmanual-en-library-trees.tex diff --git a/Master/texmf-dist/doc/generic/pgf/README b/Master/texmf-dist/doc/generic/pgf/README index d0af9b9adc5..de59b6dede9 100644 --- a/Master/texmf-dist/doc/generic/pgf/README +++ b/Master/texmf-dist/doc/generic/pgf/README @@ -5,7 +5,7 @@ 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 https://github.com/pgf-tikz/pgf +Please go to http://sourceforge.net/projects/pgf/ to submit bug reports, request new features, etc. diff --git a/Master/texmf-dist/doc/generic/pgf/licenses/gnu-free-documentation-license-1.2.txt b/Master/texmf-dist/doc/generic/pgf/licenses/gnu-free-documentation-license-1.2.txt index 26cf032dcdf..4a0fe1c8dee 100644 --- a/Master/texmf-dist/doc/generic/pgf/licenses/gnu-free-documentation-license-1.2.txt +++ b/Master/texmf-dist/doc/generic/pgf/licenses/gnu-free-documentation-license-1.2.txt @@ -1,5 +1,5 @@ - GNU Free Documentation License - Version 1.2, November 2002 + GNU Free Documentation License + Version 1.2, November 2002 Copyright (C) 2000,2001,2002 Free Software Foundation, Inc. diff --git a/Master/texmf-dist/doc/generic/pgf/licenses/gnu-public-license-2.txt b/Master/texmf-dist/doc/generic/pgf/licenses/gnu-public-license-2.txt index fd94e166f55..d511905c164 100644 --- a/Master/texmf-dist/doc/generic/pgf/licenses/gnu-public-license-2.txt +++ b/Master/texmf-dist/doc/generic/pgf/licenses/gnu-public-license-2.txt @@ -1,12 +1,12 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 + 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 + Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public @@ -56,7 +56,7 @@ 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 + GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains @@ -255,7 +255,7 @@ 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 + 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 @@ -277,9 +277,9 @@ 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 + END OF TERMS AND CONDITIONS - How to Apply These Terms to Your New Programs + 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 diff --git a/Master/texmf-dist/doc/generic/pgf/macros/pgfmanual-en-macros.tex b/Master/texmf-dist/doc/generic/pgf/macros/pgfmanual-en-macros.tex index c326d973e32..37591af1529 100644 --- a/Master/texmf-dist/doc/generic/pgf/macros/pgfmanual-en-macros.tex +++ b/Master/texmf-dist/doc/generic/pgf/macros/pgfmanual-en-macros.tex @@ -309,7 +309,7 @@ \def\extractmathfunctionname@#1(#2)#3\tmpb{\def\mathname{#1}} \makeatother - + \newenvironment{math-function}[1]{ \def\mathdefaultname{#1} \extractmathfunctionname{#1} @@ -339,7 +339,7 @@ \pgfmanualentryheadline{\mathexample\hfill\mathtype}% \def\mathtest{#1}% \ifx\mathtest\pgfmanualemptytext% - \index{#2@\protect\texttt{#2} #3 math operator}% + \index{#2@\protect\texttt{#2} #3 math operator}% \index{Math operators!#2@\protect\texttt{#2}}% \fi% \pgfmanualbody @@ -358,7 +358,7 @@ \pgfmanualentryheadline{\mathexample\hfill\mathtype}% \def\mathtest{#1}% \ifx\mathtest\pgfmanualemptytext% - \index{#2#3@\protect\texttt{#2\protect\ #3} #4 math operators}% + \index{#2#3@\protect\texttt{#2\protect\ #3} #4 math operators}% \index{Math operators!#2#3@\protect\texttt{#2\protect\ #3}}% \fi% \pgfmanualbody @@ -819,7 +819,7 @@ \decomposetoodeep#1/#2\nil% \else% \iffirsttime% - \begingroup% + \begingroup% % also make a pdf link anchor with full key path. \def\hyperlabelwithoutslash##1/\nil{% \pgfmanualpdflabel{##1}{}% @@ -1185,7 +1185,7 @@ \edef\strippedtext{\stripcommand#1}% \expandafter\getridofats\strippedtext @\relax% } - + \gdef\stripcommand#1{\expandafter\mygobble\string#1} } @@ -1326,14 +1326,14 @@ \newenvironment{arrowexamples} {\begin{tabbing} - \hbox to \dimexpr\linewidth-5.5cm\relax{\emph{Appearance of the below at line width} \hfil} \= + \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 \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} @@ -1376,7 +1376,7 @@ \newcommand\symarrow[1]{% \index{#1@\protect\texttt{#1} arrow tip}% \index{Arrow tips!#1@\protect\texttt{#1}}% - \texttt{#1}& yields thick + \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) ; @@ -1391,7 +1391,7 @@ \newcommand\symarrowdouble[1]{% \index{#1@\protect\texttt{#1} arrow tip}% \index{Arrow tips!#1@\protect\texttt{#1}}% - \texttt{#1}& yields thick + \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) ; @@ -1402,12 +1402,12 @@ \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 + \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 + \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) ; @@ -1420,7 +1420,7 @@ \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 + \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) ; @@ -1438,7 +1438,7 @@ \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 + \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) ; @@ -1448,12 +1448,12 @@ \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 + \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 + \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) ; @@ -1482,7 +1482,7 @@ \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}] + plot[mark=#1,mark options={fill=examplefill,draw=black}] coordinates {(0,0) (.5,0.2) (1,0) (1.5,0.2)};\\ } @@ -1561,7 +1561,7 @@ % \codeexample@tabinit@catcode % and % \codeexample@tabinit@replacementchars -% which are used inside of +% which are used inside of %\begin{codeexample} % ... %\end{codeexample} @@ -1900,7 +1900,7 @@ \makeatother -%%% Local Variables: +%%% Local Variables: %%% mode: latex %%% TeX-master: "beameruserguide" -%%% End: +%%% End: diff --git a/Master/texmf-dist/doc/generic/pgf/pgfmanual.pdf b/Master/texmf-dist/doc/generic/pgf/pgfmanual.pdf index c521d86650b..69eac37dc41 100644 Binary files a/Master/texmf-dist/doc/generic/pgf/pgfmanual.pdf and b/Master/texmf-dist/doc/generic/pgf/pgfmanual.pdf differ diff --git a/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-base-decorations.tex b/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-base-decorations.tex index a4067c9861a..b51d5373162 100644 --- a/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-base-decorations.tex +++ b/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-base-decorations.tex @@ -968,7 +968,7 @@ 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}. + contents}, with the meta-decoration \meta{name}. \end{environment} \begin{plainenvironment}{{pgfmetadecoration}\marg{name}} diff --git a/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-base-points.tex b/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-base-points.tex index 56f49d7e5dc..eace57ffde3 100644 --- a/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-base-points.tex +++ b/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-base-points.tex @@ -66,7 +66,7 @@ The following commands are the most basic for specifying a coordinate. \draw[help lines] (0,0) grid (3,2); \foreach \angle in {0,10,...,90} - {\pgfpathcircle{\pgfpointpolar{\angle}{1cm and 2cm}}{2pt}} + {\pgfpathcircle{\pgfpointpolar{\angle}{1cm/2cm}}{2pt}} \pgfusepath{fill} \end{tikzpicture} \end{codeexample} @@ -662,8 +662,8 @@ be used to perform the above code: 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 +values can ge 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] diff --git a/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-base-transparency.tex b/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-base-transparency.tex index 22156f98d3e..fda8f6a8872 100644 --- a/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-base-transparency.tex +++ b/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-base-transparency.tex @@ -349,7 +349,6 @@ Transparency groups are declared using the following commands. 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} diff --git a/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-library-circuits.tex b/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-library-circuits.tex index 31d4345cb69..66bbd1e3233 100644 --- a/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-library-circuits.tex +++ b/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-library-circuits.tex @@ -1241,7 +1241,7 @@ Let us begin with the base library that defines the handling of inputs. \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] + \draw[logic gate anchors use bounding box=\x, color=\y] (A.\a) circle(\z); \end{tikzpicture} \end{codeexample} diff --git a/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-library-decorations.tex b/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-library-decorations.tex index 718d8b7870c..58d2b6f3af8 100644 --- a/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-library-decorations.tex +++ b/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-library-decorations.tex @@ -1819,7 +1819,7 @@ shapes. This library is included mostly for historical reasons, using the \end{key} \begin{key}{/pgf/decoration/text effects/word count=\meta{macro}} - Store the number of words in the decoration text in \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|. diff --git a/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-library-perspective.tex b/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-library-perspective.tex deleted file mode 100644 index 61ed10179ec..00000000000 --- a/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-library-perspective.tex +++ /dev/null @@ -1,418 +0,0 @@ -\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/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-main-body.tex b/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-main-body.tex index 15a678e7270..78b72d5ab8c 100644 --- a/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-main-body.tex +++ b/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-main-body.tex @@ -50,7 +50,6 @@ \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}] @@ -221,7 +220,7 @@ \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}}} +\large\href{https://sourceforge.net/projects/pgf}{\texttt{https://sourceforge.net/projects/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}.}\\ @@ -537,7 +536,6 @@ libraries are not loaded by default since many users will not need them. \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} diff --git a/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-main-preamble.tex b/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-main-preamble.tex index d35c0e89abd..5515cc8b7ed 100644 --- a/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-main-preamble.tex +++ b/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-main-preamble.tex @@ -94,7 +94,6 @@ views, animations, rdf, - perspective, } \usepackage{ifluatex} diff --git a/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-pgffor.tex b/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-pgffor.tex index 8ae0628b367..a8ddbd9194a 100644 --- a/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-pgffor.tex +++ b/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-pgffor.tex @@ -356,19 +356,6 @@ This section describes the package |pgffor|, which is loaded automatically by \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} diff --git a/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-tikz-coordinates.tex b/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-tikz-coordinates.tex index c3921486e6d..8ffafad7f54 100644 --- a/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-tikz-coordinates.tex +++ b/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-tikz-coordinates.tex @@ -1046,7 +1046,7 @@ which you need. 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. + value is had when the matching |{| was read. % \begin{codeexample}[] \begin{tikzpicture} diff --git a/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-tikz-decorations.tex b/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-tikz-decorations.tex index 009660a911d..1600e6f5378 100644 --- a/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-tikz-decorations.tex +++ b/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-tikz-decorations.tex @@ -474,20 +474,25 @@ decorations, not with meta-decorations. 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}[] +\begin{tikzpicture} \tikz [decoration={zigzag,pre=lineto,pre length=1cm}] \draw [decorate] (0,0) -- (2,1) arc (90:0:1); +\end{tikzpicture} \end{codeexample} % \begin{codeexample}[] +\begin{tikzpicture} \tikz [decoration={zigzag,pre=moveto,pre length=1cm}] \draw [decorate] (0,0) -- (2,1) arc (90:0:1); +\end{tikzpicture} \end{codeexample} % \begin{codeexample}[] +\begin{tikzpicture} \tikz [decoration={zigzag,pre=crosses,pre length=1cm}] \draw [decorate] (0,0) -- (2,1) arc (90:0:1); +\end{tikzpicture} \end{codeexample} Note that the default |pre| option is |lineto|, not |curveto|. This means @@ -495,13 +500,17 @@ decorations, not with meta-decorations. reasons). Change the |pre| key to |curveto| if you have a curved path. % \begin{codeexample}[] +\begin{tikzpicture} \tikz [decoration={zigzag,pre length=3cm}] \draw [decorate] (0,0) -- (2,1) arc (90:0:1); +\end{tikzpicture} \end{codeexample} % \begin{codeexample}[] +\begin{tikzpicture} \tikz [decoration={zigzag,pre=curveto,pre length=3cm}] \draw [decorate] (0,0) -- (2,1) arc (90:0:1); +\end{tikzpicture} \end{codeexample} % \end{key} diff --git a/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-tutorial-Euclid.tex b/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-tutorial-Euclid.tex index ace6c5d8827..c35deca1f82 100644 --- a/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-tutorial-Euclid.tex +++ b/Master/texmf-dist/doc/generic/pgf/text-en/pgfmanual-en-tutorial-Euclid.tex @@ -488,7 +488,7 @@ The second proposition in the Elements is the following: 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. + \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 diff --git a/Master/texmf-dist/doc/generic/pgf/version-for-dvisvgm/en/Makefile b/Master/texmf-dist/doc/generic/pgf/version-for-dvisvgm/en/Makefile index 57bf75e8b38..d598bdc8348 100644 --- a/Master/texmf-dist/doc/generic/pgf/version-for-dvisvgm/en/Makefile +++ b/Master/texmf-dist/doc/generic/pgf/version-for-dvisvgm/en/Makefile @@ -17,7 +17,7 @@ pgfmanual.ind: pgfmanual.idx pgfmanual.svg: $(doc).tex $(doc).ind revisionfile TEXINPUTS="$(TEXINPUTS)" $(latex) $(doc).tex - dvisvgm --font-format=woff --no-merge --output=%f-%4p.svg --page=1- --bbox=a4 --linkmark=none $(doc) + dvisvgm --no-merge --output=%f-%4p.svg --page=1- --bbox=a4 --linkmark=none $(doc) pgfmanual-no-font.svg: $(doc).tex $(doc).ind revisionfile TEXINPUTS="$(TEXINPUTS)" $(latex) $(doc).tex diff --git a/Master/texmf-dist/doc/generic/pgf/version-for-dvisvgm/pgfmanual-dvisvgm.cfg b/Master/texmf-dist/doc/generic/pgf/version-for-dvisvgm/pgfmanual-dvisvgm.cfg index e07ee9cdd19..e6e29e1fda5 100644 --- a/Master/texmf-dist/doc/generic/pgf/version-for-dvisvgm/pgfmanual-dvisvgm.cfg +++ b/Master/texmf-dist/doc/generic/pgf/version-for-dvisvgm/pgfmanual-dvisvgm.cfg @@ -11,12 +11,7 @@ \usepackage[hypertex]{hyperref} \makeatletter -\g@addto@macro\selectfont{% - \long\edef\longf@family{\f@family}% - \ifx\longf@family\ttdefault - \ignoreligaturesinfont\font\relax - \fi -} +\expandafter\g@addto@macro\csname ttfamily \endcsname{\ignoreligaturesinfont\font\relax} \makeatother \usepackage{graphicx,xcolor} diff --git a/Master/texmf-dist/doc/generic/pgf/version-for-luatex/pgfmanual-luatex.cfg b/Master/texmf-dist/doc/generic/pgf/version-for-luatex/pgfmanual-luatex.cfg index 1523589539d..7b57d3ed418 100644 --- a/Master/texmf-dist/doc/generic/pgf/version-for-luatex/pgfmanual-luatex.cfg +++ b/Master/texmf-dist/doc/generic/pgf/version-for-luatex/pgfmanual-luatex.cfg @@ -11,12 +11,7 @@ \usepackage[hyphens]{url} \usepackage[pdfborder={0 0 0}]{hyperref} \makeatletter -\g@addto@macro\selectfont{% - \long\edef\longf@family{\f@family}% - \ifx\longf@family\ttdefault - \ignoreligaturesinfont\font\relax - \fi -} +\expandafter\g@addto@macro\csname ttfamily \endcsname{\ignoreligaturesinfont\font\relax} \makeatother % Just make sure to compile this using lualatex. diff --git a/Master/texmf-dist/doc/generic/pgf/version-for-pdftex/pgfmanual-pdftex.cfg b/Master/texmf-dist/doc/generic/pgf/version-for-pdftex/pgfmanual-pdftex.cfg index 4aa0520888d..bea9f8d862f 100644 --- a/Master/texmf-dist/doc/generic/pgf/version-for-pdftex/pgfmanual-pdftex.cfg +++ b/Master/texmf-dist/doc/generic/pgf/version-for-pdftex/pgfmanual-pdftex.cfg @@ -11,12 +11,7 @@ \usepackage[hyphens]{url} \usepackage[pdfborder={0 0 0}]{hyperref} \makeatletter -\g@addto@macro\selectfont{% - \long\edef\longf@family{\f@family}% - \ifx\longf@family\ttdefault - \pdfnoligatures\font\relax - \fi -} +\expandafter\g@addto@macro\csname ttfamily \endcsname{\pdfnoligatures\font\relax} \makeatother % Just make sure to compile this using pdfelatex. diff --git a/Master/texmf-dist/source/generic/pgf/testsuite/external/tikzexternaltest.code.tex b/Master/texmf-dist/source/generic/pgf/testsuite/external/tikzexternaltest.code.tex index 153a074255a..8a200fcf991 100644 --- a/Master/texmf-dist/source/generic/pgf/testsuite/external/tikzexternaltest.code.tex +++ b/Master/texmf-dist/source/generic/pgf/testsuite/external/tikzexternaltest.code.tex @@ -4,23 +4,23 @@ 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 +The next one uses \begin{tikzpicture}[baseline] - \draw (0,0) grid (4,4); + \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})}; + \node[draw,rounded corners] {A node with a ref (\ref{eq:1})}; \end{tikzpicture} \begin{equation} - 1+1=3 - \label{eq:1} + 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}}; + \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}. @@ -29,12 +29,12 @@ The label inside of a node is on page~\pageref{a:label:in:a:picture}. \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} + \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}. diff --git a/Master/texmf-dist/source/generic/pgf/testsuite/external/tikzexternaltest.sharedpreamble.tex b/Master/texmf-dist/source/generic/pgf/testsuite/external/tikzexternaltest.sharedpreamble.tex index d2577b01b13..87e94f899eb 100644 --- a/Master/texmf-dist/source/generic/pgf/testsuite/external/tikzexternaltest.sharedpreamble.tex +++ b/Master/texmf-dist/source/generic/pgf/testsuite/external/tikzexternaltest.sharedpreamble.tex @@ -5,16 +5,16 @@ \usepackage{hyperref} \IfFileExists{pgfplots.sty}{% - \usepackage{pgfplots} + \usepackage{pgfplots} }{}% \IfFileExists{tikzlibraryexternal.code.tex}{% - \usetikzlibrary{external} + \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} + \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/Master/texmf-dist/source/generic/pgf/testsuite/mathtest/pgfmathtestsuite.tex b/Master/texmf-dist/source/generic/pgf/testsuite/mathtest/pgfmathtestsuite.tex index 6baf5ddba49..ecae8941fe1 100644 --- a/Master/texmf-dist/source/generic/pgf/testsuite/mathtest/pgfmathtestsuite.tex +++ b/Master/texmf-dist/source/generic/pgf/testsuite/mathtest/pgfmathtestsuite.tex @@ -1,5 +1,5 @@ -% FIXME: this class is MESSY. -% +% FIXME: this class is MESSY. +% % rewrite with proper assertions ... it goes back to a time where I % merely wanted to inspect the results! % @@ -13,20 +13,20 @@ \usepackage{ifpdf} \ifpdf - \usepackage{hyperref} + \usepackage{hyperref} \else - \def\pgfsysdriver{pgfsys-dvipdfm.def} - \usepackage[dvipdfm]{hyperref} + \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} + % load pgfplots with its pgf 2.00 compatibility code: + \usepackage{pgfplots} }{ - \usepgflibrary{fpu} + \usepgflibrary{fpu} } \makeatother @@ -46,93 +46,93 @@ \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 + \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}}% +% \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 + #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 + \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}% + \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} @@ -146,7 +146,7 @@ % \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}% @@ -203,36 +203,36 @@ \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} + \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} @@ -298,65 +298,65 @@ { \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} + \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} @@ -491,61 +491,61 @@ \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}% +\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 + % + \let\n=\relax + \noindent + \temptable }% %\tracingmacros=2 \tracingcommands=2 @@ -574,20 +574,20 @@ \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). \] + \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}% + \testfloataddnonsymmetric{#1}{#2}% + \testfloataddnonsymmetric{#2}{#1}% }% \testfloatadd{1}{100} @@ -623,17 +623,17 @@ \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). \] + \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} @@ -670,18 +670,18 @@ \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). \] + \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} @@ -702,15 +702,15 @@ \testsection{float to fixed test} \def\testpgfmathfloattofixed#1{% - \pgfmathfloatparsenumber{#1}% + \pgfmathfloatparsenumber{#1}% %\tracingmacros=2\tracingcommands=2 - \let\argument=\pgfmathresult - \message{converting #1 = \argument\ to fixed point}% - \pgfmathfloattofixed\argument - \let\result=\pgfmathresult - \message{-> \result}% + \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 \] + \[ \bigl( \showlowlevelfloatmacro\argument \bigr)\; = #1 \mapsto \result \] }% \testpgfmathfloattofixed{0} \testpgfmathfloattofixed{5} @@ -733,21 +733,21 @@ \testsection{Testing pgfmathfloatmin and pgfmathfloatmax} \def\testfloatminmax#1#2{% - \pgfmathfloatparsenumber{#1}% - \let\first=\pgfmathresult - \pgfmathfloatparsenumber{#2}% - \let\second=\pgfmathresult + \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 \] + \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} @@ -756,13 +756,13 @@ \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 \] + \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} @@ -775,71 +775,71 @@ \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 \] + \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} + \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 \] + \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)\] + \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 @@ -850,28 +850,28 @@ % #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)\] + \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} + \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 } @@ -880,32 +880,32 @@ \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 \] + \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} + \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 } @@ -915,72 +915,72 @@ % #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)\] + \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} + \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} } { @@ -989,29 +989,29 @@ % #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)\] + \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} + \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} } { @@ -1020,245 +1020,245 @@ % #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)\] + \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} + \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} + \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} + \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 - } + % #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/Master/texmf-dist/source/generic/pgf/testsuite/mathtest/unittest_luamathparser.tex b/Master/texmf-dist/source/generic/pgf/testsuite/mathtest/unittest_luamathparser.tex index 225927eb411..ee144598943 100644 --- a/Master/texmf-dist/source/generic/pgf/testsuite/mathtest/unittest_luamathparser.tex +++ b/Master/texmf-dist/source/generic/pgf/testsuite/mathtest/unittest_luamathparser.tex @@ -9,8 +9,8 @@ X \def\SHOW#1{% - \dimen0=#1 % - #1 = \the\dimen0 + \dimen0=#1 % + #1 = \the\dimen0 } \SHOW{1pt} @@ -40,13 +40,13 @@ X \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, + /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 @@ -57,113 +57,113 @@ X % #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 + \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} @@ -225,10 +225,10 @@ X \pgfmathdeclarefunction{N1}{3}{\pgfmathparse{#1+#2+#3}}% \directlua{ function pgfluamathfunctions.x() - return 4 + return 4 end function pgfluamathfunctions.N1(x,m,n) - return x+m+n + return x+m+n end } \parsertest{2^x}{16.0}{0} @@ -371,8 +371,8 @@ end \parsertest{0 <0.1 || 4 <0.1}{1.0}{0} { \pgfkeys{/pgf/declare function={ - xx=4; - yy=4; + 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} @@ -425,11 +425,11 @@ end % -- strings with "" % -- 'scalar' function % -- hex/octal/binary input -% -- tex registers +% -- tex registers % -- What happens for undefined functions!? --> return nil and let TeX invoke its parser (no warning!?) % -- width/height/depth % end -%-------------------------------------------------- +%-------------------------------------------------- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -510,15 +510,15 @@ end % 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 - }% + \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} @@ -533,7 +533,7 @@ end \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} @@ -553,9 +553,9 @@ end % NO MORE TEST CASES HERE! \ifnum\numErrors>0 - \PackageError{pgf}{Has \the\numErrors\space FAILURES}{} + \PackageError{pgf}{Has \the\numErrors\space FAILURES}{} \else - \message{All cases PASSED^^J}% + \message{All cases PASSED^^J}% \fi diff --git a/Master/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.tex b/Master/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.tex index 9ec63ff7c66..8e150972a97 100644 --- a/Master/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code.tex @@ -273,7 +273,7 @@ % \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). +% \if@filesw is \iftrue). % % % #1: the image file name (such that #1.dpth exists) diff --git a/Master/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.tex b/Master/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.tex index 028546dde89..57db0d20ba2 100644 --- a/Master/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.tex @@ -568,8 +568,8 @@ % % #1 = a time % #2 = center of a ellipse -% #3 = 0-degree axis of the ellipse -% #4 = 90-degree axis of the ellipse +% #3 = 0-degree exis of the ellipse +% #4 = 90-degree exis of the ellipse % #5 = start angle of an arc on the ellipse % #6 = end angle of an arc on the ellipse % @@ -851,11 +851,11 @@ \def\pgfpointxyz#1#2#3{% \pgfmathparse{#1}% - \global\let\pgftemp@x=\pgfmathresult% + \let\pgftemp@x=\pgfmathresult% \pgfmathparse{#2}% - \global\let\pgftemp@y=\pgfmathresult% + \let\pgftemp@y=\pgfmathresult% \pgfmathparse{#3}% - \global\let\pgftemp@z=\pgfmathresult% + \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% @@ -943,12 +943,77 @@ \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% + \pgf@xa=\pgf@x% + \pgf@ya=\pgf@y% + \ifdim\pgf@x<0pt\relax% move into first quadrant + \global\pgf@x=-\pgf@x% + \fi% + \ifdim\pgf@y<0pt\relax% + \pgf@y=-\pgf@y% + \fi% + \ifdim\pgf@x>\pgf@y% x > y + % make point small + \c@pgf@counta=\pgf@x% + \divide\c@pgf@counta by 65536\relax% + \ifnum\c@pgf@counta=0\relax% + \c@pgf@counta=1\relax% + \fi% + \global\divide\pgf@x by\c@pgf@counta% + \global\divide\pgf@y by\c@pgf@counta% + \divide\pgf@xa by\c@pgf@counta% + \divide\pgf@ya by\c@pgf@counta% + % ok. + \global\pgf@x=.125\pgf@x% + \global\pgf@y=.125\pgf@y% + \c@pgf@counta=\pgf@x% + \c@pgf@countb=\pgf@y% + \multiply\c@pgf@countb by 100% + \ifnum\c@pgf@counta<64\relax% + \global\pgf@x=1pt\relax% + \global\pgf@y=0pt\relax% + \else% + \divide\c@pgf@countb by \c@pgf@counta% + \global\pgf@x=\csname pgf@cosfrac\the\c@pgf@countb\endcsname pt% + \pgf@xc=8192pt% + \divide\pgf@xc by\c@pgf@counta% + \global\pgf@y=\pgf@sys@tonumber{\pgf@xc}\pgf@ya% + \global\pgf@y=\pgf@sys@tonumber{\pgf@x}\pgf@y% + \fi% + \ifdim\pgf@xa<0pt% + \global\pgf@x=-\pgf@x% + \fi% + \else% x <= y + % make point small + \c@pgf@counta=\pgf@y% + \divide\c@pgf@counta by 65536\relax% + \ifnum\c@pgf@counta=0\relax% + \c@pgf@counta=1\relax% + \fi% + \global\divide\pgf@x by\c@pgf@counta% + \global\divide\pgf@y by\c@pgf@counta% + \divide\pgf@xa by\c@pgf@counta% + \divide\pgf@ya by\c@pgf@counta% + % ok. + \global\pgf@x=.125\pgf@x% + \global\pgf@y=.125\pgf@y% + \c@pgf@counta=\pgf@y% + \c@pgf@countb=\pgf@x% + \multiply\c@pgf@countb by 100% + \ifnum\c@pgf@counta<64\relax% + \global\pgf@y=1pt\relax% + \global\pgf@x=0pt\relax% + \else% + \divide\c@pgf@countb by \c@pgf@counta% + \global\pgf@y=\csname pgfmath@cosfrac@\the\c@pgf@countb\endcsname pt% + \pgf@xc=8192pt% + \divide\pgf@xc by\c@pgf@counta% + \global\pgf@x=\pgf@sys@tonumber{\pgf@xc}\pgf@xa% + \global\pgf@x=\pgf@sys@tonumber{\pgf@y}\pgf@x% + \fi% + \ifdim\pgf@ya<0pt% + \global\pgf@y=-\pgf@y% + \fi% + \fi\ignorespaces% } diff --git a/Master/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.tex b/Master/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.tex index 3e292aa0383..50a820f6126 100644 --- a/Master/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.tex @@ -742,7 +742,6 @@ \def\pgfinterruptpicture {% \begingroup% - \csname tikz@inside@picturefalse\endcsname% \pgfinterruptboundingbox% \pgftransformreset% \pgfinterruptpath% diff --git a/Master/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex b/Master/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex index 93079024f6e..971752304a7 100644 --- a/Master/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex @@ -157,12 +157,6 @@ -\newcount\pgf@shadingcount -\pgf@shadingcount=0 -{ - \catcode`\%=12 - \gdef\pgf@shadingnum{%\the\pgf@shadingcount%} -} % Declares a horizontal shading for later use. The shading is a % horizontal bar that changes its color. @@ -202,11 +196,8 @@ \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% - \expandafter\let\csname pgf@num@pgfshading#2!\endcsname\pgfutil@empty \pgfsys@horishading{#2}{#3}{#4}% \else% - \global\advance\pgf@shadingcount 1\relax - \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% @@ -235,11 +226,8 @@ \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% - \expandafter\let\csname pgf@num@pgfshading#2!\endcsname=\pgfutil@empty \pgfsys@vertshading{#2}{#3}{#4}% \else% - \global\advance\pgf@shadingcount 1\relax - \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% @@ -281,11 +269,8 @@ \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% - \expandafter\let\csname pgf@num@pgfshading#2!\endcsname=\pgfutil@empty \pgfsys@radialshading{#2}{#3}{#4}% \else% - \global\advance\pgf@shadingcount 1\relax - \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% @@ -332,7 +317,7 @@ % 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 +% only *if you know what you are doing* (or if you are advanterous, of % course). % % As for other shadings, the optional dependencies argument is used to @@ -391,21 +376,17 @@ \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% - \expandafter\let\csname pgf@num@pgfshading#2!\endcsname=\pgfutil@empty \pgfshade@functionaldo{#2}{#3}{#4}{#5}{#6}% \else% - \global\advance\pgf@shadingcount 1\relax - \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{% @@ -445,38 +426,38 @@ \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}% - {}% {% - \begingroup - \pgfutil@globalcolorsfalse + \pgfutil@globalcolorsfalse% + \def\pgf@shade@adds{}% + \pgfutil@ifundefined{pgf@deps\pgf@shadingname}% + {}% + {% \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{rgb}{\pgf@rgbcolor}% - \edef\pgf@shade@adds{\pgf@shade@adds,\pgf@rgbcolor}% + {% + \pgfutil@ifundefined{applycolormixins}{}{\applycolormixins{\@temp}}% + \pgfutil@extractcolorspec{\@temp}{\pgf@tempcolor}% + \expandafter\pgfutil@convertcolorspec\pgf@tempcolor{rgb}{\pgf@rgbcolor}% + \xdef\pgf@shade@adds{\pgf@shade@adds,\pgf@rgbcolor}% + }% }% - \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 + }% + \expandafter\pgf@strip@shadename\pgf@shadingname!!% + \pgfutil@ifundefined{@pgfshading\pgf@basename\pgf@shade@adds!}% + {% + {% + \expandafter\def\expandafter\@temp\expandafter{\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% + % + }% + }% + {}% + \pgf@invokeshading{\csname @pgfshading\pgf@basename\pgf@shade@adds!\endcsname}% }% - {}% - \pgf@invokeshading{\csname\pgf@shadingxname\endcsname}% }% } @@ -503,8 +484,6 @@ \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% @@ -560,66 +539,40 @@ \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% + \pgf@xc=\pgf@pathmaxx% + \advance\pgf@xc by-\pgf@pathminx% + \pgf@yc=\pgf@pathmaxy% + \advance\pgf@yc by-\pgf@pathminy% + \pgf@xc=.01992528\pgf@xc% + \pgf@yc=.01992528\pgf@yc% + \ifdim\pgf@xc<0.0001pt\relax\ifdim\pgf@xc>-0.0001pt\relax\pgf@no@shadetrue\fi\fi% + \ifdim\pgf@yc<0.0001pt\relax\ifdim\pgf@yc>-0.0001pt\relax\pgf@no@shadetrue\fi\fi% + \ifpgf@no@shade\else% + \pgfsys@beginscope% + \pgfsyssoftpath@invokecurrentpath% + \pgfsys@clipnext% + \pgfsys@discardpath% + % Compute new transformation matrix: + \pgfsys@transformcm{1}{0}{0}{1}{\pgf@xb}{\pgf@yb}% + \pgfsys@transformcm% + {\pgf@sys@tonumber{\pgf@xc}}{0}% + {0}{\pgf@sys@tonumber{\pgf@yc}}{0pt}{0pt}% + \pgfmathparse{#2}% + \let\pgfshade@angle=\pgfmathresult% + \pgfmathsin@{\pgfshade@angle}% + \let\pgfshade@sin=\pgfmathresult% + \pgfmathcos@{\pgfshade@angle}% + \let\pgfshade@cos=\pgfmathresult% + \pgf@x=\pgfshade@sin pt% + \pgf@xa=-\pgf@x% + \pgfsys@transformcm{\pgfshade@cos}{\pgfshade@sin}{\pgf@sys@tonumber{\pgf@xa}}{\pgfshade@cos}{0pt}{0pt}% + \ifx\pgf@shade@extra@transform\pgfutil@empty% + \else% + \pgflowlevel{\pgf@shade@extra@transform}% + \fi% + \pgfuseshading{#1}% + \pgfsys@endscope% \fi% \endgroup% \fi% diff --git a/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/graphs/tikzlibrarygraphs.code.tex b/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/graphs/tikzlibrarygraphs.code.tex index 15fcecb70df..27f0ed4aba5 100644 --- a/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/graphs/tikzlibrarygraphs.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/graphs/tikzlibrarygraphs.code.tex @@ -542,10 +542,10 @@ }% \def\tikz@lib@graph@quote@parser@done{% - {\expandafter\pgfutil@scantokens\expandafter{% + {\expandafter\scantokens\expandafter{% \expandafter\expandafter\expandafter\tikzlibgraphactivations\expandafter\expandafter\expandafter\tikzlibgraphdoedef\expandafter{\the\pgfkeys@temptoks}% }}% - {\expandafter\pgfutil@scantokens\expandafter{\expandafter\tikzlibgraphactivationsbrace\expandafter\xdef\expandafter\tikzlibgraphreplaced\expandafter<\tikzlibgraphreplaced>\catcode`\}=2\relax}}% + {\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% }% @@ -563,7 +563,7 @@ \def\tikz@lib@prepare@active#1#2#3{% {% \catcode`#1=13\relax% - \pgfutil@scantokens{\gdef\tikzlibgraphactivator{\def#2{@#3@}}}% + \scantokens{\gdef\tikzlibgraphactivator{\def#2{@#3@}}}% }% \pgfutil@g@addto@macro\tikzlibgraphactivations{\catcode`#1=13\relax}% \expandafter\pgfutil@g@addto@macro\expandafter\tikzlibgraphactivations\expandafter{\tikzlibgraphactivator}% @@ -646,16 +646,7 @@ \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-{% +\def\tikz@lib@graph@node@normal#1-{% % Detect trailing < \tikz@lib@graph@@node#1<\pgf@stop% }% @@ -892,8 +883,7 @@ \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% + \pgfkeys@spdef\tikz@lib@graph@name@only{#1}% \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% @@ -912,7 +902,7 @@ }% \def\tikz@lg@slash@quote"#1"#2\pgf@stop{% \iftikz@handle@active@nodes% - \def\tikz@lib@graph@node@text{\csname pgfutil@scantokens\endcsname{#1}}% + \def\tikz@lib@graph@node@text{\scantokens{#1}}% \else \def\tikz@lib@graph@node@text{#1}% \fi% @@ -920,7 +910,7 @@ {\catcode`\"=13\relax \gdef\tikz@lg@slash@quote@active"#1"#2\pgf@stop{% \iftikz@handle@active@nodes% - \def\tikz@lib@graph@node@text{\csname pgfutil@scantokens\endcsname{#1}}% + \def\tikz@lib@graph@node@text{\scantokens{#1}}% \else \def\tikz@lib@graph@node@text{#1}% \fi% @@ -928,7 +918,7 @@ }% \def\tikz@lg@slash@cont#1\pgf@stop{% \iftikz@handle@active@nodes% - \def\tikz@lib@graph@node@text{\csname pgfutil@scantokens\endcsname{#1}}% + \def\tikz@lib@graph@node@text{\scantokens{#1}}% \else \def\tikz@lib@graph@node@text{#1}% \fi% diff --git a/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzexternalshared.code.tex b/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzexternalshared.code.tex index d35c7eee765..645191dbabf 100644 --- a/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzexternalshared.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzexternalshared.code.tex @@ -12,7 +12,7 @@ % 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. % @@ -61,17 +61,17 @@ % % This command must be called *after* \tikzexternalize. \def\tikzifexternalizing#1#2{% - \ifpgf@external@grabshipout #1\else #2\fi + \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 + \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. @@ -79,243 +79,243 @@ % 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 + \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% + \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's hope that \usepackage{pdftexcmds} has been used... + \pgfutil@IfUndefined{pdf@shellescape}{% + \def\tikzexternalcheckshellescape{0}% + }{% + \let\tikzexternalcheckshellescape=\pdf@shellescape + }% }{% - \let\tikzexternalcheckshellescape=\pdfshellescape + \let\tikzexternalcheckshellescape=\pdfshellescape }% \ifnum\tikzexternalcheckshellescape=1 - \def\tikzexternalcheckshellescape{\pgfkeysvalueof{/tikz/external/shell escape}\space}% + \def\tikzexternalcheckshellescape{\pgfkeysvalueof{/tikz/external/shell escape}\space}% \else - \def\tikzexternalcheckshellescape{}% + \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, + 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"% - }% + \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"% - }% - }% + \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 % -% }% +% \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"% - }% + \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 % - }% + \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 + % fallback. We do not know the driver here. + \csname tikzexternal@driver@pgfsys-pdftex.def\endcsname }{% - \csname tikzexternal@driver@\pgfsysdriver\endcsname + \csname tikzexternal@driver@\pgfsysdriver\endcsname }% @@ -329,7 +329,7 @@ \tikzsetexternalprefix{} % This method initialises automatic externalization. -% +% % The command does need any argument, but it has two optional ones: % % 1. \tikzexternalize[] @@ -348,67 +348,67 @@ % 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[]% - }% + \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}% - }% + \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 + \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 + \if1\tikzexternalize@hasbeencalled + #1% + \else + #2% + \fi }% -% If mode=`convert with system call', the boolean \ifpgfexternalreadmainaux +% 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 +% pdflatex -shell-escape mainjob.tex % is running. -% -% While it runs, +% +% While it runs, % a) it modifies its mainjob.aux file, % b) it issues pdflatex -jobname mainjob-figure0 mainjob.tex . % @@ -418,7 +418,7 @@ % avoid such failure, a locking mechanism is established. % % The locking mechanisms causes (a) to write a lock command into -% mainjob.auxlock +% mainjob.auxlock % just before (b) is called. Then, (b) will check it. After (b) has % completed, the lock will be reset. % @@ -437,66 +437,66 @@ % 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 + \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 + \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 + \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}% + \gdef\noexpand\tikzexternal@systemcall@reschedule@to@end@document{1}% }% % Expands to the default image extension (it is set by @@ -510,54 +510,54 @@ % 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 + \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 + \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. @@ -572,34 +572,34 @@ \tikzsetnextfilename{} -% These are few TeX dialect-specific commands which need to be overridden when used with +% These are few TeX dialect-specific commands which need to be overriden 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}. -% +% 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 +% \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 + \let\tikzpicture=\tikzexternal@tikzpicture@replacement }% \def\tikzexternal@TEXDIALECT@restore@picture{% - \let\tikzpicture=\tikzexternal@origpicture + \let\tikzpicture=\tikzexternal@origpicture }% @@ -617,77 +617,77 @@ % - 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 - % 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 + \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 + % 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[]}% + \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}}% + \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}% + \tikzexternal@tikz@replacement@opt@process{#1}{#2}% }% \def\tikzexternal@tikz@replacement@opt@@#1{% \def\tikz@next{\tikzexternal@tikz@replacement@collectnormalsemicolon{#1}}% @@ -696,41 +696,41 @@ \fi% \tikz@next} \long\def\tikzexternal@tikz@replacement@collectnormalsemicolon#1#2;{% - \tikzexternal@tikz@replacement@opt@process{#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;}% + \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 + \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 + \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 + \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. @@ -740,13 +740,13 @@ % #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 + \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. @@ -762,152 +762,152 @@ % 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% + \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 + % 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 + \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{}% + \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. =====}}% - }% + \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.}% + \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 + \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 + \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{} @@ -919,23 +919,23 @@ % 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 +% This command will be actived as soons 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 + \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. @@ -949,32 +949,32 @@ % 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}% + % 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 @@ -985,8 +985,8 @@ % 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}% + \edef\tikzexternal@temp{#1\tikzexternalimgextension: #2}% + \expandafter\tikzexternalwritetomakefile\expandafter{\tikzexternal@temp}% } % Adds a dependency for the NEXT picture which is about to be @@ -996,46 +996,46 @@ % #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 +% This command will be actived as soons 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 + \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 +% 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% + \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 + % 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 }% @@ -1043,118 +1043,118 @@ % 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}[]% - }% + \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\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}{}% give empty argument. - } + \pgfutil@ifnextchar\bgroup{% + \tikzexternal@optimize@away@cmd@auto@{#1}{#2}% + }{% + \tikzexternal@optimize@away@cmd@auto@{#1}{#2}{}% give empty argument. + } }% \def\tikzexternal@optimize@away@cmd@auto@#1#2#3{% - \tikzexternal@optimize@away@cmd@@@{#1}{#2}{{#3}}% <-- provide braces + \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 + \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 + \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{} in latex because \begin{} - % starts a local group - that must be closed properly. Make sure then \end does nothing: - \expandafter\let\csname end\tikzexternal@optimize@away@latex@env@\endcsname=\relax - \expandafter\end\expandafter{\tikzexternal@optimize@away@latex@env@}% + \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{} in latex because \begin{} + % starts a local group - that must be closed properly. Make sure then \end 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 + \pgfkeysvalueof{/tikz/external/optimize/install/.@cmd}\pgfeov }% \def\tikzexternal@optimize@RESTORE{% - \pgfkeysvalueof{/tikz/external/optimize/restore/.@cmd}\pgfeov + \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 + \let\endtikzpicture=\relax + \tikzexternal@TEXDIALECT@endpicture + \let\endtikzpicture=\tikzexternal@origendpicture + \let\tikzexternal@curfilename=\relax } % Throws a tikzpicture away - without further notice. @@ -1163,19 +1163,19 @@ % % See the 'optimize' key to disable this. \def\tikzexternal@skipfigure{% - \tikzexternal@TEXDIALECT@collectpicture\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% + \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 +% We need to do further work here to deal with NESTED tikzpicture environments % because all of them shall also be typeset normally. % % Idea: @@ -1185,126 +1185,126 @@ % % 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 + \tikzexternal@nestedflagfalse + \let\tikzpicture=\tikzexternal@normalpicture@begreplace + \let\endtikzpicture=\tikzexternal@normalpicture@endreplace + \tikzpicture } \def\tikzexternal@normalpicture@begreplace{% - \begingroup - \tikzexternal@nestedflagtrue - \tikzexternal@origpicture + \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 + \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@@ + \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 + \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}% + \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@@ + \tikzexternal@TEXDIALECT@collectpicture\tikzexternal@listmodepicture@@ } \long\def\tikzexternal@listmodepicture@@#1{\tikzexternal@listmodepicture@@@} \def\tikzexternal@listmodepicture@@@{% - \pgfkeysvalueof{/tikz/external/image discarded text}% - \tikzexternal@closeenvironments + \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@ + \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 + % + \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{}% - }% + \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 + \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 @@ -1320,7 +1320,7 @@ % 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. + tikzexternal: picture has been externalized. This text is required to avoid empty floats. }% % 1. Discards the current picture in this document. @@ -1329,7 +1329,7 @@ % process \tikzexternal@externalizefig. % 4. Assert that finally an image exists and use it. \def\tikzexternal@externalizefig@systemcall{% - \tikzexternal@TEXDIALECT@collectpicture\tikzexternal@externalizefig@systemcall@@ + \tikzexternal@TEXDIALECT@collectpicture\tikzexternal@externalizefig@systemcall@@ } { @@ -1358,10 +1358,10 @@ |xdef|tikzexternal@normal@backslash{\}% } { -\catcode`\^^I=12 +\catcode`\^^I=12 \catcode`\$=12 \catcode`\%=12 -\catcode`\#=12 +\catcode`\#=12 \gdef\tikzexternal@HASHchar{#} \gdef\tikzexternal@TABchar{^^I}\gdef\tikzexternal@PERCENTchar{%}\xdef\tikzexternal@DOLLARchar{$}} @@ -1372,130 +1372,131 @@ % #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 + \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\pgfutil@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 + \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 + \pgfutil@ifundefined{scantokens}{\long\def\scantokens##1{##1}}{}% + }% + % 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}% + \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 + \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 + % 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}}% + \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}% + \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'. @@ -1506,146 +1507,146 @@ % It is used as argument for \write{..} % % #1 the hash key to serialize. -% \def\tikzexternal@hashfct@serialize +% \def\tikzexternal@hashfct@serialize \long\def\tikzexternal@hashfct@serialize@std#1{% - \noexpand\def\noexpand\tikzexternallastkey{#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 + \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 +\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 + \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 existance 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 +% +% 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 + \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 + % 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}{}% + \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 + \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 @@ -1654,58 +1655,58 @@ % 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}% + \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 - }% + \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!? + \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 You are currently using 'mode=convert with system call'. This problem can happen if the image (or one of the images preceeding 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 (b) Issue the externalization command '\the\toks0' *manually* (also check the preceeding 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 + \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 \fi}% - \endgroup + \endgroup }% diff --git a/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryangles.code.tex b/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryangles.code.tex index 5a89e4defd1..364468a2eb4 100644 --- a/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryangles.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryangles.code.tex @@ -63,7 +63,7 @@ \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)}]} + eccentricity}*sqrt(1/2)*\tikz@lib@angle@rad pt)}]#2.center)}]} \expandafter\pgf@temp\expandafter[\tikzpictextoptions]{\tikzpictext};% \fi }% diff --git a/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarycalc.code.tex b/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarycalc.code.tex index 8911b82144e..561a725307f 100644 --- a/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarycalc.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarycalc.code.tex @@ -39,10 +39,6 @@ \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{% @@ -70,17 +66,6 @@ \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,{% @@ -94,10 +79,6 @@ \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}% diff --git a/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryintersections.code.tex b/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryintersections.code.tex index 5b0e83d5ee1..f3e4f94144b 100644 --- a/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryintersections.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryintersections.code.tex @@ -53,16 +53,23 @@ \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% + \ifx\tikz@intersect@namedpaths\pgfutil@empty% + \else% + \tikz@intersect@namedpaths% + % FIXME : it is reasonable to reset this globally as it is global + % in its nature. But the reset instruction should be moved to + % \endscope or something related. Resetting it here breaks the + % manual + \let\tikz@intersect@namedpaths=\pgfutil@empty% + \fi% }% \let\tikz@intersect@namedpaths=\pgfutil@empty diff --git a/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarymath.code.tex b/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarymath.code.tex index fd876f5d73c..bf95161576d 100644 --- a/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarymath.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarymath.code.tex @@ -7,7 +7,7 @@ % % See the file doc/generic/pgf/licenses/LICENSE for more details. -\usetikzlibrary{fpu} + \edef\tikz@math@at@catcode{\the\catcode`\@}% \catcode`\@=11 diff --git a/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryperspective.code.tex b/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryperspective.code.tex deleted file mode 100644 index 61a8016057c..00000000000 --- a/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibraryperspective.code.tex +++ /dev/null @@ -1,111 +0,0 @@ -% 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/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex b/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex index 1ce575aab62..2caf2c50695 100644 --- a/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex @@ -822,7 +822,7 @@ tikz@label@angle = #2, anchor=@auto, #1, - tikz@label@post = \tikz@label@distance] {\iftikz@handle@active@nodes\expandafter\pgfutil@scantokens\else\expandafter\pgfutil@firstofone\fi{#3\ignorespaces}} + tikz@label@post = \tikz@label@distance] {\iftikz@handle@active@nodes\expandafter\scantokens\else\expandafter\pgfutil@firstofone\fi{#3\ignorespaces}} \pgfextra{\global\let\tikz@last@fig@name=\tikz@save@last@fig@name} \egroup}}}% \endgroup @@ -852,7 +852,7 @@ tikz@label@angle = #2, anchor=@auto, #1, - tikz@label@post = \tikz@label@distance] {\iftikz@handle@active@nodes\expandafter\pgfutil@scantokens\else\expandafter\pgfutil@firstofone\fi{#3\ignorespaces}} + tikz@label@post = \tikz@label@distance] {\iftikz@handle@active@nodes\expandafter\scantokens\else\expandafter\pgfutil@firstofone\fi{#3\ignorespaces}} \pgfextra{\global\let\tikz@last@fig@name=\tikz@save@last@fig@name} \egroup}}}% @@ -1656,21 +1656,12 @@ % % 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% @@ -2018,7 +2009,6 @@ % 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}}}% @@ -2779,7 +2769,7 @@ \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{\pgfutil@scantokens{#1}}}% + \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}}% @@ -3833,8 +3823,6 @@ {\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% @@ -3881,8 +3869,8 @@ \else% \pgfutil@colorlet{.}{\tikz@textcolor}% \fi% - % FIXME : this here is the proposed solution for - % but it caused . + % FIXME : this here is the proposed solution for https://sourceforge.net/p/pgf/bugs/362/ + % bit 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% @@ -4338,7 +4326,7 @@ \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{\pgfutil@scantokens{#1}}}% + \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}}% @@ -4677,7 +4665,7 @@ \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{\pgfutil@scantokens{#1}}}% + \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% @@ -5173,8 +5161,8 @@ {\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% + \edef\tikz@temp{(#2)}% + \expandafter\tikz@@scan@@no@calculator\expandafter#1\tikz@temp% }% \def\tikz@@scan@@no@calculator#1(#2){% \pgfutil@in@{cs:}{#2}% @@ -5338,7 +5326,6 @@ \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% }% diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf.lua index b0a32476167..da0aba39121 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf.lua @@ -19,7 +19,7 @@ pgf = {} --- Forward +-- Forward local tostring_table --- diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd.lua index 20d8acafa59..cf94454a494 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd.lua @@ -38,7 +38,7 @@ require("pgf").gd = gd -- 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 +-- this, each entry of the table should be of the form -- -- key = 'string' -- @@ -50,13 +50,13 @@ require("pgf").gd = gd function gd.new_algorithm_class (class) class.__index = class - class.new = - function (initial) + class.new = + function (initial) -- Create new object local obj = {} for k,v in pairs(initial) do - obj[k] = v + obj[k] = v end setmetatable(obj, class) @@ -69,4 +69,4 @@ function gd.new_algorithm_class (class) end -return gd +return gd \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/bindings/Binding.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/bindings/Binding.lua index 6ffb4168f52..5b60d90ccd6 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/bindings/Binding.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/bindings/Binding.lua @@ -38,7 +38,7 @@ local Storage = require "pgf.gd.lib.Storage" -- -- @field storage A |Storage| storing the information passed from the -- display layer. The interpretation of this left to the actual --- binding. +-- binding. local Binding = { storage = Storage.newTableStorage () @@ -71,7 +71,7 @@ end -- 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|. +-- initial value and call |InterfaceToDisplay.setOptionInitial|. -- -- @param t See |InterfaceToAlgorithms.declare| for details. @@ -105,7 +105,7 @@ end --- --- This function and the corresponding |...Stop...| functions are +-- This function and the correspoding |...Stop...| functions are -- called whenever a collection kind should be rendered. See -- |InterfaceToDisplay.render_collections| for details. -- @@ -141,7 +141,7 @@ end --- --- This function and the corresponding |...Stop...| functions are +-- This function and the correspoding |...Stop...| functions are -- called whenever a vertex should be rendered. See -- |InterfaceToDisplay.render_vertices| for details. -- @@ -191,7 +191,7 @@ end --- --- This function and the corresponding |...Stop...| functions are +-- This function and the correspoding |...Stop...| functions are -- called whenever an edge should be rendered. See -- |InterfaceToDisplay.render_edges| for details. -- @@ -237,22 +237,21 @@ end -- 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. +-- 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. +-- \item |name| If present, this name will be given to the +-- node. If not present, an iternal 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) diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/bindings/BindingToPGF.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/bindings/BindingToPGF.lua index 5324a1652e6..90519e23d55 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/bindings/BindingToPGF.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/bindings/BindingToPGF.lua @@ -20,7 +20,7 @@ local Storage = require "pgf.gd.lib.Storage" -- 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") @@ -44,7 +44,7 @@ local Storage = require "pgf.gd.lib.Storage" -- (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, +-- |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 @@ -81,7 +81,7 @@ local coordinate_in_pgf_syntax function BindingToPGF:resumeGraphDrawingCoroutine(text) tex.print(text) - tex.print("\\pgfgdresumecoroutinetrue") + tex.print("\\pgfgdresumecoroutinetrue") end @@ -108,7 +108,7 @@ end function BindingToPGF:renderCollection(collection) tex.print("\\pgfgdcallbackrendercollection{".. collection.kind .. "}{" - .. table_in_pgf_syntax(collection.generated_options) .. "}") + .. table_in_pgf_syntax(collection.generated_options) .. "}") end function BindingToPGF:renderCollectionStartKind(kind, layer) @@ -133,11 +133,11 @@ 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 @@ -180,12 +180,12 @@ local function rigid(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 @@ -194,7 +194,7 @@ function BindingToPGF:renderEdge(e) return "" end end - + local callback = { '\\pgfgdcallbackedge', '{', e.tail.name .. get_anchor(e, "tail anchor"), '}', @@ -205,12 +205,12 @@ function BindingToPGF:renderEdge(e) '{', 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]) @@ -231,19 +231,19 @@ function BindingToPGF:renderEdge(e) .. to_pt(d2.x) .. ',' .. to_pt(d2.y) .. ')..' callback [#callback + 1] = '(' .. to_pt(d3.x) .. ',' .. to_pt(d3.y) .. ')' i = i + 1 - else + 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 @@ -275,12 +275,12 @@ 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), ",") + if table.value then + return prefix .. table.key .. suffix .. "={" .. tostring(table.value) .. "}" + else + return prefix .. table.key .. suffix + end + end), ",") end @@ -288,29 +288,29 @@ 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) + 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 @@ -332,12 +332,12 @@ 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]) @@ -355,10 +355,10 @@ function path_in_pgf_syntax (p) 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) .. '}}' + .. to_pt(d2.x) .. '}{' .. to_pt(d2.y) .. '}}{\\pgfqpoint{' + .. to_pt(d3.x) .. '}{' .. to_pt(d3.y) .. '}}' i = i + 1 - else + else error("illegal operation in edge path") end end diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/circular/Tantau2012.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/circular/Tantau2012.lua index bebb87ab3e1..8e0d7d5bc66 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/circular/Tantau2012.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/circular/Tantau2012.lua @@ -22,7 +22,7 @@ local Tantau2012 = {} declare { key = "simple necklace layout", algorithm = Tantau2012, - + postconditions = { upward_oriented = true }, @@ -48,15 +48,15 @@ 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. + -- 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 @@ -67,11 +67,11 @@ function Tantau2012:run() 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 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) + carry = math.max(needed-sib_dists[i],0) end local length = ideal_pos + carry @@ -98,15 +98,15 @@ function Tantau2012:computeNodeDistances() 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 + -- 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 @@ -130,24 +130,24 @@ function Tantau2012:adjustNodeRadii(sib_dists,radii) local total = 0 local max_rad = 0 for i=1,#radii do - total = total + 2*radii[i] + 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]) + 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 +return Tantau2012 \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/circular/doc.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/circular/doc.lua index 0bd9090a1c1..e532e783e11 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/circular/doc.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/circular/doc.lua @@ -19,23 +19,20 @@ 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. -]] +[[ 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 +``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. +\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 @@ -44,7 +41,7 @@ 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, @@ -52,38 +49,35 @@ in the graph, the edges are not taken into consideration, unless the { 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|. +\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 @@ -107,8 +101,8 @@ example 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 }; - + 4 [minimum size=50pt] -- 5 [minimum size=40pt] -- 6 -- 7 }; + \draw [red] (0,-1.25) circle []; \end{tikzpicture} ]] @@ -119,7 +113,7 @@ example 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 }; + 4 [minimum size=50pt] -- 5 [minimum size=40pt] -- 6 -- 7 }; ]] example @@ -128,7 +122,7 @@ example 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 }; + 4 [minimum size=50pt] -- 5 [minimum size=40pt] -- 6 -- 7 }; ]] example @@ -137,6 +131,6 @@ example 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 }; + 4 [minimum size=50pt] -- 5 [minimum size=40pt] -- 6 -- 7 }; ]] -------------------------------------------------------------------- diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/Anchoring.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/Anchoring.lua index 03a05ee627d..ccbb097583c 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/Anchoring.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/Anchoring.lua @@ -23,29 +23,29 @@ -- \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. +-- \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|. +-- this node lies at the poistion specified by |anchor at|. -- -- @end @@ -70,7 +70,7 @@ declare { type = "coordinate", documentation_in = "pgf.gd.control.doc" } - + --- declare { key = "anchor node", diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/ComponentAlign.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/ComponentAlign.lua index 5e5b0635bf4..dec07caaccd 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/ComponentAlign.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/ComponentAlign.lua @@ -47,22 +47,22 @@ local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare -- -- @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. + 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 }; + examples = [[" + \tikz \graph [binary tree layout, nodes={draw}] + { a, b -- c[align here], d -- e[second, align here] -- f }; "]] } @@ -72,94 +72,81 @@ 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. - % + 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. - % + \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. - % + \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: - % + 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. - % + \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, @@ -170,11 +157,10 @@ declare { component align=counterclockwise bounding box] { a, "high\\node" -- b}; \end{codeexample} - % - \item \declare{|clockwise bounding box|} - - Works like |counterclockwise bounding box|. - \end{itemize} + \item \declare{|clockwise bounding box|} + + Works like |counterclockwise bounding box|. + \end{itemize} "]] } @@ -187,16 +173,16 @@ declare { { 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. + 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}; + examples = [[" + \tikz \graph [tree layout, nodes={draw, align=center}, + components go right top aligned] + { a, "high\\node" -- b}; "]] } @@ -208,17 +194,17 @@ declare { { 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. + + 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}; + \tikz \graph [tree layout, nodes={draw, align=center}, + components go right absolute top aligned] + { a, "high\\node" -- b}; "]] } @@ -230,7 +216,7 @@ declare { { key = "component direction", value=0}, { key = "component align", value = "clockwise"}, }, - + summary = "See the other |components go ...| keys." } @@ -243,7 +229,7 @@ declare { { key = "component direction", value=0}, { key = "component align", value = "clockwise bounding box"}, }, - + summary = "See the other |components go ...| keys." } @@ -256,7 +242,7 @@ declare { { key = "component direction", value=0}, { key = "component align", value = "center"}, }, - + summary = "See the other |components go ...| keys." } @@ -269,11 +255,11 @@ declare { { key = "component direction", value=0}, { key = "component align", value = "first node"}, }, - - summary = [[" - Shorthand for |component direction=right| and - |component align=first node|. - "]] + + summary = [[" + Shorthand for |component direction=right| and + |component align=first node|. + "]] } @@ -285,13 +271,13 @@ declare { { 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}; + examples = [[" + \tikz \graph [tree layout, nodes={draw, align=center}, + components go left top aligned] + { a, "high\\node" -- b}; "]] } @@ -304,7 +290,7 @@ declare { { key = "component direction", value=180}, { key = "component align", value = "clockwise bounding box"}, }, - + summary = "See the other |components go ...| keys." } @@ -318,7 +304,7 @@ declare { { key = "component direction", value=180}, { key = "component align", value = "counterclockwise"}, }, - + summary = "See the other |components go ...| keys." } @@ -332,7 +318,7 @@ declare { { key = "component direction", value=180}, { key = "component align", value = "counterclockwise bounding box"}, }, - + summary = "See the other |components go ...| keys." } @@ -374,15 +360,17 @@ declare { }, 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}}; - "]] + 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}}; + "]] } } diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/ComponentDirection.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/ComponentDirection.lua index f941ff226ec..a84800d94cf 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/ComponentDirection.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/ComponentDirection.lua @@ -25,32 +25,35 @@ declare { 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. + 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. + 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 }; - "]] + 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 }; + "]] } } diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/ComponentDistance.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/ComponentDistance.lua index 7ba4d000a7a..5bf473e9c6a 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/ComponentDistance.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/ComponentDistance.lua @@ -23,7 +23,7 @@ local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare -- -- @end - + --- declare { @@ -31,74 +31,70 @@ declare { 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} + documentation = [[" + Given two components, their distance is computed as follows in + depencende 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 similary, 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} "]] } diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/ComponentOrder.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/ComponentOrder.lua index 78537b614cd..0cad5d7d9b5 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/ComponentOrder.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/ComponentOrder.lua @@ -13,7 +13,7 @@ local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare - + --- -- @section subsubsection {Ordering the Components} @@ -33,44 +33,46 @@ declare { 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. + 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} + 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 }; - "]] + 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 { @@ -79,11 +81,11 @@ declare { { key = "component order", value = "increasing node number" } }, - summary = [[" - A shorthand for |component order=increasing node number|. - "]] + summary = [[" + A shorthand for |component order=increasing node number|. + "]] } - + --- declare { @@ -91,15 +93,15 @@ declare { use = { { key = "component order", value = "decreasing node number" }, }, - summary = [[" - A shorthand for |component order=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 }; + \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/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/Components.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/Components.lua index c5019a56e23..9d9621e6da4 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/Components.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/Components.lua @@ -35,57 +35,57 @@ local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare -- -- 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. +-- \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. +-- 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. +-- 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 @@ -95,33 +95,35 @@ local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare --- - + 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. + 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 - }; - "]] + 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/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/Distances.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/Distances.lua index 6dc5a13018d..c1b64729fab 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/Distances.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/Distances.lua @@ -24,24 +24,24 @@ local lib = require "pgf.gd.lib" -- general keys that will be used by many algorithms. -- -- There are different kinds of objects for which you can specify --- distances and paddings: --- % +-- 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. +-- \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) honour 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 avaiable. -- \end{itemize} -- -- @end @@ -56,23 +56,23 @@ declare { 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. + 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} + \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} "]] } @@ -84,24 +84,26 @@ declare { 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. + 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 }; - "]] + 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 }; + "]] } } @@ -112,13 +114,13 @@ declare { type = "length", initial = ".333em", - summary = [[" - Works like |node pre sep|. - "]] + summary = [[" + Works like |node pre sep|. + "]] } + - - + --- -- @param length A length. @@ -129,9 +131,9 @@ declare { { 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$. + summary = [[" + A shorthand for setting both |node pre sep| and |node post sep| to + $\meta{length}/2$. "]] } @@ -143,26 +145,26 @@ declare { 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. + 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} + \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 { +declare { key = "layer distance", type = "length", use = { @@ -177,25 +179,25 @@ declare { 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. + 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{lrngth} 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} + \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} "]] } @@ -206,13 +208,13 @@ declare { type = "length", initial = ".333em", - summary = [[" - Works like |level pre sep|. - "]] + summary = [[" + Works like |level pre sep|. + "]] } - + --- -declare { +declare { key = "layer pre sep", type = "length", use = { @@ -222,7 +224,7 @@ declare { } --- -declare { +declare { key = "layer post sep", type = "length", use = { @@ -245,17 +247,17 @@ declare { { 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|. + 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 { +declare { key = "layer sep", type = "number", use = { @@ -271,25 +273,28 @@ declare { 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. + 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} }; - "]] + 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} }; + "]] } } @@ -301,13 +306,13 @@ declare { type = "length", initial = ".333em", - summary = [[" - Works like |level pre sep|, only for siblings. + 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} }; + \tikz \graph [tree layout, sibling distance=0cm, nodes={circle,draw}, + sibling sep=0pt] + { 1--{2,3[sibling pre sep=1cm],4,5} }; "]] } @@ -318,11 +323,11 @@ declare { type = "length", initial = ".333em", - summary = [[" - Works like |sibling pre sep|. + summary = [[" + Works like |sibling pre sep|. "]] } - + --- @@ -336,26 +341,26 @@ declare { { 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$. + 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. + summary = [[" + This is minimum distance between the centers of ``parts'' of a + graph. What a ``part'' is depends on the algorithm. "]] } @@ -377,7 +382,7 @@ declare { initial = "1em", summary = "A post-padding for pars." } - + --- @@ -391,9 +396,9 @@ declare { { 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$. + summary = [[" + A shorthand for setting both |part pre sep| and |part post sep| to + $\meta{length}/2$. "]] } @@ -407,31 +412,33 @@ declare { 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. + summary = [[" + This is pading 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; - }; - "]] - } + 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; + }; + "]] + } } @@ -444,11 +451,11 @@ declare { 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.) + 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 +return Distances \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/FineTune.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/FineTune.lua index 87d67b5b56f..be1666b255b 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/FineTune.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/FineTune.lua @@ -28,20 +28,20 @@ declare { 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. + 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; - }; + \tikz \graph [edges=rounded corners, nodes=draw, + layered layout, sibling distance=0] { + a -- {b, c, d[nudge=(up:2mm)]} -- e -- a; + }; "]] } @@ -58,10 +58,10 @@ declare { 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; - }; + \tikz \graph [edges=rounded corners, nodes=draw, + layered layout, sibling distance=0] { + a -- {b, c, d[nudge up=2mm]} -- e -- a; + }; "]] } @@ -91,10 +91,10 @@ declare { 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; - }; + \tikz \graph [edges=rounded corners, nodes=draw, + layered layout, sibling distance=0] { + a -- {b, c, d[nudge left=2mm]} -- e -- a; + }; "]] } @@ -118,18 +118,18 @@ declare { 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). + 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; - }; + \tikz \graph [edges=rounded corners, nodes=draw, + layered layout, sibling distance=0] { + a -- {b,c,d[regardless at={(1,0)}]} -- e -- a; + }; "]] } @@ -148,17 +148,17 @@ declare { }, 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. + 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; - }; + \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/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/LayoutPipeline.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/LayoutPipeline.lua index 1c5e48b4c7e..c998ca490aa 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/LayoutPipeline.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/LayoutPipeline.lua @@ -21,48 +21,48 @@ -- Before an algorithm is applied, a number of transformations will -- have been applied, depending on the algorithm's |preconditions| -- field: --- % +-- -- \begin{itemize} --- \item |connected| +-- \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| +-- 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, 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. +-- When set, all loops (arcs from a vertex to itself) will have been +-- removed when the algorithm runs. -- --- \item |at_least_two_nodes| +-- \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. +-- 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| +-- \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, 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. +-- 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} -- -- @@ -71,22 +71,23 @@ -- 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. +-- \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) @@ -127,39 +128,39 @@ 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. +-- The main ``graph drawing pipeline'' that handles the pre- and +-- postprocessing for a graph. This method is called by the diplay +-- 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 }) - + 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 @@ -173,7 +174,7 @@ end -- @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. +-- been contracted to single nodes. -- @param layout The layout to which the graph belongs. -- function LayoutPipeline.runOnLayout(scope, algorithm_class, layout_graph, layout) @@ -188,12 +189,12 @@ function LayoutPipeline.runOnLayout(scope, algorithm_class, layout_graph, layout 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) + 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 } @@ -201,17 +202,17 @@ function LayoutPipeline.runOnLayout(scope, algorithm_class, layout_graph, layout -- 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']) - + math.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) + digraph:disconnect(v,v) end end @@ -221,15 +222,15 @@ function LayoutPipeline.runOnLayout(scope, algorithm_class, layout_graph, layout -- 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() + 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, @@ -239,14 +240,14 @@ function LayoutPipeline.runOnLayout(scope, algorithm_class, layout_graph, 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 + spanning_algorithm_class.new{ + ugraph = ugraph, + events = scope.events }:run() end @@ -260,43 +261,43 @@ function LayoutPipeline.runOnLayout(scope, algorithm_class, layout_graph, layout 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) + LayoutPipeline.runOldGraphModel(scope, digraph, algorithm_class, algorithm) else - algorithm:run () + 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() + 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() + 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 @@ -316,7 +317,7 @@ end -- procedure described in -- Section~\ref{subsection-library-graphdrawing-anchoring}. These -- transformations are always performed. --- +-- -- @param graph A graph -- @param scope The scope @@ -324,7 +325,7 @@ 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] @@ -336,10 +337,10 @@ function LayoutPipeline.anchor(graph, scope) 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 @@ -360,7 +361,7 @@ 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. +-- pieces of information togehter 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 @@ -371,12 +372,12 @@ end -- @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 @@ -385,7 +386,7 @@ function LayoutPipeline.prepareRotateAround(postconditions, graph) 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 @@ -393,15 +394,15 @@ function LayoutPipeline.prepareRotateAround(postconditions, graph) 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 @@ -415,9 +416,9 @@ function LayoutPipeline.prepareRotateAround(postconditions, graph) local other = lib.find_min( graph:outgoing(v), function (a) - if a.head ~= v and a:eventIndex() then - return a, a:eventIndex() - end + 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]) @@ -439,57 +440,55 @@ end -- 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|, +-- \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. +-- 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 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 @@ -502,7 +501,7 @@ end -- --- Rotate the whole graph around a point +-- 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| @@ -517,21 +516,21 @@ end -- 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) @@ -547,7 +546,7 @@ end --- +-- -- Orient the whole graph using two nodes -- -- The whole graph is rotated so that the line from the first node to @@ -558,17 +557,17 @@ end -- @param first_node -- @param seond_node -- @param target_angle --- @param swap +-- @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) + first_node.pos.y, angle, target_angle, swap) end end @@ -577,25 +576,25 @@ 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 + LayoutPipeline.orientTwoNodes(graph, n1, n2, orient/360*2*math.pi, flag) + return true end end end @@ -609,32 +608,32 @@ function LayoutPipeline.orient(rotation_info, postconditions, graph, scope) 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 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 + 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 @@ -644,21 +643,21 @@ function LayoutPipeline.orient(rotation_info, postconditions, graph, scope) 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 + if second then + third = v + break + else + second = v + end + else + first = v end end end @@ -668,13 +667,13 @@ function LayoutPipeline.orient(rotation_info, postconditions, graph, scope) 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 @@ -690,74 +689,74 @@ end -- -- @param graph A to-be-decomposed graph -- --- @return An array of graph objects that represent the connected components of the 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 + 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 + 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 + 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 + local new_a = c:connect(a.tail, a.head) + new_a.syntactic_edges = a.syntactic_edges end end end - + return components end @@ -785,23 +784,23 @@ end -- Right now, we hardcode the functions here. Perhaps make this -- dynamic in the future. Could easily be done on the tikzlayer, --- actually. +-- acutally. LayoutPipeline.component_ordering_functions = { - ["increasing node number"] = - function (g,h) + ["increasing node number"] = + function (g,h) if #g.vertices == #h.vertices then - return g.vertices[1].event.index < h.vertices[1].event.index + return g.vertices[1].event.index < h.vertices[1].event.index else - return #g.vertices < #h.vertices + return #g.vertices < #h.vertices end end, - ["decreasing node number"] = - function (g,h) + ["decreasing node number"] = + function (g,h) if #g.vertices == #h.vertices then - return g.vertices[1].event.index < h.vertices[1].event.index + return g.vertices[1].event.index < h.vertices[1].event.index else - return #g.vertices > #h.vertices + return #g.vertices > #h.vertices end end, ["by first specified node"] = nil, @@ -811,27 +810,27 @@ LayoutPipeline.component_ordering_functions = { 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) + 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 @@ -840,12 +839,12 @@ local function compute_rotated_bb(vertices, angle, sep, bb) 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 @@ -856,9 +855,9 @@ end ---- +--- -- This internal function packs the components of a graph. See --- Section~\ref{subsection-gd-component-packing} for details. +-- Section~\ref{subsection-gd-component-packing} for details. -- -- @param graph The graph -- @param components A list of components @@ -867,14 +866,14 @@ 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 @@ -883,24 +882,24 @@ function LayoutPipeline.packComponents(syntactic_digraph, components) for _,a in ipairs(c.arcs) do for _,p in ipairs(a:pointCloud()) do - vs [#vs + 1] = Vertex.new { pos = p } + 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) @@ -908,7 +907,7 @@ function LayoutPipeline.packComponents(syntactic_digraph, components) 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 @@ -922,15 +921,15 @@ function LayoutPipeline.packComponents(syntactic_digraph, components) line = min_center_y elseif valign == "first node" then line = bb[c.vertices[1]].c_y - else + 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 + line = bb[v].c_y + break end end @@ -957,9 +956,9 @@ function LayoutPipeline.packComponents(syntactic_digraph, components) 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 @@ -967,41 +966,41 @@ function LayoutPipeline.packComponents(syntactic_digraph, components) 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) + 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]) + -- 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 @@ -1017,30 +1016,30 @@ function LayoutPipeline.packComponents(syntactic_digraph, components) 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) + 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 + -- 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 @@ -1052,10 +1051,10 @@ function LayoutPipeline.packComponents(syntactic_digraph, components) shift = right_max - left_min else for i=1,#y_values do - shift = math.max(shift, right_face[i] - left_face[i]) + 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 @@ -1064,12 +1063,12 @@ function LayoutPipeline.packComponents(syntactic_digraph, components) 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 @@ -1095,13 +1094,13 @@ prepare_events = for i=1,#events do if events[i].kind == "begin" then - stack[#stack + 1] = i + 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 + local tos = stack[#stack] + stack[#stack] = nil -- pop + + events[tos].end_index = i + events[i].begin_index = tos end end end @@ -1125,48 +1124,48 @@ function LayoutPipeline.cutEdges(graph) 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 + + 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 + + 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 @@ -1201,7 +1200,7 @@ local function compatibility_digraph_to_graph(scope, g) 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 @@ -1213,13 +1212,13 @@ local function compatibility_digraph_to_graph(scope, g) 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, - }, + 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, @@ -1235,38 +1234,38 @@ local function compatibility_digraph_to_graph(scope, g) 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 + 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 + 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 + 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 @@ -1275,7 +1274,7 @@ local function compatibility_digraph_to_graph(scope, g) graph:addCluster(cluster) for _,v in ipairs(c.vertices) do if g:contains(v) then - cluster:addNode(graph:findNode(v.name)) + cluster:addNode(graph:findNode(v.name)) end end end @@ -1293,7 +1292,7 @@ local function compatibility_graph_to_digraph(graph) 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) + c[#c+1] = Coordinate.new (x.x, x.y) end e.orig_m:setPolylinePath(c) end @@ -1310,12 +1309,12 @@ function LayoutPipeline.runOldGraphModel(scope, digraph, algorithm_class, algori 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) @@ -1325,12 +1324,12 @@ function LayoutPipeline.runOldGraphModel(scope, digraph, algorithm_class, algori -- 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) @@ -1344,4 +1343,4 @@ end -- Done -return LayoutPipeline +return LayoutPipeline \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/NodeAnchors.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/NodeAnchors.lua index 80aa7ef420a..e7d44d7d10e 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/NodeAnchors.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/NodeAnchors.lua @@ -18,9 +18,9 @@ local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare -- -- \label{section-gd-anchors} -- --- When a graph has been laid out completely, the edges between the +-- When a graph has been layed 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 +-- 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. -- @@ -37,7 +37,7 @@ local declare = require "pgf.gd.interface.InterfaceToAlgorithms".declare -- 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. +-- of the edge's path with the nodes' paths. --- @@ -47,41 +47,41 @@ declare { type = "string", initial = "", - summary = [[" - Specifies where in the tail vertex the edge should start. + 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). + 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 { @@ -101,10 +101,10 @@ declare { 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. + 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. "]] } @@ -130,24 +130,23 @@ declare { 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} + 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. + 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. + 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} + regardless of the edges' cut values. + \end{itemize} "]] } - + --- -declare { +declare { key = "allow inside edges", type = "boolean", initial = "true", @@ -155,21 +154,21 @@ declare { 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''. + 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] - }; - "]] + \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/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/Orientation.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/Orientation.lua index 1890fa4f39d..10f5ecdf471 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/Orientation.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/Orientation.lua @@ -27,7 +27,7 @@ -- 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. +-- so-called ``growth direction'' for trees. -- -- @end @@ -48,40 +48,42 @@ declare { 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. + 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 und 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; - }; - "]] + 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; + }; + "]] } } @@ -93,16 +95,16 @@ declare { type = "direction", default = 0, - summary = [[" - Same as |orient|, only the rest of the graph should be - flipped relative to the connection line. + 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; - }; + \tikz \graph [spring layout] + { + a -- { b, c, d[> orient'=right], e -- {f, g, h} }; + h -- a; + }; "]] } @@ -112,24 +114,26 @@ declare { key = "orient tail", type = "string", - summary = [[" - Specifies the tail vertex for the orientation of a graph. See - |orient| for details. + 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; - }; - "]] + 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; + }; + "]] } } - + @@ -140,21 +144,23 @@ declare { key = "orient head", type = "string", - summary = [[" - Specifies the head vertex for the orientation of a graph. See - |orient| for details. + 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 }; - "]] + 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 }; + "]] } } @@ -164,17 +170,17 @@ 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. + 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 }; + examples = [[" + \tikz \graph [spring layout] { a -- b -- c -- a }; + \tikz \graph [spring layout, horizontal=a to b] { a -- b -- c -- a }; "]] } - + @@ -184,11 +190,11 @@ declare { key = "horizontal'", type = "string", - summary = [[" - Like |horizontal|, but with a flip. + summary = [[" + Like |horizontal|, but with a flip. "]] } - + @@ -201,15 +207,16 @@ declare { key = "vertical", type = "string", - summary = [[" - A shorthand for specifying |orient tail|, |orient head| and |orient=-90|. + 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 }; + \tikz \graph [spring layout] { a -- b -- c -- a }; + \tikz \graph [spring layout, vertical=a to b] { a -- b -- c -- a }; "]] } - + @@ -220,8 +227,8 @@ declare { key = "vertical'", type = "string", - summary = [[" - Like |vertical|, but with a flip. + summary = [[" + Like |vertical|, but with a flip. "]] } @@ -233,50 +240,54 @@ 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. + 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: + 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 + honour 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}; - }; - "]] + 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}; + }; + "]] } } @@ -289,11 +300,11 @@ declare { 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; - }; + \tikz \graph [layered layout, sibling distance=5mm] + { + a [grow'=right] -- { b, c, d, e -- {f, g, h} }; + { h, g } -- a; + }; "]] } diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/Sublayouts.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/Sublayouts.lua index 970483193f0..c28d12db563 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/Sublayouts.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/Sublayouts.lua @@ -15,7 +15,7 @@ local function full_print(g, pref) 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 @@ -23,16 +23,16 @@ local function full_print(g, pref) 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. +-- The |Sublayouts| module handles graphs for which multiple layouts are defined. -- -- Please see Section~\ref{section-gd-sublayouts} for an overview of --- sublayouts. +-- sublayouts. -- local Sublayouts = {} @@ -80,7 +80,7 @@ end -- Nudge positioning. You can call this function several times on the --- same graph; nudging will be done only once. +-- same graph; nudging will be done only once. -- -- @param graph A graph -- @@ -100,28 +100,28 @@ end -- -- @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 +-- @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 + 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() + cloud[#cloud+1] = p:clone() end end end @@ -137,13 +137,13 @@ local function create_subgraph_node(scope, syntactic_digraph, vertex) 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 = {} @@ -191,22 +191,22 @@ end -- @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: @@ -214,57 +214,57 @@ function Sublayouts.layoutRecursively(scope, layout, fun) 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 + 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 + 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 @@ -273,19 +273,19 @@ function Sublayouts.layoutRecursively(scope, layout, fun) 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] + 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 @@ -294,37 +294,37 @@ function Sublayouts.layoutRecursively(scope, layout, fun) -- 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 + + 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 + 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) + local arc = syntactic_digraph:connect(e.tail, e.head) arc.syntactic_edges[#arc.syntactic_edges+1] = e end @@ -335,13 +335,13 @@ function Sublayouts.layoutRecursively(scope, layout, fun) -- 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 + -- 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 @@ -353,7 +353,7 @@ function Sublayouts.layoutRecursively(scope, layout, fun) local intersection = {} for _,v in ipairs(g.vertices) do if syntactic_digraph:contains(v) then - intersection[#intersection+1] = v + intersection[#intersection+1] = v end end if #intersection > 0 then @@ -361,33 +361,33 @@ function Sublayouts.layoutRecursively(scope, layout, fun) -- 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) + 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 + 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) + 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 + 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 @@ -398,33 +398,33 @@ function Sublayouts.layoutRecursively(scope, layout, fun) 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] + -- 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) + 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 @@ -432,14 +432,14 @@ function Sublayouts.layoutRecursively(scope, layout, fun) end -- Sort the vertices - table.sort(syntactic_digraph.vertices, function(u,v) return u.event.index < v.event.index end) - + 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) - + 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) @@ -457,36 +457,36 @@ function Sublayouts.layoutRecursively(scope, layout, fun) -- 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) + 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 + 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 + 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 @@ -498,16 +498,16 @@ function Sublayouts.layoutRecursively(scope, layout, fun) 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 + -- 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 @@ -531,6 +531,6 @@ end --- Done +-- Done -return Sublayouts +return Sublayouts \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/doc.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/doc.lua index c7adfab830e..2d8317bd72d 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/doc.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/doc.lua @@ -30,7 +30,6 @@ 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); @@ -40,7 +39,6 @@ always be fulfill: }; \end{tikzpicture} \end{codeexample} -% \begin{codeexample}[] \begin{tikzpicture} \draw [help lines] (0,0) grid (3,2); @@ -50,7 +48,6 @@ always be fulfill: }; \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 @@ -60,7 +57,6 @@ 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); @@ -70,7 +66,6 @@ Section~\ref{section-graphs-xy}) to specify desired positions: }; \end{tikzpicture} \end{codeexample} -% \begin{codeexample}[] \begin{tikzpicture} \draw [help lines] (0,0) grid (3,2); @@ -80,7 +75,7 @@ Section~\ref{section-graphs-xy}) to specify desired positions: }; \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 @@ -88,10 +83,10 @@ the graph drawing algorithm may clash. Graph drawing algorithms are 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''. +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 @@ -139,21 +134,19 @@ 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. +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 -% +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}. +\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. ]] @@ -170,7 +163,7 @@ 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} @@ -185,15 +178,15 @@ 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. +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} @@ -223,7 +216,7 @@ 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/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/library.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/library.lua index df7ce68dd94..e25e0cd628e 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/library.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/control/library.lua @@ -38,29 +38,29 @@ declare { 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. + 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 behaviour 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 behaviour 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)}] }; + \tikz \graph [simple necklace layout, nodes={draw,fill=white}, + nodes behind edges] + { subgraph K_n [n=7], 1 [regardless at={(0,-1)}] }; "]] -} - +} + --- declare { @@ -69,13 +69,13 @@ declare { { key = "nodes behind edges", value = "false" }, }, - summary = [[" - This is the default placement of edges: Behind the nodes. + summary = [[" + This is the default placemenet 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)}] }; + \tikz \graph [simple necklace layout, nodes={draw,fill=white}, + edges behind nodes] + { subgraph K_n [n=7], 1 [regardless at={(0,-1)}] }; "]] } @@ -85,14 +85,14 @@ declare { 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. + 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 { @@ -111,42 +111,45 @@ declare { 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. + 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; - }; - "]] + 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 - }; + 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 + }; + "]], } } @@ -158,24 +161,24 @@ declare { type = "number", initial = "0", - summary = [[" - The radius of a circular object used in graph drawing. + 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 + 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.", } diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/deprecated/Cluster.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/deprecated/Cluster.lua index d7baed45daa..0b8d9e324fb 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/deprecated/Cluster.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/deprecated/Cluster.lua @@ -12,7 +12,7 @@ ---- The Cluster class defines a model of a cluster inside a graph. +--- The Cluser class defines a model of a cluster inside a graph. -- -- diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/deprecated/Edge.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/deprecated/Edge.lua index 7355597955e..7d6369d2bc9 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/deprecated/Edge.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/deprecated/Edge.lua @@ -43,7 +43,7 @@ Edge.NONE = "-!-" -- |nodes|: TODO \par -- |edge_nodes|: TODO \par -- |options|: TODO \par --- |tikz_options|: TODO \par +-- |tikz_options|: TODO \par -- |direction|: TODO \par -- |bend_points|: TODO \par -- |bend_nodes|: TODO \par @@ -90,14 +90,14 @@ 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, +-- @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) + return lib.lookup_option(name, self, graph) end @@ -134,7 +134,7 @@ end --- Returns all nodes of the edge. -- --- Instead of calling |edge:getNodes()| the nodes can alternatively be +-- Instead of calling |edge:getNodes()| the nodes can alternatively be -- accessed directly with |edge.nodes|. -- -- @return All edges of the node. @@ -168,11 +168,11 @@ end ---- Gets first neighbor of the node (disregarding hyperedges). +--- Gets first neighbour of the node (disregarding hyperedges). -- --- @param node The node which first neighbor should be returned. +-- @param node The node which first neighbour should be returned. -- --- @return The first neighbor of the node. +-- @return The first neighbour of the node. -- function Edge:getNeighbour(node) if node == self.nodes[1] then @@ -199,7 +199,7 @@ function Edge:getHead() -- 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 + -- 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 @@ -230,9 +230,9 @@ end -- -- 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 +-- 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. @@ -246,7 +246,7 @@ function Edge:isHead(node) -- 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 + -- 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 @@ -267,8 +267,8 @@ end -- 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 +-- 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. @@ -279,7 +279,7 @@ end -- 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 @@ -338,7 +338,7 @@ function Edge:__tostring() 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: diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/deprecated/Graph.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/deprecated/Graph.lua index 161b89fd15d..23712278990 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/deprecated/Graph.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/deprecated/Graph.lua @@ -127,9 +127,9 @@ function Graph:addNode(node) if not self:findNode(node.name) then -- Does the node have an index, yet? if not node.index then - node.index = #self.nodes + 1 + node.index = #self.nodes + 1 end - + table.insert(self.nodes, node) end end @@ -143,8 +143,8 @@ end -- @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 + local _, index = lib.find(self.nodes, function (other) + return other.name == node.name end) if index then table.remove(self.nodes, index) @@ -170,7 +170,7 @@ 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 +-- @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|. @@ -183,7 +183,7 @@ end --- Like removeNode, but also deletes all adjacent edges of the removed node. -- --- This function also removes the deleted adjacent edges from all neighbors +-- This function also removes the deleted adjacent edges from all neighbours -- of the removed node. -- -- @param node The node to be deleted together with its adjacent edges. @@ -293,7 +293,7 @@ end ---- Creates and adds a new edge to the graph. +--- 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. @@ -305,7 +305,7 @@ end -- \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 +-- @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 @@ -315,9 +315,9 @@ end -- function Graph:createEdge(first_node, second_node, direction, edge_nodes, options, tikz_options) local edge = Edge.new{ - direction = direction, + direction = direction, edge_nodes = edge_nodes, - options = options, + options = options, tikz_options = tikz_options } edge:addNode(first_node) @@ -393,4 +393,4 @@ end -- Done -return Graph +return Graph \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/deprecated/Iterators.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/deprecated/Iterators.lua index 903291a892d..9e41e1124ee 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/deprecated/Iterators.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/deprecated/Iterators.lua @@ -39,40 +39,40 @@ local lib = require("pgf.gd.lib") -- @return An iterator for traversing \meta{graph} in a topological order. -- function Iterators.topologicallySorted(dag) - -- track visited edges + -- 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 () + 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 + 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 neighbour 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 @@ -88,4 +88,4 @@ end -- Done -return Iterators +return Iterators \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/deprecated/Node.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/deprecated/Node.lua index 379a65fafd8..84d3d3ee11f 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/deprecated/Node.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/deprecated/Node.lua @@ -48,12 +48,12 @@ function Node.new(values) local new = { class = Node, name = nil, - tex = { + tex = { -- texNode = nil, -- maxX = nil, -- minX = nil, -- maxY = nil, - -- minY = nil + -- minY = nil }, edges = {}, -- pos = nil, @@ -69,8 +69,8 @@ function Node.new(values) new [k] = v end end - if not new.pos then - new.pos = Vector.new(2) + if not new.pos then + new.pos = Vector.new(2) end return new end @@ -91,8 +91,8 @@ 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, +-- @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|. @@ -113,7 +113,7 @@ end ---- Computes the height of the node. +--- Computes the heigth of the node. -- -- @return Height of the node. -- @@ -155,7 +155,7 @@ end --- Returns all edges of the node. -- --- Instead of calling |node:getEdges()| the edges can alternatively be +-- Instead of calling |node:getEdges()| the edges can alternatively be -- accessed directly with |node.edges|. -- -- @return All edges of the node. @@ -168,7 +168,7 @@ end --- Returns the incoming edges of the node. Undefined result for hyperedges. -- --- @param ignore_reversed Optional parameter to consider reversed edges not +-- @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 @@ -176,16 +176,16 @@ end -- function Node:getIncomingEdges(ignore_reversed) return lib.imap(self.edges, - function (edge) - if edge:isHead(self, ignore_reversed) then return edge end - end) + 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 +-- @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 @@ -193,9 +193,9 @@ end -- function Node:getOutgoingEdges(ignore_reversed) return lib.imap(self.edges, - function (edge) - if edge:isTail(self, ignore_reversed) then return edge end - end) + function (edge) + if edge:isTail(self, ignore_reversed) then return edge end + end) end @@ -204,7 +204,7 @@ end -- -- @see Node:getIncomingEdges(reversed) -- --- @param ignore_reversed Optional parameter to consider reversed edges not +-- @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. @@ -219,7 +219,7 @@ end -- -- @see Node:getOutgoingEdges() -- --- @param ignore_reversed Optional parameter to consider reversed edges not +-- @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. @@ -230,7 +230,7 @@ end ---- Creates a shallow copy of the node. +--- Creates a shallow copy of the node. -- -- Most notably, the edges adjacent are not preserved in the copy. -- @@ -262,7 +262,7 @@ end -- -- @ignore This should not appear in the documentation. -- --- @return String representation of the node. +-- @return String represenation of the node. -- function Node:__tostring() local tmp = Node.__tostring @@ -277,4 +277,4 @@ end -- Done -return Node +return Node \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/deprecated/Vector.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/deprecated/Vector.lua index 8af7378154e..ef8500b5aeb 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/deprecated/Vector.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/deprecated/Vector.lua @@ -28,7 +28,7 @@ lib.Vector = Vector -- Class setup Vector.__index = function (t, k) - if k == "x" then + if k == "x" then return rawget(t,1) elseif k == "y" then return rawget(t,2) @@ -37,8 +37,8 @@ Vector.__index = end end Vector.__newindex = - function (t, k, v) - if k == "x" then + function (t, k, v) + if k == "x" then rawset(t,1,v) elseif k == "y" then rawset(t,2,v) @@ -52,9 +52,9 @@ Vector.__newindex = --- 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} +-- @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 +-- of the vector. If omitted, all elements of the vector will -- be initialized with 0. -- -- @return A newly-allocated vector with \meta{n} elements. @@ -65,7 +65,7 @@ function Vector.new(n, fill_function) setmetatable(vector, Vector) local n = n or 2 - + if type(n) == 'table' then for k,v in pairs(n) do vector[k] = v @@ -74,7 +74,7 @@ function Vector.new(n, fill_function) -- fill vector elements with values if not fill_function then for i = 1,n do - rawset(vector,i,0) + rawset(vector,i,0) end else for i = 1,n do @@ -91,7 +91,7 @@ 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 @@ -100,7 +100,7 @@ end --- Performs a vector addition and returns the result in a new vector. -- --- @param other The vector to add. +-- @param other The vector to add. -- -- @return A new vector with the result of the addition. -- @@ -114,7 +114,7 @@ end --- Subtracts two vectors and returns the result in a new vector. -- --- @param other Vector to subtract. +-- @param other Vector to subtract. -- -- @return A new vector with the result of the subtraction. -- @@ -196,7 +196,7 @@ 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 +-- vector. The elements are replaced by the values -- returned from this function. -- function Vector:update(update_function) @@ -253,4 +253,4 @@ end -- Done -return Vector +return Vector \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc.lua index 78b68bbcb17..428091a9ae4 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc.lua @@ -17,17 +17,16 @@ -- 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: --- % +-- \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 @@ -35,12 +34,10 @@ --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: --- % +-- 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" @@ -53,18 +50,19 @@ -- example "\tikz \graph [foo layout, my radius=3] { c--d };" --\end{codeexample} -- --- Note that |[[| and |]]| are used in Lua for raw multi-line strings. +-- 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|. +-- 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 +local current_key -- Namespace @@ -109,7 +107,7 @@ end --- --- Adds an example to the |examples| field of the last key selected +-- Adds an example to the |examples| field of the last key selected -- through the |key| command. -- -- @param string An additional example string. diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased.lua index 552dd00dc8b..37878cd20f4 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased.lua @@ -14,6 +14,6 @@ --- -- @section subsection {Force-Based Algorithms} -- --- +-- local _ \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/FMMMLayout.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/FMMMLayout.lua index b7bab378191..0d987f7c5b6 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/FMMMLayout.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/FMMMLayout.lua @@ -20,7 +20,7 @@ local example = require 'pgf.gd.doc'.example key "FMMMLayout" summary "The fast multipole multilevel layout algorithm." -documentation +documentation [[ |FMMMLayout| implements a force-directed graph drawing method suited also for very large graphs. It is based on a @@ -29,12 +29,12 @@ 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. +\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} ]] @@ -44,7 +44,7 @@ example ]] -example +example [[ \tikz [nodes={text height=.7em, text depth=.2em, draw=black!20, thick, fill=white, font=\footnotesize}, @@ -65,7 +65,7 @@ example { "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"; - }; + }; ]] -------------------------------------------------------------------------------- @@ -74,7 +74,7 @@ example -------------------------------------------------------------------------------- key "FMMMLayout.randSeed" summary "Sets the random seed for the |FMMMLayout|." -documentation +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 @@ -117,7 +117,7 @@ example [[ \tikz { \graph [FMMMLayout, node sep=5mm] { subgraph C_n[n=6]; }; - + \draw [red, ultra thick, |-|] (1.south) -- ++(down:5mm); } ]] diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/FastMultipoleEmbedder.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/FastMultipoleEmbedder.lua index 453078b1306..4b676aff121 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/FastMultipoleEmbedder.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/FastMultipoleEmbedder.lua @@ -18,27 +18,27 @@ local example = require 'pgf.gd.doc'.example -------------------------------------------------------------------------------- key "FastMultipoleEmbedder" -summary "Implementation of a fast multipole embedder by Martin Gronemann." +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" @@ -48,4 +48,4 @@ summary "" -- Local Variables: -- mode:latex --- End: +-- End: diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/GEMLayout.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/GEMLayout.lua index d0b94c2bb7a..674bc996f14 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/GEMLayout.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/GEMLayout.lua @@ -18,79 +18,79 @@ local example = require 'pgf.gd.doc'.example -------------------------------------------------------------------------------- key "GEMLayout" -summary "The energy-based GEM layout algorithm." - +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} +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" @@ -100,4 +100,4 @@ summary "sets the formula for attraction (1 = Fruchterman / Reingold, 2 = -- Local Variables: -- mode:latex --- End: +-- End: diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/MultilevelLayout.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/MultilevelLayout.lua index 6210c939412..4dc8d3b3fc7 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/MultilevelLayout.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/MultilevelLayout.lua @@ -18,7 +18,7 @@ local example = require 'pgf.gd.doc'.example -------------------------------------------------------------------------------- key "MultilevelLayout" -summary "A wrapper for the multilevel layout computation using the modular multi-level mixer." +summary "A wrapper for the multilevel layout computation using the modular multi-level mixer." example [[ \tikz \graph [MultilevelLayout] { @@ -30,4 +30,4 @@ example [[ -- Local Variables: -- mode:latex --- End: +-- End: diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/SpringEmbedderFR.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/SpringEmbedderFR.lua index ae3cf9c8ef8..b71d6629c13 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/SpringEmbedderFR.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/SpringEmbedderFR.lua @@ -18,29 +18,30 @@ local example = require 'pgf.gd.doc'.example -------------------------------------------------------------------------------- key "SpringEmbedderFR" -summary "The spring-embedder layout algorithm by Fruchterman and Reingold." - +summary "The spring-embedder layout algorithm by Fruchterman and Reingold." + documentation [[ - The implementation used in SpringEmbedderFR is based on the following - publication: +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. - 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" @@ -50,4 +51,4 @@ summary "Sets the scale function factor." -- Local Variables: -- mode:latex --- End: +-- End: diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/SpringEmbedderFRExact.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/SpringEmbedderFRExact.lua index 6286e9f3954..a79d94f7e2a 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/SpringEmbedderFRExact.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/SpringEmbedderFRExact.lua @@ -18,33 +18,33 @@ local example = require 'pgf.gd.doc'.example -------------------------------------------------------------------------------- key "SpringEmbedderFRExact" -summary "Declaration of Spring-Embedder (Fruchterman,Reingold) algorithm with exact force computations." +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" @@ -54,4 +54,4 @@ summary "" -- Local Variables: -- mode:latex --- End: +-- End: diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/SpringEmbedderKK.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/SpringEmbedderKK.lua index a4fd46aa775..0d130b19235 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/SpringEmbedderKK.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/SpringEmbedderKK.lua @@ -18,38 +18,40 @@ local example = require 'pgf.gd.doc'.example -------------------------------------------------------------------------------- key "SpringEmbedderKK" -summary "The spring embedder of Kamada and Kawai" - +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. + 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. +documentation +[[ +Below this value, the system is regarded stable (balanced) and the +optimization stopped. ]] -------------------------------------------------------------------------------- - + -------------------------------------------------------------------------------- key "SpringEmbedderKK.desLength" @@ -59,4 +61,4 @@ summary "Sets desirable edge length directly" -- Local Variables: -- mode:latex --- End: +-- End: diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/BarycenterPlacer.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/BarycenterPlacer.lua index e658a896bdc..55ac157e302 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/BarycenterPlacer.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/BarycenterPlacer.lua @@ -18,9 +18,9 @@ local example = require 'pgf.gd.doc'.example -------------------------------------------------------------------------------- key "BarycenterPlacer" -summary "?" +summary "?" -------------------------------------------------------------------------------- - + -------------------------------------------------------------------------------- key "BarycenterPlacer.weightedPositionPriority" @@ -30,4 +30,4 @@ summary "" -- Local Variables: -- mode:latex --- End: +-- End: diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/CirclePlacer.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/CirclePlacer.lua index e6f06add57d..1ef3e4914cb 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/CirclePlacer.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/CirclePlacer.lua @@ -18,21 +18,21 @@ local example = require 'pgf.gd.doc'.example -------------------------------------------------------------------------------- key "CirclePlacer" -summary "?" +summary "?" -------------------------------------------------------------------------------- - + -------------------------------------------------------------------------------- key "CirclePlacer.circleSize" summary "" -------------------------------------------------------------------------------- - + -------------------------------------------------------------------------------- key "CirclePlacer.radiusFixed" summary "" -------------------------------------------------------------------------------- - + -------------------------------------------------------------------------------- key "CirclePlacer.nodeSelection" @@ -42,4 +42,4 @@ summary "" -- Local Variables: -- mode:latex --- End: +-- End: diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/EdgeCoverMerger.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/EdgeCoverMerger.lua index e8723272ee2..82af7b56366 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/EdgeCoverMerger.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/EdgeCoverMerger.lua @@ -18,9 +18,9 @@ local example = require 'pgf.gd.doc'.example -------------------------------------------------------------------------------- key "EdgeCoverMerger" -summary "?" +summary "?" -------------------------------------------------------------------------------- - + -------------------------------------------------------------------------------- key "EdgeCoverMerger.factor" @@ -30,4 +30,4 @@ summary "" -- Local Variables: -- mode:latex --- End: +-- End: diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/IndependentSetMerger.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/IndependentSetMerger.lua index 81e2f37db0e..e65a9f41fe6 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/IndependentSetMerger.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/IndependentSetMerger.lua @@ -18,9 +18,9 @@ local example = require 'pgf.gd.doc'.example -------------------------------------------------------------------------------- key "IndependentSetMerger" -summary "?" +summary "?" -------------------------------------------------------------------------------- - + -------------------------------------------------------------------------------- key "IndependentSetMerger.searchDepthBase" @@ -30,4 +30,4 @@ summary "" -- Local Variables: -- mode:latex --- End: +-- End: diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/LocalBiconnectedMerger.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/LocalBiconnectedMerger.lua index 7fbca25e816..7e5e261f55f 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/LocalBiconnectedMerger.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/LocalBiconnectedMerger.lua @@ -18,9 +18,9 @@ local example = require 'pgf.gd.doc'.example -------------------------------------------------------------------------------- key "LocalBiconnectedMerger" -summary "?" +summary "?" -------------------------------------------------------------------------------- - + -------------------------------------------------------------------------------- key "LocalBiconnectedMerger.factor" @@ -30,4 +30,4 @@ summary "" -- Local Variables: -- mode:latex --- End: +-- End: diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/MatchingMerger.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/MatchingMerger.lua index e966b490563..e7f8144e3bb 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/MatchingMerger.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/MatchingMerger.lua @@ -18,9 +18,9 @@ local example = require 'pgf.gd.doc'.example -------------------------------------------------------------------------------- key "MatchingMerger" -summary "?" +summary "?" -------------------------------------------------------------------------------- - + -------------------------------------------------------------------------------- key "MatchingMerger.selectByNodeMass" @@ -30,4 +30,4 @@ summary "" -- Local Variables: -- mode:latex --- End: +-- End: diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/MedianPlacer.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/MedianPlacer.lua index 0b9d967db9c..10a8ba58994 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/MedianPlacer.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/MedianPlacer.lua @@ -18,10 +18,10 @@ local example = require 'pgf.gd.doc'.example -------------------------------------------------------------------------------- key "MedianPlacer" -summary "?" +summary "?" -------------------------------------------------------------------------------- -- Local Variables: -- mode:latex --- End: +-- End: diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/RandomMerger.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/RandomMerger.lua index 71bdbc7340d..aafb8afd2ad 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/RandomMerger.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/RandomMerger.lua @@ -18,9 +18,9 @@ local example = require 'pgf.gd.doc'.example -------------------------------------------------------------------------------- key "RandomMerger" -summary "?" +summary "?" -------------------------------------------------------------------------------- - + -------------------------------------------------------------------------------- key "RandomMerger.factor" @@ -30,4 +30,4 @@ summary "" -- Local Variables: -- mode:latex --- End: +-- End: diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/RandomPlacer.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/RandomPlacer.lua index c26946d4e11..a0c9738fa17 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/RandomPlacer.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/RandomPlacer.lua @@ -18,9 +18,9 @@ local example = require 'pgf.gd.doc'.example -------------------------------------------------------------------------------- key "RandomPlacer" -summary "?" +summary "?" -------------------------------------------------------------------------------- - + -------------------------------------------------------------------------------- key "RandomPlacer.circleSize" @@ -30,4 +30,4 @@ summary "" -- Local Variables: -- mode:latex --- End: +-- End: diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/SolarMerger.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/SolarMerger.lua index 76b084fa67e..99ff4c621d3 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/SolarMerger.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/SolarMerger.lua @@ -18,15 +18,15 @@ local example = require 'pgf.gd.doc'.example -------------------------------------------------------------------------------- key "SolarMerger" -summary "?" +summary "?" -------------------------------------------------------------------------------- - + -------------------------------------------------------------------------------- key "SolarMerger.simple" summary "" -------------------------------------------------------------------------------- - + -------------------------------------------------------------------------------- key "SolarMerger.massAsNodeRadius" @@ -36,4 +36,4 @@ summary "" -- Local Variables: -- mode:latex --- End: +-- End: diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/SolarPlacer.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/SolarPlacer.lua index 530ddbc0d89..eb186a56157 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/SolarPlacer.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/SolarPlacer.lua @@ -18,10 +18,10 @@ local example = require 'pgf.gd.doc'.example -------------------------------------------------------------------------------- key "SolarPlacer" -summary "?" +summary "?" -------------------------------------------------------------------------------- -- Local Variables: -- mode:latex --- End: +-- End: diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/ZeroPlacer.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/ZeroPlacer.lua index 6f579d0a453..e7722fd669a 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/ZeroPlacer.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/energybased/multilevelmixer/ZeroPlacer.lua @@ -18,7 +18,7 @@ local example = require 'pgf.gd.doc'.example -------------------------------------------------------------------------------- key "ZeroPlacer" -summary "?" +summary "?" -------------------------------------------------------------------------------- @@ -30,4 +30,4 @@ summary "" -- Local Variables: -- mode:latex --- End: +-- End: diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered.lua index ffd3ea844dd..77a679d2be2 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered.lua @@ -14,6 +14,6 @@ --- -- @section subsection {Algorithms for Drawing Layered Graphs} -- --- +-- local _ \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/CoffmanGrahamRanking.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/CoffmanGrahamRanking.lua index fd13e9bd4b3..e2c09f21242 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/CoffmanGrahamRanking.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/CoffmanGrahamRanking.lua @@ -21,10 +21,10 @@ key "CoffmanGrahamRanking" summary "The ranking algorithm due to Coffman and Graham." documentation [[ -|CoffmanGrahamRanking| implements a node ranking algorithm based on +|CoffmanGrahamRanking| implements a node ranking algorithmn 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. +the height of the ranking (the number of layers) is kept small. ]] -------------------------------------------------------------------- diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/FastHierarchyLayout.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/FastHierarchyLayout.lua index a7baad7e109..4d45270a01f 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/FastHierarchyLayout.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/FastHierarchyLayout.lua @@ -23,21 +23,21 @@ 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. +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. +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. +\item + Christoph Buchheim, Michael Jünger, Sebastian Leipert: A Fast + Layout Algorithm for k-Level Graphs. \emph{Proc. Graph + Drawing 2000}, volumne 1984 of LNCS, pages 229--240, 2001. \end{itemize} ]] diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/FastSimpleHierarchyLayout.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/FastSimpleHierarchyLayout.lua index 4af6daa6207..719e6035699 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/FastSimpleHierarchyLayout.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/FastSimpleHierarchyLayout.lua @@ -24,31 +24,29 @@ 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. +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 +\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. +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. +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 +\item + Ulrik Brandes, Boris Köpf: Fast and Simple Horizontal + Coordinate Assignment. \emph{LNCS} 2002, Volume 2265/2002, + pp. 33--36 \end{itemize} ]] @@ -64,7 +62,7 @@ example -------------------------------------------------------------------- key "FastSimpleHierarchyLayout.layerDistance" -summary "Distance between the centers of nodes of two consecutive layers." +summary "Distance between the cetners of nodes of two consecutive layers." documentation [[ @@ -82,7 +80,7 @@ example -------------------------------------------------------------------- key "FastSimpleHierarchyLayout.siblingDistance" -summary "Distance between the centers of nodes of sibling nodes." +summary "Distance between the cetners of nodes of sibling nodes." documentation [[ diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/GreedyCycleRemoval.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/GreedyCycleRemoval.lua index d2f1d8eeeaf..788baece4ff 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/GreedyCycleRemoval.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/GreedyCycleRemoval.lua @@ -21,7 +21,7 @@ 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. +The algorithm applies a greedy heuristic to compute a maximal +acyclic subgraph and works in linear-time. ]] -------------------------------------------------------------------- diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/LongestPathRanking.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/LongestPathRanking.lua index 3d98fbe9c6a..e81bb2e1c30 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/LongestPathRanking.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/LongestPathRanking.lua @@ -21,11 +21,11 @@ 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). +|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). ]] -------------------------------------------------------------------- @@ -47,10 +47,10 @@ 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. +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/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/OptimalRanking.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/OptimalRanking.lua index 25a8dd5262b..64eb7eadd80 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/OptimalRanking.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/OptimalRanking.lua @@ -21,9 +21,9 @@ 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|. +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|. ]] -------------------------------------------------------------------- diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/SiftingHeuristic.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/SiftingHeuristic.lua index d0815a5b761..f54f0c33462 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/SiftingHeuristic.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/SiftingHeuristic.lua @@ -25,10 +25,10 @@ summary "The sifting heuristic for 2-layer crossing minimization." -------------------------------------------------------------------- key "SiftingHeuristic.strategy" -summary "Sets a so-called ``sifting strategy''." +summary "Sets a so-called ``sifting strategy.''" documentation [[ - The following values are permissible: |left_to_right|, |desc_degree|, - and |random|. +The following values are permissible: |left_to_right|, |desc_degree|, +and |random|. ]] -------------------------------------------------------------------- diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/SugiyamaLayout.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/SugiyamaLayout.lua index ab9d9ee77f7..ef68a1db0db 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/SugiyamaLayout.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/layered/SugiyamaLayout.lua @@ -20,18 +20,19 @@ 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} +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 @@ -39,14 +40,14 @@ example \tikz \graph [SugiyamaLayout] { a -- {b,c,d} -- e -- a }; ]] -example +example [[ \tikz \graph [SugiyamaLayout, grow=right] { a -- {b,c,d} -- e -- a }; ]] -example +example [[ \tikz [nodes={text height=.7em, text depth=.2em, draw=black!20, thick, fill=white, font=\footnotesize}, @@ -67,7 +68,7 @@ example { "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"; - }; + }; ]] -------------------------------------------------------------------------------- @@ -76,10 +77,10 @@ example -------------------------------------------------------------------------------- key "SugiyamaLayout.runs" summary "Determines, how many times the crossing minimization is repeated." -documentation +documentation [[ Each repetition (except for the first) starts with -randomly permuted nodes on each layer. Deterministic behavior can +randomly permuted nodes on each layer. Deterministic behaviour can be achieved by setting |SugiyamaLayout.runs| to 1. ]] -------------------------------------------------------------------------------- @@ -88,11 +89,12 @@ 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. +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. ]] -------------------------------------------------------------------------------- @@ -100,10 +102,11 @@ documentation [[ -------------------------------------------------------------------------------- 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. +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. ]] -------------------------------------------------------------------------------- diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/misclayout.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/misclayout.lua index 9f5f291461a..bdf85e9905e 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/misclayout.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/misclayout.lua @@ -14,6 +14,6 @@ --- -- @section subsection {Miscellaneous Algorithms for Graph Drawing} -- --- +-- local _ \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/misclayout/BalloonLayout.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/misclayout/BalloonLayout.lua index 2a250ecece6..bca8edd9ebc 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/misclayout/BalloonLayout.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/misclayout/BalloonLayout.lua @@ -20,7 +20,7 @@ local example = require 'pgf.gd.doc'.example key "BalloonLayout" summary "A ``balloon layout''." -documentation +documentation [[ This algorithm computes a radial (balloon) layout based on a spanning tree. The algorithm is partially based on the paper diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/misclayout/CircularLayout.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/misclayout/CircularLayout.lua index c5e2cf7a6c8..5c8a926384e 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/misclayout/CircularLayout.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/misclayout/CircularLayout.lua @@ -20,14 +20,14 @@ local example = require 'pgf.gd.doc'.example key "CircularLayout" summary "The circular layout algorithm." -documentation +documentation [[ -The implementation used in CircularLayout is based on the following publication: -% +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. +\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} ]] diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/planarity.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/planarity.lua index fb1abb5ccd6..c653bdc6b60 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/planarity.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/planarity.lua @@ -14,6 +14,6 @@ --- -- @section subsection {Algorithms for Drawing Planar Graphs} -- --- +-- local _ \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/planarity/PlanarizationLayout.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/planarity/PlanarizationLayout.lua index e61f9281b97..516d119f553 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/planarity/PlanarizationLayout.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/doc/ogdf/planarity/PlanarizationLayout.lua @@ -20,17 +20,17 @@ local example = require 'pgf.gd.doc'.example key "PlanarizationLayout" summary "The planarization layout algorithm." -documentation +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} +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 @@ -44,12 +44,12 @@ example -------------------------------------------------------------------------------- key "PlanarizationLayout.preprocessCliques" summary "Configures, whether cliques are collapsed in a preprocessing step." -documentation +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. +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. ]] -------------------------------------------------------------------------------- diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/examples/ASCIIDisplayer.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/examples/ASCIIDisplayer.lua index 5acc28396b2..ccaa91f9992 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/examples/ASCIIDisplayer.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/examples/ASCIIDisplayer.lua @@ -5,7 +5,7 @@ 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) @@ -27,6 +27,6 @@ end InterfaceToDisplay.runGraphDrawingAlgorithm() InterfaceToDisplay.renderGraph() InterfaceToDisplay.endGraphDrawingScope() - + diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/examples/BindingToASCII.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/examples/BindingToASCII.lua index 2b5c9cc0b6a..9752254907a 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/examples/BindingToASCII.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/examples/BindingToASCII.lua @@ -22,10 +22,10 @@ function BindingToASCII:renderStop() 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 + 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)) @@ -41,46 +41,46 @@ 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) + local x,y = i, math.floor(y1 + (i-x1)*slope + 0.5) - if canvas[x][y] == " " then - canvas[x][y] = '.' - end + 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 [red] f; % normal edge - + % Edges generated by the algorithm: - a[new edge to=b]; + a[new edge to=b]; b[new edge to=d]; c[new edge to=f]; }; \end{codeexample} - - And the algorithm: - % + + 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 @@ -72,9 +71,9 @@ declare { summary = "This algorithm shows...", } \end{codeexample} - - Next comes the declaration of the new option |new edge to|: - % + + Next comes the declaration of the new option |new edge to|: + \begin{codeexample}[code only, tikz syntax=false] declare { key = "new edge to", @@ -82,9 +81,9 @@ declare { summary = "This option takes the name of a vertex..." } \end{codeexample} - - Finally, the algorithm's code: - % + + Finally, the algorithm's code: + \begin{codeexample}[code only, tikz syntax=false] function SimpleEdgeDemo:run() -- As in a SimpleDemo: @@ -109,15 +108,15 @@ 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. - "]] + 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 diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/examples/SimpleHuffman.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/examples/SimpleHuffman.lua index f81abf11058..270ecce2c90 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/examples/SimpleHuffman.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/examples/SimpleHuffman.lua @@ -31,26 +31,27 @@ local SimpleHuffman = {} declare { key = "simple Huffman layout", algorithm = SimpleHuffman, - + postconditions = { upward_oriented = true }, summary = [[" - This algorithm demonstrates how an algorithm can generate new nodes. + 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} - } - + 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] @@ -60,16 +61,14 @@ declare { 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: - % + 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 = {} @@ -86,7 +85,7 @@ declare { initial = "1", summary = "..." } - + -- Import local layered = require "pgf.gd.layered" local InterfaceToAlgorithms = require "pgf.gd.interface.InterfaceToAlgorithms" @@ -98,31 +97,29 @@ 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: - % + + 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. - % + + 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 @@ -132,17 +129,16 @@ function SimpleHuffman:run() 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 - % +\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 @@ -152,11 +148,9 @@ function SimpleHuffman:run() 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''. - % + \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]) @@ -165,29 +159,27 @@ function SimpleHuffman:run() 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. + 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: - % + + 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={ @@ -199,8 +191,8 @@ end } \end{codeexample} "]] -} - +} + --- @@ -209,18 +201,18 @@ declare { type = "number", initial = "1", - summary = [[" - The probability parameter. It is used by the Huffman algorithm to - group nodes. - "]] + 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() @@ -232,13 +224,13 @@ function SimpleHuffman:run() 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 @@ -247,7 +239,7 @@ function SimpleHuffman:run() 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 @@ -269,7 +261,7 @@ function SimpleHuffman:run() 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], @@ -278,7 +270,7 @@ function SimpleHuffman:run() 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 diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/examples/library.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/examples/library.lua index 0c977600a7e..85e74970095 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/examples/library.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/examples/library.lua @@ -16,7 +16,7 @@ -- 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. +-- to have a look at their implementation and to adapt them to your needs. -- -- @library diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/GraphAnimationCoordination.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/GraphAnimationCoordination.lua index 31f8f27431b..2dd23937fe1 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/GraphAnimationCoordination.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/GraphAnimationCoordination.lua @@ -49,11 +49,11 @@ declare { 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. - "]] + 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 { @@ -70,12 +70,12 @@ declare { 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. - "]], + 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 { @@ -83,9 +83,9 @@ declare { 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. - "]], + Use this key if you want to limit the time during nodes are allowed to move + when they changing their positions. + "]], } declare { @@ -93,10 +93,7 @@ declare { 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. + Use this key if you want to allow that the fade animations for or dissappearing nodes may occurs while the mid time between two snapshots. If false then the appearing ends on the midtime and the disappering starts in this moment. "]] } @@ -106,39 +103,40 @@ declare { 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. + 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. + 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 +-- Helpfunctions -- -- Appends a move animation to a given snapshot object such that the @@ -148,7 +146,7 @@ declare { -- -- 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 +-- |c_from| is usefull 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. @@ -172,16 +170,16 @@ local function append_move_animation(object, c_from, c_to, t_start, t_end) 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",} - } + 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 @@ -189,26 +187,26 @@ 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" } } + 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" } - } - }) + 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_start, value = v_start }, { t = t_end, value = v_end } }, options = { { key = "freeze at end" } } }) @@ -223,13 +221,13 @@ local function eq_offset(a1, a2, b1, b2) 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 + 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. +-- can be representet by the same arc object. -- local function eq_arc(arc1, arc2) if not arc1 or not arc2 then @@ -253,7 +251,7 @@ function GraphAnimationCoordination:run() self.next_node = Storage.new() self.visible_objects = Storage.new() - + self:precomputeNodes() self:precomputeEdges() self:animateNodeAppearing() @@ -265,7 +263,7 @@ 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 @@ -274,25 +272,25 @@ function GraphAnimationCoordination:generateNodeMotions(node_types) 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 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 + 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 @@ -302,59 +300,59 @@ function GraphAnimationCoordination:generateNodeMotions(node_types) 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) + 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 + 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 + last_arc = nil end end end @@ -365,9 +363,9 @@ 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 +-- beofre 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 +-- @field closing A boolean specifieng if this is a outfading time local function compute_fade_times(t_transition, fade_duration, overlapping, closing) if overlapping then @@ -396,9 +394,9 @@ function GraphAnimationCoordination:animateNodeAppearing() 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 - + 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 @@ -416,7 +414,7 @@ function GraphAnimationCoordination:animateNodeAppearing() 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) @@ -424,23 +422,23 @@ function GraphAnimationCoordination:animateNodeAppearing() if representative~= vertex then table.insert(vertex.animations,{ - attribute = "stage", - entries = { { t = 0, value = "false"}, }, - options = {} + 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) + 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: + -- in the next or (this=)last snapshot: append_fade_animation(representative, 1, 0, fout.t_start, fout.t_end) end - end + end end @@ -449,119 +447,121 @@ 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 + 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 + - -- 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 ) + 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 + 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) + 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 + -- 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 + node_before = nil end end end @@ -574,8 +574,8 @@ function GraphAnimationCoordination:precomputeEdges() 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 + -- new arc connects existing nodes + self.is_first[arc] = true end else -- arc and at least one node is new. @@ -583,8 +583,8 @@ function GraphAnimationCoordination:precomputeEdges() 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 + -- 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 @@ -603,34 +603,34 @@ function GraphAnimationCoordination:precomputeEdges() 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 + local head = supergraph:getSnapshotVertex(superarc.head, s) + local tail = supergraph:getSnapshotVertex(superarc.tail, s) + -- use the digraph because the snapshot arc is not syncted + 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 + -- unmodified + previous_representant = previous_representant or arc + vis_objects[s] = previous_representant + end + previous_arc = arc + end end end -- Done diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/GreedyTemporalCycleRemoval.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/GreedyTemporalCycleRemoval.lua index 0c348bcc8fd..17c46aa352c 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/GreedyTemporalCycleRemoval.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/GreedyTemporalCycleRemoval.lua @@ -47,19 +47,19 @@ declare { 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. + 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 + documentation = [[" + See ToDo "]] } --- Help functions +-- Helpfunctions local function reachable(graph, v, w) local visited = {} local queue = PriorityQueue.new() @@ -73,12 +73,12 @@ local function reachable(graph, v, w) 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 + visited[head] = true + if head == w then + return true + else + queue:enqueue(head,1) + end end end end @@ -101,13 +101,13 @@ 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. +-- be splitet 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 + -- A supernode v directly depends on another supernode w iff -- there is a snapshot in which w is a child of w local dependency_graph = Digraph.new(supergraph) local stable_arcs = {} @@ -115,57 +115,57 @@ function GreedyTemporalCycleRemoval:iterativeCycleRemoval(supergraph, split_tail --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 + 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 dependencygraph + --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 resovle 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) +-- stable_arcs[deparc] = true + table.insert(stable_arcs, deparc) -- end - + end end -- end for spanning_tree end -- end for snapshot diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/Skambath2016.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/Skambath2016.lua index 2beec1e216e..23bbdf36a8c 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/Skambath2016.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/Skambath2016.lua @@ -6,7 +6,7 @@ -- 2. under the GNU Public License -- -- See the file doc/generic/pgf/licenses/LICENSE for more information --- +-- -- Imports require "pgf.gd.trees.ChildSpec" @@ -17,7 +17,7 @@ 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 SpanningTreeComputation = require "pgf.gd.trees.SpanningTreeComputation" local lib = require "pgf.gd.lib" local Storage = require "pgf.gd.lib.Storage" @@ -71,19 +71,19 @@ declare { --- Help functions +-- Helpfunctions --- -- 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. +-- are on the outer places. On the left or respectivly 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 left -- @field right -- local Borders = {} @@ -136,7 +136,7 @@ function Borders.copyBordersAtSnapshot(source, target, snapshot) 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") + "border for a given snapshat already defined") level_border_left[snapshot] = source.left[i][snapshot] level_border_right[snapshot] = source.right[i][snapshot] target.left[i] = level_border_left @@ -149,7 +149,7 @@ end -- 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 +-- borders then also the left border will be adapted -- -- @param borders The existing borders. These will be modified with -- the borders of @@ -164,27 +164,27 @@ local function adapt_borders(borders, group_borders, snapshots, ignore_dummies) 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 + 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] + 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 -- @@ -211,16 +211,16 @@ end 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") + "shift must be a valid finit 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 + 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 + -- 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 @@ -228,28 +228,28 @@ local function shift_group(shift, group, snapshots, descendants) end end anchor = math.max(anchor, v.pos.x ) - end + 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 +-- Traverse through the spanneng tree |tree| of a snapshot and sort +-- the child nodes into groups. A group summarises 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 +-- @field snapshot -- local function precompute_childgroups(supergraph, tree, node, childgroups, snapshot) local outgoings = tree:outgoing(node) @@ -257,7 +257,7 @@ local function precompute_childgroups(supergraph, tree, node, childgroups, snaps 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 @@ -274,7 +274,7 @@ end -- 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 +-- @param tree the tree in which the vertice's position should be -- computed. -- -- @param vertex the next vertex that gets its absolute coordinate. @@ -302,7 +302,7 @@ local function get_next(border_pair, next) 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) @@ -325,25 +325,25 @@ function Skambath2016:computeRequiredDistance(tree, vertex, i, shifts, next) 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 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 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} + 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) + 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) @@ -383,7 +383,7 @@ local function apply_shift(tree, vertex, i, shifts, next, border_ptr, shift) 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 @@ -398,11 +398,11 @@ function Skambath2016:run() 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) @@ -414,8 +414,8 @@ function Skambath2016:run() digraph = self.digraph, ugraph = self.ugraph }:run() - - + + self:precomputeSpanningTrees() -- Resolve cyclic dependencies if exists. @@ -432,13 +432,13 @@ function Skambath2016:run() self:computeHorizontalLayout(childgroups, descendants) -- self:computeHorizontalLayoutFast() - - -- vertical positions + + -- vertical positions tlayered.arrange_layers_by_baselines(layers, - self.adjusted_bb, - self.ugraph, - self.supergraph.snapshots, - self.supergraph.vertex_snapshots) + self.adjusted_bb, + self.ugraph, + self.supergraph.snapshots, + self.supergraph.vertex_snapshots) -- animate graph ga_class.new { @@ -446,11 +446,11 @@ function Skambath2016:run() supergraph = supergraph_original, digraph = self.digraph, ugraph = self.ugraph - }:run() + }:run() end -- --- Compute the required shift value for a second tree to guarantee +-- Compute the required shift value for a second tree to garuantee -- a required node distance. -- @field right_borders The Border data structure for the right border of -- the left tree @@ -465,11 +465,11 @@ function Skambath2016:computeMinShift(right_borders, left_borders, selected_snap 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 @@ -497,7 +497,7 @@ function Skambath2016:computeMinShift(right_borders, left_borders, selected_snap if is_significant then shift = shift + self.ugraph.options['significant sep'] end - + return shift end @@ -521,20 +521,20 @@ function Skambath2016:computeHorizontalLayout(groups, descendants) 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 + + 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 @@ -546,19 +546,19 @@ function Skambath2016:computeHorizontalLayout(groups, descendants) queue:enqueue(vertex, 1) end end - - -- 2. + + -- 2. while not queue:isEmpty() do - local vertex = queue:dequeue() + 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 + 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 + queue:enqueue(e.tail, 1) + end end -- b. Compute borders of this supervertex: @@ -569,63 +569,63 @@ function Skambath2016:computeHorizontalLayout(groups, descendants) 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 + 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) + 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 @@ -637,24 +637,24 @@ function Skambath2016:computeHorizontalLayout(groups, descendants) local snapshot_vertex = self.supergraph:getSnapshotVertex(vertex, s) snapshot_vertex.pos.x = x end - - subtree_borders[vertex] = vertex_borders + + subtree_borders[vertex] = vertex_borders end - -- align roots + -- align roots for _, s in ipairs(self.supergraph.snapshots) do local lastroot - local rborder + 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) + 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 @@ -684,28 +684,28 @@ function Skambath2016:computeHorizontalLayoutFast() 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() + 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 + 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 @@ -718,21 +718,21 @@ function Skambath2016:computeHorizontalLayoutFast() 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 + 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 + queue:enqueue(e.tail, 1) + end end -- b. Compute maximum number of children over time: @@ -743,7 +743,7 @@ function Skambath2016:computeHorizontalLayoutFast() 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 @@ -751,27 +751,27 @@ function Skambath2016:computeHorizontalLayoutFast() -- 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) + 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 + + -- ii) Synchronize distance between neigbored 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) + 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 @@ -781,22 +781,22 @@ function Skambath2016:computeHorizontalLayoutFast() 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] + 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 @@ -832,7 +832,7 @@ end -- --- +-- -- function Skambath2016:precomputeChildgroups(childgroups) for _,s in ipairs(self.supergraph.snapshots) do @@ -849,8 +849,8 @@ end -- function Skambath2016:precomputeSpanningTrees() local events = assert(self.scope.events, - "no events found for the spanning tree computation") - + "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) diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/Supergraph.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/Supergraph.lua index 99e79919b54..490b8b3191d 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/Supergraph.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/Supergraph.lua @@ -27,12 +27,12 @@ local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare -- 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 +-- Note that in TikZ 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 +-- shape. Formally this can be modelled 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 +-- same way. As this is difficult to be realised in PGF because there +-- is no basic support for time dependend 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 @@ -53,7 +53,7 @@ local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare -- @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. -- @@ -64,7 +64,6 @@ local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare -- 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] @@ -111,24 +110,24 @@ local get_snapshot -- -- @param snapshots An array of all existing snapshots -- @param timestamps A table which maps known timestamps to their --- related snapshots +-- 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 +-- wanted timestamp snapshot_time if it does'nt 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 + snapshot_idx = timestamps.n + 1 timestamps[snapshot_time] = snapshot_idx timestamps.n = timestamps.n + 1 - snapshot = Digraph.new { + snapshot = Digraph.new { syntactic_digraph = ugraph.syntactic_digraph, options = ugraph.options } @@ -137,7 +136,7 @@ function get_snapshot(snapshots, timestamps, ugraph, snapshot_time) else snapshot = snapshots[snapshot_idx] end - assert(snapshot~=nil, "an unexpected error occurred") + assert(snapshot~=nil, "an unexpected error occured") return snapshot end @@ -153,7 +152,7 @@ end -- -- @return The supergraph which is a |Digraph| that has a supervertex -- for each set of snapshot-vertices with the same |supernode| --- attribute. +-- attribute. -- function Supergraph.generateSupergraph(digraph) local new_supergraph @@ -162,35 +161,35 @@ function Supergraph.generateSupergraph(digraph) options = digraph.options, digraph = digraph, } - - -- array to store the supervertices for a given vertex name + + -- 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 + -- separate and assign vertices to their snapshots and supervertives 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 + -- first appeareance 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.supervertices_by_id[supernode_name] = supervertex new_supergraph:add{supervertex} supervertex.options = {} supervertex.options = vertex.options - end - + end + snapshot:add{vertex} new_supergraph.supervertices[vertex] = supervertex @@ -199,11 +198,11 @@ function Supergraph.generateSupergraph(digraph) end -- Create edges - for i, e in ipairs(digraph.arcs) do + 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 @@ -212,18 +211,18 @@ function Supergraph.generateSupergraph(digraph) -- 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, + table.sort(local_snapshots, function(s1,s2) return s1.timestamp < s2.timestamp end ) - - local previous_snapshot - + + local previous_snapshot + for i,s in ipairs(local_snapshots) do local start = -math.huge if previous_snapshot then @@ -236,18 +235,18 @@ function Supergraph.generateSupergraph(digraph) 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 + 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 @@ -273,9 +272,9 @@ function Supergraph:getDuration() 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) +-- evlolving trees. (The time between the last and first snapshot) function Supergraph:getSnapshotRelativeDuration(snapshot) if self:getDuration() == 0 then return 1 @@ -295,7 +294,7 @@ end function Supergraph:getSupervertex(vertex) assert(vertex, "vertex required") assert(self.supervertices, "supervertex table is not defined") - return self.supervertices[vertex] + return self.supervertices[vertex] end function Supergraph:getSuperarc(arc) @@ -323,7 +322,7 @@ end --- -- For a given supervertex get the related vertex for a snapshot -- --- @param supervertex +-- @param supervertex -- -- @param snapshot -- @@ -341,7 +340,7 @@ function Supergraph:consecutiveSnapshots(snapshot1, snapshot2, n) 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 @@ -359,21 +358,21 @@ end -- 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 + vertex.pos.x = self.supervertices[vertex].pos.x end if not ignore.y then - vertex.pos.y = self.supervertices[vertex].pos.y + vertex.pos.y = self.supervertices[vertex].pos.y end end - - + + end end @@ -381,7 +380,7 @@ 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) + f(vertex, snapshot_vertex) end end end @@ -395,23 +394,23 @@ end -- 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 supervertex The supervertex which should be splitted. -- -- @param snapshots An array of snapshots at which the supervertex --- should be split into a new one with the corresponding pgf-vertices. +-- should be splitted 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, + 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 = {} @@ -438,42 +437,42 @@ function Supergraph:splitSupervertex(supervertex, snapshots) 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 + 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 @@ -482,14 +481,14 @@ function Supergraph:splitSupervertex(supervertex, snapshots) 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 + 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) + self:disconnect(removed_arc.arc.tail, removed_arc.arc.head) end end end @@ -554,16 +553,16 @@ end -- 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") - + "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) + 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 diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/SupergraphVertexSplitOptimization.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/SupergraphVertexSplitOptimization.lua index b5a4ea22c94..2295e60513b 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/SupergraphVertexSplitOptimization.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/SupergraphVertexSplitOptimization.lua @@ -59,19 +59,19 @@ declare { 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. + 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 + documentation = [[" + See ToDo "]] } --- Help functions +-- Helpfunctions -- Implementation @@ -84,102 +84,102 @@ function SupergraphVertexSplitOptimization:run() 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) + 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 diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/TimeSpec.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/TimeSpec.lua index 2b2168da1aa..13d453f1fd6 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/TimeSpec.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/TimeSpec.lua @@ -14,49 +14,47 @@ 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. - "]], + 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. - "]], + 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. - "]], + 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.", + key = "fadeout time", + type = "time", + initial = "0.5s", + summary = "", + documentation = "The same as |fadein time| but for disappearing nodes." } diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/doc.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/doc.lua index dbd81462758..801e3808bb4 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/doc.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/doc.lua @@ -26,27 +26,26 @@ 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 +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 +\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 +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 }}, + ] { + {[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} ]] @@ -55,11 +54,11 @@ are available for the static tree algorithm can be used: 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 }}, + \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 }}, }; ]] -------------------------------------------------------------------- @@ -77,17 +76,15 @@ key "animated binary tree layout" summary [[ A layout based on the Reingold--Tilford method for drawing -binary trees. -]] +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 +\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} ]] @@ -102,15 +99,14 @@ 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. -]] +\texttt{significant sep} is zero. ]] example [[ diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/layered.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/layered.lua index 15df9990f8e..dc1e8ab571c 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/layered.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/experimental/evolving/layered.lua @@ -23,7 +23,7 @@ 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. @@ -35,7 +35,7 @@ local layered = require "pgf.gd.layered" -- -- @param layers A |Storage| object assigning layers to vertices. -- @param paddings A |Storage| object storing the computed distances --- (paddings). +-- (paddings). -- @param graph The graph in which the nodes reside -- @param snapshots The list of snapshots over which the overlaying evolving -- graph exists @@ -56,47 +56,47 @@ function temporallayered.arrange_layers_by_baselines (layers, paddings, graph, s 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 + 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 + 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 + 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 end diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/CoarseGraph.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/CoarseGraph.lua index a4e51dfeff9..6cd46c60eb2 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/CoarseGraph.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/CoarseGraph.lua @@ -12,7 +12,7 @@ --- A class for handling "coarse" versions of a graph. Such versions contain --- less nodes and edges than the original graph while retaining the overall +-- less nodes and edges than the original graph while retaining the overall -- structure. local Graph = require "pgf.gd.deprecated.Graph" -- we subclass from here @@ -43,12 +43,12 @@ CoarseGraph.COARSEN_HYBRID = 2 --- Creates a new coarse graph derived from an existing graph. -- --- Generates a coarse graph for the input |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 +-- 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| @@ -57,28 +57,28 @@ CoarseGraph.COARSEN_HYBRID = 2 -- 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 +-- if the original version of \meta{graph} is needed in parallel to its +-- coarse representations, a deep copy of \meta{grpah} 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|: +-- |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 +-- 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 +-- adjacent nodes into the supernodes and connecting the supernodes +-- if their grpah 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 +-- 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%. -- @@ -114,14 +114,14 @@ 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 + 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 @@ -153,33 +153,33 @@ function CoarseGraph:coarsen() -- add the supernode to the graph self.graph:addNode(supernode) - -- collect all neighbors of the nodes to merge, create a node -> edge mapping + -- collact all neighbours 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 + -- remove the two nodes themselves from the neighbour 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 + -- compute a list of neighbours 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) + function (edge,node) + if v_neighbours[node] ~= nil then return edge,node end + end) - -- create a node -> edges mapping for common neighbors + -- create a node -> edges mapping for common neighbours common_neighbours = lib.map(common_neighbours, function (edge, node) return { edge, v_neighbours[node] }, node end) - -- drop common edges from the neighbor mappings + -- drop common edges from the neighbour 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 + -- merge neighbour lists local disjoint_neighbours = custom_merge(u_neighbours, v_neighbours) - -- create edges between the supernode and the neighbors of the merged nodes + -- create edges between the supernode and the neighbours 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 @@ -190,11 +190,11 @@ function CoarseGraph:coarsen() level = self.level, } - -- add the supernode and the neighbor to the edge + -- add the supernode and the neighbour to the edge if u_neighbours[neighbour] then superedge:addNode(neighbour) superedge:addNode(supernode) - + else superedge:addNode(supernode) superedge:addNode(neighbour) @@ -206,14 +206,14 @@ function CoarseGraph:coarsen() self.graph:deleteEdge(edge) end - -- do the same for all neighbors that the merged nodes have + -- do the same for all neighbours 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 + -- sums of the of the weights of the edges to the common neighbours 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 + for _,e in ipairs(edges) do + weights = weights + edge.weight + end local superedge = Edge.new{ direction = Edge.UNDIRECTED, @@ -222,7 +222,7 @@ function CoarseGraph:coarsen() level = self.level, } - -- add the supernode and the neighbor to the edge + -- add the supernode and the neighbour to the edge superedge:addNode(supernode) superedge:addNode(neighbour) @@ -253,7 +253,7 @@ 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 + -- 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... @@ -345,14 +345,14 @@ function CoarseGraph:interpolate() 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 @@ -396,22 +396,22 @@ function CoarseGraph:findMaximalMatching() -- mark the node as matched matched_nodes[node] = true - -- filter out edges adjacent to neighbors already matched + -- filter out edges adjacent to neighbours already matched local edges = lib.imap(node.edges, - function (edge) - if not matched_nodes[edge:getNeighbour(node)] then return edge end - end) + 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 + -- sort edges by the weights of the node's neighbours 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 + -- match the node against the neighbour with minimum weight matched_nodes[edges[1]:getNeighbour(node)] = true table.insert(matching, edges[1]) end @@ -432,4 +432,4 @@ end -- done -return CoarseGraph +return CoarseGraph \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/ControlCoarsening.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/ControlCoarsening.lua index d69d5fc6c9c..17cd121b85e 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/ControlCoarsening.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/ControlCoarsening.lua @@ -28,48 +28,48 @@ declare { 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|. + 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'|. - "]], + 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 } - }; + \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 } + }; "]] } @@ -80,29 +80,29 @@ declare { 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. - "]], + 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] }; + \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] }; "]] } @@ -113,36 +113,36 @@ declare { 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|. - "]], + 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 } }; + % 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/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/ControlDeclare.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/ControlDeclare.lua index af209d2c78b..6d80fff6aa6 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/ControlDeclare.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/ControlDeclare.lua @@ -19,7 +19,7 @@ local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare -- -- 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 +-- can be used to influence the behaviour of this general pattern; more -- specific options that apply only to individual algorithms are -- explained along with these algorithms. -- diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/ControlElectric.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/ControlElectric.lua index 47e3cee45da..7bd118d7b85 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/ControlElectric.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/ControlElectric.lua @@ -29,26 +29,29 @@ declare { 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. + 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 typcal 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 }; - "]] + 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 }; + "]] } } @@ -60,16 +63,16 @@ declare { 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. - "]] + 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 (epxonent) 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. + "]] } @@ -79,19 +82,19 @@ 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. - "]] + 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 indiviually, 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/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/ControlIteration.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/ControlIteration.lua index b8d96630cdf..b845d9d1f89 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/ControlIteration.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/ControlIteration.lua @@ -30,34 +30,38 @@ declare { type = "number", initial = "500", - summary = [[" - Limits the number of iterations of algorithms for force-based - layouts to \meta{number}. + 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. "]], - 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] }; - "]] + 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] }; + "]] } } @@ -68,11 +72,11 @@ declare { 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. - "]] + 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. + "]] } --- @@ -82,28 +86,30 @@ declare { 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. + 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|. + 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 }; - "]] + 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 }; + "]] } } @@ -114,19 +120,21 @@ declare { 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: + 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 } }; - "]] + 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/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/ControlSprings.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/ControlSprings.lua index 45b9c9ef55e..9252f7b1cb8 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/ControlSprings.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/ControlSprings.lua @@ -21,17 +21,15 @@ local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare -- 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. +-- lenght, 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] }; @@ -49,12 +47,12 @@ declare { 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. - "]] -} + 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/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/ControlStart.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/ControlStart.lua index 269b81a3d7c..b62be10c0a5 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/ControlStart.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/ControlStart.lua @@ -22,13 +22,12 @@ local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare -- 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}; @@ -36,6 +35,6 @@ local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare --\end{codeexample} -- -- Other methods, like a planar preembedding, are not implemented --- currently. +-- currently. -- -- @end \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/QuadTree.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/QuadTree.lua index 3e1620dc21f..4e511746bb2 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/QuadTree.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/QuadTree.lua @@ -14,12 +14,12 @@ --- An implementation of a quad trees. -- -- The class QuadTree provides methods form handling quadtrees. --- +-- local QuadTree = { - -- Subclasses + -- Subclases Particle = {}, - Cell = {} + Cell = {} } QuadTree.__index = QuadTree @@ -45,7 +45,7 @@ end ---- Inserts a particle +--- Inserts a particle -- -- @param param A particle of type QuadTree.Particle -- @@ -76,7 +76,7 @@ end ---- Particle subclass +--- Partical subclass QuadTree.Particle.__index = QuadTree.Particle @@ -176,7 +176,7 @@ function QuadTree.Cell:insert(particle) 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) @@ -210,7 +210,7 @@ function QuadTree.Cell:updateMass() 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 + self.mass = self.mass + subparticle.mass end end else @@ -226,27 +226,27 @@ 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)) + 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 + -- 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)) + self.center_of_mass = self.center_of_mass:plus(sc.center_of_mass:timesScalar(sc.mass)) else - assert(sc.mass == 0) + assert(sc.mass == 0) end end self.center_of_mass = self.center_of_mass:dividedByScalar(self.mass) @@ -268,7 +268,7 @@ end function QuadTree.Cell:__tostring() return '((' .. self.x .. ', ' .. self.y .. ') ' - .. 'to (' .. self.x + self.width .. ', ' .. self.y + self.height .. '))' + .. '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 @@ -277,4 +277,4 @@ end -- done -return QuadTree +return QuadTree \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/SpringElectricalHu2006.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/SpringElectricalHu2006.lua index a7230eb1f6d..9fa709a8053 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/SpringElectricalHu2006.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/SpringElectricalHu2006.lua @@ -23,7 +23,7 @@ local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare declare { key = "spring electrical Hu 2006 layout", algorithm = SpringElectricalHu2006, - + preconditions = { connected = true, loop_free = true, @@ -32,20 +32,20 @@ declare { 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. + 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. "]] } @@ -64,7 +64,7 @@ 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'] @@ -75,11 +75,11 @@ function SpringElectricalHu2006:run() 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 @@ -103,24 +103,24 @@ function SpringElectricalHu2006:run() 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 + -- 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 + -- 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) + while coarse_graph:getSize() > self.minimum_graph_size + and coarse_graph:getRatio() <= (1 - self.downsize_ratio) do coarse_graph:coarsen() end @@ -188,8 +188,8 @@ 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 + -- 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 @@ -204,7 +204,7 @@ function SpringElectricalHu2006:computeInitialLayout(graph, spring_length) 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 + graph.nodes[1].pos.y = 0 end -- position the loose node relative to the fixed node, with @@ -220,7 +220,7 @@ function SpringElectricalHu2006:computeInitialLayout(graph, spring_length) else -- use a random positioning technique - local function positioning_func(n) + 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 @@ -228,8 +228,8 @@ function SpringElectricalHu2006:computeInitialLayout(graph, spring_length) -- 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) + node.pos.x = positioning_func(1) + node.pos.y = positioning_func(2) end end end @@ -268,7 +268,7 @@ function SpringElectricalHu2006:computeForceLayout(graph, spring_length, step_up -- 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 @@ -293,114 +293,6 @@ function SpringElectricalHu2006:computeForceLayout(graph, spring_length, step_up 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) @@ -424,7 +316,7 @@ function SpringElectricalHu2006:computeForceLayout(graph, spring_length, step_up -- 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) + delta:update(function (n, value) return 0.1 + math.random() * 0.1 end) end -- compute the repulsive force vector @@ -442,7 +334,7 @@ function SpringElectricalHu2006:computeForceLayout(graph, spring_length, step_up -- 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) + delta:update(function (n, value) return 0.1 + math.random() * 0.1 end) end -- compute the repulsive force vector @@ -462,7 +354,7 @@ function SpringElectricalHu2006:computeForceLayout(graph, spring_length, step_up -- 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) + delta:update(function (n, value) return 0.1 + math.random() * 0.1 end) end -- compute the repulsive force vector @@ -485,7 +377,7 @@ function SpringElectricalHu2006:computeForceLayout(graph, spring_length, step_up -- 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) + delta:update(function (n, value) return 0.1 + math.random() * 0.1 end) end -- compute the spring force vector between u and v @@ -521,9 +413,9 @@ function SpringElectricalHu2006:computeForceLayout(graph, spring_length, step_up 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 + + -- 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 @@ -580,7 +472,7 @@ function SpringElectricalHu2006:buildQuadtree(graph) -- 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 + return 0.1 + math.random() * 0.1 end)) end @@ -592,8 +484,8 @@ function SpringElectricalHu2006:buildQuadtree(graph) -- create the quadtree quadtree = QuadTree.new(min_pos.x, min_pos.y, - max_pos.x - min_pos.x, - max_pos.y - 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 diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/SpringElectricalLayouts.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/SpringElectricalLayouts.lua index 6ab74fc3676..df7dc70a745 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/SpringElectricalLayouts.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/SpringElectricalLayouts.lua @@ -30,11 +30,11 @@ declare { { key = "spring constant", value = "0.2" } }, - summary = [[" - This key selects Hu's 2006 spring electrical layout with - appropriate settings for some parameters. - "]] -} + summary = [[" + This key selects Hu's 2006 spring electrical layout with + appropriate settings for some parameters. + "]] + } --- @@ -47,8 +47,8 @@ declare { { key = "convergence tolerance", value = "0.001" }, }, - summary = [[" - This key selects Walshaw's 2000 spring electrical layout with - appropriate settings for some parameters. - "]] -} + summary = [[" + This key selects Walshaw's 2000 spring electrical layout with + appropriate settings for some parameters. + "]] + } diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/SpringElectricalWalshaw2000.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/SpringElectricalWalshaw2000.lua index 5f7978da4eb..02fd09a72d9 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/SpringElectricalWalshaw2000.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/SpringElectricalWalshaw2000.lua @@ -26,7 +26,7 @@ local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare declare { key = "spring electrical Walshaw 2000 layout", algorithm = SpringElectricalWalshaw2000, - + preconditions = { connected = true, loop_free = true, @@ -35,42 +35,42 @@ declare { 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} + 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 Theruntime 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 +-- - /tikz/spring stiffness (could this be the equivalent to the electric -- charge of nodes? -- - /tikz/natural spring dimension per edge -- @@ -91,10 +91,10 @@ 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'] @@ -105,7 +105,7 @@ function SpringElectricalWalshaw2000:run() 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'] @@ -133,7 +133,7 @@ function SpringElectricalWalshaw2000:run() node.weight = 1 end - -- a node is charged if its weight derives from the default setting + -- 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 @@ -142,17 +142,17 @@ function SpringElectricalWalshaw2000:run() 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 + -- 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 + -- 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) @@ -162,7 +162,7 @@ function SpringElectricalWalshaw2000:run() end -- compute the natural spring length for the coarsest graph in a way - -- that will result in the desired natural spring length in the + -- 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()) @@ -186,17 +186,17 @@ function SpringElectricalWalshaw2000:run() 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 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 + -- 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 @@ -237,8 +237,8 @@ function SpringElectricalWalshaw2000:computeInitialLayout(graph, spring_length) -- 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) + node.pos.x = positioning_func(1) + node.pos.y = positioning_func(2) end end end @@ -248,9 +248,9 @@ end function SpringElectricalWalshaw2000:computeForceLayout(graph, spring_length) -- global (=repulsive) force function - local function accurate_repulsive_force(distance, weight) + 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 + end -- global (=repulsive, approximated) force function local function approximated_repulsive_force(distance, mass) @@ -258,8 +258,8 @@ function SpringElectricalWalshaw2000:computeForceLayout(graph, spring_length) 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 + 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 @@ -285,9 +285,9 @@ function SpringElectricalWalshaw2000:computeForceLayout(graph, spring_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 @@ -303,137 +303,137 @@ function SpringElectricalWalshaw2000:computeForceLayout(graph, spring_length) -- 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 + -- 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 + math.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 + math.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 neighbour 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 neighbour; (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 + -- neighbour) + + -- move te 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 + math.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 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 + math.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 @@ -488,7 +488,7 @@ function SpringElectricalWalshaw2000:buildQuadtree(graph) -- 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 + return 0.1 + math.random() * 0.1 end)) end @@ -500,8 +500,8 @@ function SpringElectricalWalshaw2000:buildQuadtree(graph) -- create the quadtree quadtree = QuadTree.new(min_pos.x, min_pos.y, - max_pos.x - min_pos.x, - max_pos.y - 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 diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/SpringHu2006.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/SpringHu2006.lua index 51e278b904c..b53bc9bff98 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/SpringHu2006.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/SpringHu2006.lua @@ -25,7 +25,7 @@ local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare declare { key = "spring Hu 2006 layout", algorithm = SpringHu2006, - + preconditions = { connected = true, loop_free = true, @@ -34,20 +34,20 @@ declare { 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. + 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. "]] } @@ -65,26 +65,26 @@ 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)) @@ -96,7 +96,7 @@ function SpringHu2006:run() 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 @@ -106,20 +106,20 @@ function SpringHu2006:run() 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 + -- 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 + -- 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) + while coarse_graph:getSize() > self.minimum_graph_size + and coarse_graph:getRatio() <= (1 - self.downsize_ratio) do coarse_graph:coarsen() end @@ -192,8 +192,8 @@ 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 + -- 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 @@ -208,7 +208,7 @@ function SpringHu2006:computeInitialLayout(graph, spring_length) 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 + graph.nodes[1].pos.y = 0 end -- position the loose node relative to the fixed node, with @@ -223,16 +223,16 @@ function SpringHu2006:computeInitialLayout(graph, spring_length) end else -- use a random positioning technique - local function positioning_func(n) + 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) + if not node.fixed then + node.pos.x = positioning_func(1) + node.pos.y = positioning_func(2) end end end @@ -253,7 +253,7 @@ function SpringHu2006:computeForceLayout(graph, spring_length, step_update_func) -- 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 @@ -273,39 +273,6 @@ function SpringHu2006:computeForceLayout(graph, spring_length, step_update_func) 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) -- vector for the displacement of v local d = Vector.new(2) @@ -317,7 +284,7 @@ function SpringHu2006:computeForceLayout(graph, spring_length, step_update_func) -- 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) + delta:update(function (n, value) return 0.1 + math.random() * 0.1 end) end local graph_distance = (distances[u] and distances[u][v]) and distances[u][v] or #graph.nodes + 1 @@ -351,9 +318,9 @@ function SpringHu2006:computeForceLayout(graph, spring_length, step_update_func) 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 + + -- 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 diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/SpringLayouts.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/SpringLayouts.lua index e3ac58d5718..5554410816e 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/SpringLayouts.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/SpringLayouts.lua @@ -29,8 +29,8 @@ declare { { key = "spring Hu 2006 layout" }, }, - summary = [[" - This key selects Hu's 2006 spring layout with appropriate settings - for some parameters. - "]] -} + summary = [[" + This key selects Hu's 2006 spring layout with appropriate settings + for some parameters. + "]] + } diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/algorithms/FruchtermanReingold.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/algorithms/FruchtermanReingold.lua index 2450bba2a20..6c9677aeabb 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/algorithms/FruchtermanReingold.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/algorithms/FruchtermanReingold.lua @@ -20,39 +20,33 @@ local Storage = require "pgf.gd.lib.Storage" declare { key = "spring electric no coarsen layout", algorithm = SpringElectricNoCoarsenClass, - preconditions = { connected = true }, + 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. + 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 toa 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 influecing 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 = @@ -68,14 +62,14 @@ declare { 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 - }; + }; ]] } @@ -86,7 +80,7 @@ declare { --define a local time function local time_fun_1 -function time_fun_1 (t_total, t_now) +function time_fun_1 (t_total, t_now) if t_now/t_total <= 0.5 then return 0.5 else @@ -118,7 +112,7 @@ function SpringElectricNoCoarsenClass:run() } -- run algorithm - spring_electric_no_coarsen:run() + spring_electric_no_coarsen:run() end return SpringElectricNoCoarsenClass \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/algorithms/HuSpringElectricalFW.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/algorithms/HuSpringElectricalFW.lua index 57cd1547b6c..08ccad1308f 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/algorithms/HuSpringElectricalFW.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/algorithms/HuSpringElectricalFW.lua @@ -20,31 +20,29 @@ declare { key = "jedi spring electric layout", algorithm = HuClass, documentation_in = "documentation_hu_layout", - preconditions = { connected = true }, + preconditions = { connected = true }, postconditions = {fixed = true}, - summary = "This layout uses the spring electric algorithm proposed by Hu to draw graphs.", + 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. - ]], + 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 = [[ @@ -54,15 +52,15 @@ declare { 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 - }; + }; ]] } diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/algorithms/SimpleSpring.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/algorithms/SimpleSpring.lua index 4dbae2b1f4c..20a1be5de0e 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/algorithms/SimpleSpring.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/algorithms/SimpleSpring.lua @@ -19,34 +19,35 @@ declare { key = "trivial spring layout", algorithm = SimpleSpringClass, documentation_in = "pgf.gd.doc.jedi.algorithms.SimpleSpringLayout", - preconditions = { connected = true }, + preconditions = { connected = true }, postconditions = {fixed = true}, - summary = "This layout uses only spring forces to draw graphs.", + 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. - ]], + documentation = + [[The simple spring algorithm only uses one force kind: A spring force + that serves as both attracitve and repuslive 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 powerfull 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 - }; + 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 + }; ]] } @@ -68,7 +69,7 @@ function SimpleSpringClass:run() } -- run algorithm - simple_spring:run() + simple_spring:run() end return SimpleSpringClass \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/algorithms/SocialGravityCloseness.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/algorithms/SocialGravityCloseness.lua index 1c8a1bb8d91..12e6c02e4bf 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/algorithms/SocialGravityCloseness.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/algorithms/SocialGravityCloseness.lua @@ -24,64 +24,63 @@ declare { algorithm = SocialClass, postconditions = {fixed = true}, - summary = [[ - This layout uses the social gravity algorithm proposed by Bannister - with closeness mass to draw graphs. - ]], + 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. - ]], + 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 + proportinal 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.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}} - }; + 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}} + }; ]] } @@ -94,7 +93,7 @@ function SocialClass:run() tmp = fw_attributes[vertex] local sum = 0 for i, w in pairs(n) do - sum = sum + w + sum = sum + w end sum = sum / # self.ugraph.vertices tmp.mass = 1/sum @@ -109,21 +108,21 @@ function SocialClass:run() social_gravity:addForce{ force_type = ForceCanvasDistance, fun_u = function (data) return data.k/(data.d*data.d) end, - epoch = {"after expand", "during expand"} + 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"} + 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"} + epoch = {"after expand", "during expand"} } social_gravity:run() end -return SocialClass +return SocialClass \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/algorithms/SocialGravityDegree.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/algorithms/SocialGravityDegree.lua index 6408349107b..8e94a561871 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/algorithms/SocialGravityDegree.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/algorithms/SocialGravityDegree.lua @@ -23,63 +23,60 @@ declare { 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. - ]], + 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 proportinal 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 - }; - ]], + \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}} - }; + \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}} + }; ]] } @@ -88,30 +85,30 @@ 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. - ]], + 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} - }; + \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 = + [[ + \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} + }; ]] } @@ -138,7 +135,7 @@ function time_fun_3 (t_total, t_now) end end --- define table to store variables if needed +-- define table to store variables if needed local fw_attributes = Storage.newTableStorage() function SocialClass:run() @@ -151,7 +148,7 @@ function SocialClass:run() -- add options to storage table fw_attributes.options = self.ugraph.options - + -- generate new force class local social_gravity = ForceController.new(self.ugraph, fw_attributes) @@ -177,7 +174,7 @@ function SocialClass:run() } -- run algorithm - social_gravity:run() + social_gravity:run() end return SocialClass \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/base/CoarseGraphFW.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/base/CoarseGraphFW.lua index 04872146547..f33d44e6ae1 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/base/CoarseGraphFW.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/base/CoarseGraphFW.lua @@ -9,12 +9,12 @@ --- 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. +-- 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 Digraph = require "pgf.gd.model.Digraph" local Vertex = require "pgf.gd.model.Vertex" local Arc = require "pgf.gd.model.Arc" @@ -25,26 +25,26 @@ CoarseGraph.__index = CoarseGraph --- Creates a new coarse graph derived from an existing graph. -- --- Generates a coarse graph for the input |Digraph|. +-- 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 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-verties 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 +-- if the original version of \meta{graph} is needed in parallel to its +-- coarse representations, a deep copy of \meta{grpah} 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. +-- @param fw_attributes The user defined attributes, possibly attached to vertices. function CoarseGraph.new(ugraph, fw_attributes) local coarse_graph = { @@ -62,10 +62,10 @@ 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. +-- 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 @@ -87,32 +87,32 @@ function CoarseGraph:coarsen() 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 + 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 - 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) + end) local c_v_p = collapse_vertex.pos local a_h_p = a_h.pos @@ -133,19 +133,19 @@ function CoarseGraph:coarsen() self.ratio = #vertices / old_graph_size end --- This function expands all vertices associated with the current level, then +-- This function expands all vertices assoicated 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 + local random = math.random + local randomseed = math.randomseed for j=#a,1,-1 do randomseed(42) local to_expand = a[j] - ugraph:expand(to_expand, function(a,b) + ugraph:expand(to_expand, function(a,b) b.pos.x = a.pos.x + random()*10 b.pos.y = a.pos.y + random()*10 end) @@ -176,13 +176,13 @@ function CoarseGraph:getGraph() return self.ugraph end --- Private helper function to determine whether the second vertex in the +-- 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 @@ -191,22 +191,22 @@ function arc_function (arc, vertex, matched_vertices) else x = arc.tail end - if not matched_vertices[x] then - return arc + if not matched_vertices[x] then + return arc end end --- The function finding a maximum matching of independent arcs. +-- The function finding a maximum matching of independent arcs. -- -- @param ugraph The current graph -- --- @return A table of arcs which are in the matching +-- @return A table of arcs wich 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] @@ -240,7 +240,7 @@ function find_matching(ugraph) return x.weight < y.weight end) - -- match the node against the neighbor with minimum weight + -- match the node against the neighbour with minimum weight matched_vertices[arcs[1].head] = true matched_vertices[arcs[1].tail] = true table.insert(matching, arcs[1]) @@ -261,4 +261,4 @@ end -- done -return CoarseGraph +return CoarseGraph \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/base/ForceController.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/base/ForceController.lua index ab30ada5b32..1762fcf07eb 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/base/ForceController.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/base/ForceController.lua @@ -8,27 +8,26 @@ -- 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. +--- 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 +-- \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 enchance +-- 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 proprocesing 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 = {} @@ -43,7 +42,7 @@ local ForcePullToPoint = require "pgf.gd.force.jedi.forcetypes.ForcePullToPoint" local ForcePullToGrid = require "pgf.gd.force.jedi.forcetypes.ForcePullToGrid" local epochs = { - [1] = "preprocessing", + [1] = "preprocessing", [2] = "initial layout", [3] = "start coarsening process", [4] = "before coarsen", @@ -60,14 +59,14 @@ local epochs = { } -- Automatic parameter generation for epoch-variables -for _,e in ipairs(epochs) do - --- +for _,e in ipairs(epochs) do + --- declare { key = "iterations " .. e, type = "number" } - --- + --- declare { key = "maximum displacement per step " .. e, type = "number" @@ -116,9 +115,9 @@ end -- @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 + for j, e in ipairs(epochs) do if e == epoch then - return j + return j end end return -1 @@ -133,17 +132,17 @@ 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 +-- @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( + return setmetatable( {epoch_forces = {}, ugraph = ugraph, fw_attributes = fw_attributes, pull_to_point = false, - }, ForceController) + }, ForceController) end --- Running the force algorithm @@ -179,16 +178,16 @@ function ForceController:run() end -- Initialize epoch_forces table entries as empty tables - for _, e in ipairs(epochs) do + for _, e in ipairs(epochs) do if not self.epoch_forces[e] then self.epoch_forces[e] = {} end end - -- Find initial positioning algorithm + -- Find inital 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 + -- 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{ @@ -212,15 +211,15 @@ function ForceController:run() 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 + while i <= #epochs do local e = epochs[i] local iterations = options["iterations "..e] or options["iterations"] - -- assert input + -- 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 @@ -228,7 +227,7 @@ function ForceController:run() local desired_vertices = {} -- initialize node weights for _,vertex in ipairs(vertices) do - if vertex.options then + if vertex.options then if vertex.options["desired at"] then desired = true desired_vertices[vertex] = vertex.options["desired at"] @@ -236,7 +235,7 @@ function ForceController:run() end end - -- Add pull to point force if desired vertices were found and engineer did not add + -- 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{ @@ -250,9 +249,9 @@ function ForceController:run() -- 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 + -- 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 @@ -260,9 +259,9 @@ function ForceController:run() 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 + else i = start_coarsen - 1 - end + end end end @@ -272,13 +271,13 @@ function ForceController:run() 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 + 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 @@ -306,9 +305,9 @@ function ForceController:run() 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 + else i = start_expand - 1 - end + end else preprocessing(coarse_graph.ugraph.vertices, coarse_graph.ugraph.arcs, e, coarse_graph.ugraph) move_vertices(coarse_graph.ugraph.vertices, e) @@ -318,9 +317,9 @@ function ForceController:run() 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 = 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) @@ -331,9 +330,9 @@ function ForceController:run() 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 = vertices, + options = options, + desired_vertices = desired_vertices }:run() vertices_initalized = true end preprocessing(vertices, arcs, e, ugraph) @@ -349,7 +348,7 @@ end -- -- @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 +-- @params epoch The preprocessing algorithm will only be applied to the forces -- associated with this epoch. -- @params ugraph The current graph object @@ -360,8 +359,8 @@ function preprocessing(v, a, epoch, ugraph) end ---- Adding forces to the algorithm. --- +--- 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 @@ -375,7 +374,7 @@ function ForceController:addForce(force_data) if force_data.epoch == nil then force_data.epoch = {} end - for _,e in ipairs(force_data.epoch) do + for _,e in ipairs(force_data.epoch) do local tab = self.epoch_forces[e] if not tab then tab = {} @@ -383,10 +382,10 @@ function ForceController:addForce(force_data) tab[#tab +1] = f self.epoch_forces[e] = tab end -end +end ---- Moving vertices according to force functions until the maximum number of +--- Moving vertices according to force functions until the maximum number of -- iterations is reached -- -- @params vertices The vertices in the current graph @@ -409,16 +408,16 @@ function move_vertices(vertices, epoch, g) 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 - + local random = math.random + local randomseed = math.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) + 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 @@ -430,7 +429,7 @@ function move_vertices(vertices, epoch, g) 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 + cool_down_dt = 1 + 1/d_t end for _, v in ipairs(vertices) do local factor = 1/(v.mass or 1) @@ -455,9 +454,9 @@ end -- @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. +-- @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"] @@ -465,11 +464,11 @@ function get_net_force(vertices, j, t_now, epoch) 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 @@ -486,4 +485,4 @@ function sum_up(tab) return sum end -return ForceController +return ForceController \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/base/ForceTemplate.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/base/ForceTemplate.lua index 29370fc0297..06b61870ff4 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/base/ForceTemplate.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/base/ForceTemplate.lua @@ -8,8 +8,8 @@ -- 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. +--- 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" @@ -33,11 +33,11 @@ function ForceTemplate:preprocess(v) end -- Method stub for applying the forces --- --- @param data A table holding data like the table the forces are collected +-- +-- @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 diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/base/InitialTemplate.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/base/InitialTemplate.lua index 762717f64a1..ad315e7a660 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/base/InitialTemplate.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/base/InitialTemplate.lua @@ -8,11 +8,11 @@ -- 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 +--- 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 +-- Imports local lib = require "pgf.gd.lib" local InitialTemplate = lib.class {} @@ -21,14 +21,14 @@ local InitialTemplate = lib.class {} function InitialTemplate:constructor() self.vertices = self.vertices self.options = self.options - self.desired_vertices = self.desired_vertices + 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 +-- @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 @@ -37,7 +37,7 @@ 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 @@ -53,7 +53,7 @@ function InitialTemplate:desired(desired_vertices) centroid_x = centroid_x / size centroid_y = centroid_y / size end - + return placed, centroid_x, centroid_y end diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/base/PathLengthsFW.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/base/PathLengthsFW.lua index 2d50677fa5f..cf7cbddc20f 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/base/PathLengthsFW.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/base/PathLengthsFW.lua @@ -7,9 +7,9 @@ -- -- 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. +--- 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 = {} @@ -17,12 +17,12 @@ local PathLengths = {} 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. --- +-- 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 +-- @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) @@ -57,12 +57,12 @@ end -- @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 +-- @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 +-- @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 +-- @return |parent| A tbale holding each vertex as key and it's parent vertex -- as value function PathLengths:dijkstra(ugraph, source) @@ -113,13 +113,13 @@ function PathLengths:dijkstra(ugraph, source) return distance, levels, parent end --- This function finds the pseudo diameter of the graph, which is the longest --- shortest path in the graph +-- 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 +-- @ 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 diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/base/Preprocessing.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/base/Preprocessing.lua index de59e0cb5cc..182a1e4fa79 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/base/Preprocessing.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/base/Preprocessing.lua @@ -8,10 +8,10 @@ -- 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 +--- 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 precomouted to -- enhance performance. local PreprocessClass = {} @@ -21,7 +21,7 @@ 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 +-- 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 @@ -29,94 +29,94 @@ local Digraph = require "pgf.gd.model.Digraph" -- @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 + 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 +-- 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 +-- @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 + 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 +-- 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 +-- @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 + 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 + 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 +return PreprocessClass \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/doc.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/doc.lua index 19baca73336..620c035d523 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/doc.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/doc.lua @@ -19,17 +19,17 @@ key "maximum step" summary [[ -This option determines the maximum distance every vertex is allowed to travel -in one iteration. +This option determines the maximum ditance 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$ +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. ]] @@ -40,7 +40,7 @@ example \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 @@ -49,7 +49,7 @@ example \graph[social degree layout, iterations = 2, maximum time = 2, maximum step = 12pt, coarsen = false]{ a1 -- {a2, a3, a4, a5}, b1 -- {b2 -- {b3, b4}, b5} - }; + }; ]] -------------------------------------------------------------------- @@ -61,15 +61,13 @@ example key "speed" summary -[[ -This is a factor every calculated step is multiplied by. -]] +[[ 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 +$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. ]] @@ -79,7 +77,7 @@ example \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 @@ -88,7 +86,7 @@ example \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} - }; + }; ]] -------------------------------------------------------------------- @@ -98,19 +96,17 @@ example key "maximum time" summary -[[ -The highest amount of virtual time the algorithm is allowed to take. -]] +[[ 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. +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 @@ -119,7 +115,7 @@ example \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 @@ -128,31 +124,29 @@ example \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. -]] +[[ If this option is |true|, the framework checks the vertex movment 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. +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 @@ -161,7 +155,7 @@ example \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 @@ -170,7 +164,7 @@ example \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} - }; + }; ]] -------------------------------------------------------------------- @@ -180,15 +174,13 @@ example key "epsilon" summary -[[ -The threshold for the |find equilibrium| option. -]] +[[ 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. +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 @@ -197,7 +189,7 @@ example \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 @@ -206,7 +198,7 @@ example \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} - }; + }; ]] -------------------------------------------------------------------- @@ -216,17 +208,15 @@ example key "snap to grid" summary -[[ -This option enables the post-processing step |snap to grid|. -]] +[[ 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 +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|. ]] @@ -236,7 +226,7 @@ example \graph[social degree layout, iterations = 100, maximum time = 100, maximum step = 10]{ a1 -- {a2, a3, a4, a5}, b1 -- {b2 -- {b3, b4}, b5} - }; + }; ]] example @@ -245,7 +235,7 @@ example \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} - }; + }; ]] -------------------------------------------------------------------- @@ -255,15 +245,13 @@ example key "grid x length" summary -[[ -This option determines the cell size in $x$ direction for the |snap to grid| -option. -]] +[[ 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. +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 @@ -272,7 +260,7 @@ example \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 @@ -281,7 +269,7 @@ example \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} - }; + }; ]] -------------------------------------------------------------------- @@ -291,10 +279,8 @@ example key "grid y length" summary -[[ -This option determines the cell size in $x$ direction for the |snap to grid| -option. -]] +[[ This option determines the cell size in $x$ direction for the |snap to grid| +option.]] documentation [[ @@ -307,7 +293,7 @@ example \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 @@ -316,7 +302,7 @@ example \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} - }; + }; ]] -------------------------------------------------------------------- @@ -326,18 +312,18 @@ key "mass" summary [[ - The mass of a vertex determines how fast it can move. Vertices - with higher mass move slower. + 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$. + 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 @@ -346,7 +332,7 @@ example \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 @@ -355,7 +341,7 @@ example \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} - }; + }; ]] -------------------------------------------------------------------- @@ -365,13 +351,13 @@ key "coarsening weight" summary [[ - The coarsening weight of a vertex determines when it will be - coarsened. + 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. + Vertices with higher coarsening weight are considered more important and + will be coarsened later, or not at all. ]] -------------------------------------------------------------------- diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/forcetypes/ForceAbsoluteValue.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/forcetypes/ForceAbsoluteValue.lua index 4634b701235..774743e52e6 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/forcetypes/ForceAbsoluteValue.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/forcetypes/ForceAbsoluteValue.lua @@ -7,9 +7,9 @@ -- -- 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 +--- 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$ coodinate -- Imports local ForceTemplate = require "pgf.gd.force.jedi.base.ForceTemplate" @@ -31,11 +31,11 @@ function ForceAbsoluteValue:constructor () 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|. +-- 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. +-- @param v The vertices of the graph we are trying to find a layout for. function ForceAbsoluteValue:preprocess(v) self.ver = v @@ -43,12 +43,12 @@ function ForceAbsoluteValue:preprocess(v) end --- Applying the force to the vertices and adding the effect to the passed net +-- 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 +-- +-- @param data The parameters needed to aplly the force: The options table, +-- the current time stamp, an array containing the summed up net +-- forces function ForceAbsoluteValue:applyTo(data) -- locals for speed @@ -61,13 +61,13 @@ function ForceAbsoluteValue:applyTo(data) local time_fun = self.force.time_fun -- Evaluate time function - local time_factor = time_fun(t_max, t_now) + 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 + for _, i in ipairs (self.p) do -- Is the vertex in the list? if v.name == i then diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/forcetypes/ForceCanvasDistance.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/forcetypes/ForceCanvasDistance.lua index 8cea1aec6a8..6d9e69745ed 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/forcetypes/ForceCanvasDistance.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/forcetypes/ForceCanvasDistance.lua @@ -8,9 +8,9 @@ -- 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. +--- 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" @@ -22,7 +22,7 @@ local max = math.max local sqrt = math.sqrt local min = math.min --- Implementation starts here: +-- Implementation starts here: local ForceCanvasDistance = lib.class { base_class = ForceTemplate } function ForceCanvasDistance:constructor () @@ -31,24 +31,24 @@ function ForceCanvasDistance:constructor () 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. +-- 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 +-- 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 +-- +-- @param data The parameters needed to aplly the force: The options table, +-- the current time stamp, an array containing the summed up net +-- forces function ForceCanvasDistance:applyTo(data) -- locals for speed @@ -68,7 +68,7 @@ function ForceCanvasDistance:applyTo(data) 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 @@ -103,7 +103,7 @@ function ForceCanvasDistance:applyTo(data) else x = min(cap, g) end - + if h <= 0 then y = max(-cap, h) else @@ -168,7 +168,7 @@ function ForceCanvasDistance:applyTo(data) else x_tail = min(cap, g_tail) end - + if h_head <= 0 then y_head = max(-cap, h_head) else diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/forcetypes/ForceCanvasPosition.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/forcetypes/ForceCanvasPosition.lua index 41edaba3588..377ab22c348 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/forcetypes/ForceCanvasPosition.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/forcetypes/ForceCanvasPosition.lua @@ -8,9 +8,9 @@ -- 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. +--- 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" @@ -30,23 +30,23 @@ function ForceCanvasPosition:constructor () 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. +-- 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 +-- 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 +-- +-- @param data The parameters needed to aplly the force: The options table, +-- the current time stamp, an array containing the summed up net +-- forces function ForceCanvasPosition:applyTo(data) --localize diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/forcetypes/ForceGraphDistance.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/forcetypes/ForceGraphDistance.lua index 86d67f2678f..628f1192ac0 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/forcetypes/ForceGraphDistance.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/forcetypes/ForceGraphDistance.lua @@ -8,9 +8,9 @@ -- 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. +--- 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" @@ -32,26 +32,26 @@ function ForceGraphDistance:constructor () 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. +-- 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 +-- Applying the force to the vertices andadding 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 +-- +-- @param data The parameters needed to aplly the force: The options table, +-- the current time stamp, an array containing the summed up net +-- forces function ForceGraphDistance:applyTo(data) -- locals for speed @@ -86,12 +86,12 @@ function ForceGraphDistance:applyTo(data) 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) + -- 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 @@ -106,7 +106,7 @@ function ForceGraphDistance:applyTo(data) else x = min(cap, g) end - + if g <= 0 then y = max(-cap, h) else @@ -147,7 +147,7 @@ function ForceGraphDistance:applyTo(data) 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 @@ -172,7 +172,7 @@ function ForceGraphDistance:applyTo(data) else x_tail = min(cap, g_tail) end - + if h_head <= 0 then y_head = max(-cap, h_head) else diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/forcetypes/ForcePullToGrid.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/forcetypes/ForcePullToGrid.lua index 5f53f5da784..b196a8a6a95 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/forcetypes/ForcePullToGrid.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/forcetypes/ForcePullToGrid.lua @@ -8,12 +8,12 @@ -- 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|. +--- 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 @@ -40,22 +40,22 @@ function ForcePullToGrid:constructor () 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. +-- 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 +-- Applying the force to the vertices andadding 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 +-- +-- @param data The parameters needed to aplly the force: The options table, +-- the current time stamp, an array containing the summed up net -- forces function ForcePullToGrid:applyTo(data) @@ -71,7 +71,7 @@ function ForcePullToGrid:applyTo(data) local length = 5--self.options["node distance"] -- Evaluate time function - local time_factor = time_fun(t_max, t_now) + local time_factor = time_fun(t_max, t_now) if time_factor == 0 then return end @@ -89,7 +89,7 @@ function ForcePullToGrid:applyTo(data) local l = -d/(length*length) -- Include time function - local h = l * time_factor + local h = l * time_factor -- scale effect according to direction local f = x * h @@ -102,7 +102,7 @@ function ForcePullToGrid:applyTo(data) else x = min(cap, f) end - + if g <= 0 then y = max(-cap, g) else diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/forcetypes/ForcePullToPoint.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/forcetypes/ForcePullToPoint.lua index 985b8eec2e5..908fdcf6b2e 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/forcetypes/ForcePullToPoint.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/forcetypes/ForcePullToPoint.lua @@ -7,11 +7,11 @@ -- -- 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. +--- 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 @@ -33,17 +33,17 @@ function ForcePullToPoint:constructor () 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. +-- 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"] + local da = vertex.options["desired at"] if da then self.p[vertex]= {da} end @@ -52,12 +52,12 @@ function ForcePullToPoint:preprocess(v) end --- Applying the force to the vertices and adding the effect to the passed net +-- Applying the force to the vertices andadding 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 +-- +-- @param data The parameters needed to aplly the force: The options table, +-- the current time stamp, an array containing the summed up net +-- forces function ForcePullToPoint:applyTo(data) -- locals for speed @@ -69,7 +69,7 @@ function ForcePullToPoint:applyTo(data) local time_fun = self.force.time_fun -- Evaluate time function - local time_factor = time_fun(t_max, t_now) + local time_factor = time_fun(t_max, t_now) if time_factor == 0 then return end @@ -85,7 +85,7 @@ function ForcePullToPoint:applyTo(data) local d = max(sqrt(x*x+y*y),0.1) -- Include time function - local h = d * time_factor + local h = d * time_factor -- scale effect according to direction local f = x * h @@ -98,7 +98,7 @@ function ForcePullToPoint:applyTo(data) else x = min(cap, f) end - + if g <= 0 then y = max(-cap, g) else diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/initialpositioning/CircularInitialPositioning.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/initialpositioning/CircularInitialPositioning.lua index ab8f1fad9a6..1ed35653c93 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/initialpositioning/CircularInitialPositioning.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/initialpositioning/CircularInitialPositioning.lua @@ -7,7 +7,7 @@ -- -- 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 +--- This class implements an inital 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" @@ -21,7 +21,7 @@ declare { key = "circular initial position", algorithm = CircularInitialPositioning, phase = "initial positioning force framework", - phase_default = true + phase_default = true } -- Implementation starts here: @@ -33,7 +33,7 @@ end function CircularInitialPositioning:run() -- locals for speed local vertices = self.vertices - local tmp = (self.options["node pre sep"] + self.options["node post sep"]) + + 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) diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/initialpositioning/GridInitialPositioning.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/initialpositioning/GridInitialPositioning.lua index 2b131e8ad9f..cb710b35d60 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/initialpositioning/GridInitialPositioning.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/initialpositioning/GridInitialPositioning.lua @@ -7,8 +7,8 @@ -- -- 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| +--- This class implements an inital 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" @@ -45,7 +45,7 @@ function GridInitialPositioning:run() if placed[vertex] == nil then if i <= (y/dist+1)*n then x = x + dist - else + else x = 0 y = y + dist end diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/initialpositioning/RandomInitialPositioning.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/initialpositioning/RandomInitialPositioning.lua index ce3a40582c5..39a58b9e2bd 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/initialpositioning/RandomInitialPositioning.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/initialpositioning/RandomInitialPositioning.lua @@ -7,8 +7,8 @@ -- -- 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. +--- This class implements an inital 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" @@ -30,7 +30,7 @@ end function RandomInitialPositioning:run() -- locals for speed - local random = lib.random + local random = math.random local vertices = self.vertices local desired_vertices = self.desired_vertices -- place vertices where the |desired at | option has been set first @@ -39,11 +39,11 @@ function RandomInitialPositioning:run() 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 = vertex.pos p.x = 100 * random() + centroid_x p.y = 100 * random() + centroid_y end end end -return RandomInitialPositioning +return RandomInitialPositioning \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/library.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/library.lua index 5d5554ce351..4cc7128b16a 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/library.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/jedi/library.lua @@ -9,14 +9,14 @@ --- 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. +-- This labrary requires all graph drawing algorithms and inital +-- 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 inital positioning algorithms require "pgf.gd.force.jedi.initialpositioning.CircularInitialPositioning" require "pgf.gd.force.jedi.initialpositioning.RandomInitialPositioning" require "pgf.gd.force.jedi.initialpositioning.GridInitialPositioning" @@ -101,7 +101,7 @@ declare { key = "mass", type = "number", initial = "1", - + documentation_in = "pgf.gd.force.jedi.doc" } @@ -110,6 +110,6 @@ declare { key = "coarsening weight", type = "number", initial = "1", - + documentation_in = "pgf.gd.force.jedi.doc" } diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/library.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/library.lua index acfda34ffce..be0faf465c1 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/library.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/force/library.lua @@ -24,43 +24,43 @@ -- 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). +-- \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). +-- \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 @@ -70,33 +70,33 @@ -- 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. +-- \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} +-- \item +-- Jannis Pohlmann, +-- \newblock \emph{Configurable Graph Drawing Algorithms +-- for the \tikzname\ Graphics Description Language,} +-- \newblock Diploma Thesis, +-- \newblock Institute of Theoretical Computer Science, Univerist\"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 diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/interface/InterfaceCore.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/interface/InterfaceCore.lua index 8473eb3f109..8dfbae44850 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/interface/InterfaceCore.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/interface/InterfaceCore.lua @@ -18,7 +18,7 @@ -- |InterfaceToDisplay| use, in particular, the data structures -- provided by this class. -- --- @field binding This field stores the ``binding''. The graph drawing +-- @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 @@ -28,7 +28,7 @@ -- completely new Lua instance. -- -- @field scopes This is a stack of graph drawing scopes. All --- interface methods refer to the top of this stack. +-- 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. @@ -59,7 +59,7 @@ local InterfaceCore = { -- The phase kinds phase_kinds = {}, - + -- Internals for handling the options stack option_stack = {}, option_cache_height = nil, @@ -186,6 +186,6 @@ function InterfaceCore.convert(s,t) end --- Done +-- Done return InterfaceCore diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/interface/InterfaceToAlgorithms.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/interface/InterfaceToAlgorithms.lua index 1187fbc3136..f1b203e550c 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/interface/InterfaceToAlgorithms.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/interface/InterfaceToAlgorithms.lua @@ -15,13 +15,13 @@ -- 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''. +-- 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. +-- parameter will become available on the display layer. local InterfaceToAlgorithms = {} @@ -58,7 +58,7 @@ local declare_handlers -- 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. +-- finishes. Otherwise, the next handler is tried. function InterfaceToAlgorithms.addHandler(test, handler) table.insert(declare_handlers, 1, { test = test, handler = handler }) @@ -76,7 +76,7 @@ local key_metatable = {} -- 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} @@ -84,11 +84,11 @@ local key_metatable = {} -- 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 +-- 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: --- % +-- example of how a declaration is done: +-- --\begin{codeexample}[code only, tikz syntax=false] -- --- -- declare { @@ -126,7 +126,7 @@ local key_metatable = {} -- 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 { @@ -138,7 +138,7 @@ local key_metatable = {} --\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 +-- 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. @@ -146,15 +146,14 @@ local key_metatable = {} -- \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|. +-- \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 { @@ -177,8 +176,8 @@ local key_metatable = {} -- 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: --- % +-- originally passed to the original key. Here is a typical example: +-- --\begin{codeexample}[code only, tikz syntax=false] -- --- -- declare { @@ -194,7 +193,7 @@ local key_metatable = {} -- -- 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. +-- 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 @@ -210,7 +209,7 @@ local key_metatable = {} 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 @@ -220,14 +219,14 @@ function InterfaceToAlgorithms.declare (t) for _,h in ipairs (declare_handlers) do if h.test(t) then if h.handler(t) then - break + break end end end -- Attach metatable: setmetatable (t, key_metatable) - + -- Set! keys[t.key] = t keys[#keys + 1] = t @@ -247,10 +246,10 @@ end --- --- This function is called by |declare| for ``normal parameter keys'', +-- 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 { @@ -267,7 +266,6 @@ end -- 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} @@ -275,40 +273,40 @@ end -- 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). +-- \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"|. +-- |"string"|. -- -- A parameter can have an |initial| value. This value will be used -- whenever the parameter has not been set explicitly for an object. @@ -318,7 +316,7 @@ end -- 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 +-- A parameter can habe 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| @@ -326,7 +324,7 @@ end -- 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. +-- 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 @@ -334,7 +332,7 @@ end -- 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", @@ -351,7 +349,7 @@ end -- -- 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", @@ -368,7 +366,7 @@ end -- -- 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", @@ -379,9 +377,9 @@ end -- } --\end{codeexample} -- --- As a special courtesy to C code, you can also set the key +-- As a special curtesy 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|. +-- a string that is read using |loadstring|. -- -- (You cannot call this function directly, it is included for -- documentation purposes only.) @@ -391,36 +389,36 @@ end 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 + 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 + count = count + 1 + if count == 1 then + return "return " + elseif count == 2 then + return t.alias_function_string + else + return nil + end end)() end @@ -437,17 +435,16 @@ end --- -- This function is called by |declare| for ``algorithm --- keys''. These keys are normally used without a value as in just +-- 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. +-- 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 = {} -- @@ -500,7 +497,7 @@ end -- 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. +-- 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 @@ -508,7 +505,7 @@ end -- 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. +-- 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| @@ -522,12 +519,12 @@ 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 = { +-- algorithm = { -- run = -- function (self) -- return SpanningTreeComputation.computeSpanningTree(self.ugraph, false, self.events) @@ -541,7 +538,7 @@ end -- -- 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"] @@ -570,7 +567,7 @@ end 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 () @@ -581,7 +578,7 @@ local function declare_algorithm (t) else class = lib.class(require(t.algorithm)) end - + -- Now, save pre- and postconditions class.preconditions = t.preconditions or {} class.postconditions = t.postconditions or {} @@ -605,26 +602,26 @@ local function declare_algorithm (t) -- 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") + "default algorithm for phase already set") assert (type(store_me) == "table", - "default algorithms must be loaded immediately") + "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 - + } + end + return true end @@ -632,44 +629,42 @@ end --- --- This function is called by |declare| for ``collection kinds''. They --- are detected by the presence of the field |layer| +-- 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. +-- belongs to a collection. -- -- \medskip -- \noindent\textbf{The Display Layer.} --- Let us first have a look at what happens on 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|. --- % +-- 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] +--\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. +-- collections. -- -- The effect of declaring a collection kind on the algorithm layer -- it, first of all, that |scope.collections| will have a field named @@ -679,37 +674,37 @@ end -- 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 +-- ``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. +-- 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 +-- the binding layer will ask the dislay 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 @@ -717,7 +712,7 @@ end -- -- (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) @@ -727,11 +722,11 @@ local function declare_collection_kind (t) 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: + -- 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 @@ -741,7 +736,7 @@ local function declare_collection_kind (t) end kinds[#kinds+1] = new_entry - + -- Bind InterfaceCore.binding:declareCallback(t) @@ -813,22 +808,22 @@ local unique_count = 1 -- -- 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. +-- \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 +-- should be added -- @param init A table of initial values for the node that is passed --- to |Binding:createVertex|, see that function for details. +-- to |Binding:createVertex|, see that function for details. -- -- @return The newly created node -- @@ -837,7 +832,7 @@ 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 @@ -846,29 +841,29 @@ function InterfaceToAlgorithms.createVertex(algorithm, init) -- 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.syntactic_component:add {v} + algorithm.digraph:add {v} algorithm.ugraph:add {v} - - -- Compute bounding boxes: + + -- 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 @@ -878,41 +873,40 @@ 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 +-- all layouts on the layout stack. Forthermore, appropriate edges are -- added to the |digraph| and the |ugraph| of the algorithm currently --- running. +-- running. -- --- @param algorithm An algorithm for whose syntactic digraph the node should be added +-- @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|. +-- \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") - + 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, @@ -922,16 +916,16 @@ function InterfaceToAlgorithms.createEdge(algorithm, tail, head, init) generated_options = init.generated_options } - -- Add to arc + -- 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) @@ -940,7 +934,7 @@ function InterfaceToAlgorithms.createEdge(algorithm, tail, head, init) -- Call binding binding.storage[edge] = {} binding:everyEdgeCreation(edge) - + -- Add edge to digraph and ugraph local direction = edge.direction if direction == "->" then @@ -956,13 +950,13 @@ function InterfaceToAlgorithms.createEdge(algorithm, tail, head, init) -- Add edge to layouts add_to_collections(algorithm.layout, "edges", edge) - + end --- Done +-- Done return InterfaceToAlgorithms diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/interface/InterfaceToC.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/interface/InterfaceToC.lua index 282727b66a3..2aeb2e6a7aa 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/interface/InterfaceToC.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/interface/InterfaceToC.lua @@ -32,17 +32,16 @@ local lib = require "pgf.gd.lib" -- |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): --- % +-- 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. +-- \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|. @@ -50,29 +49,29 @@ local lib = require "pgf.gd.lib" 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 - } + 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 +return InterfaceToC \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/interface/InterfaceToDisplay.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/interface/InterfaceToDisplay.lua index 23018efcaa5..c0ddf0dc8ce 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/interface/InterfaceToDisplay.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/interface/InterfaceToDisplay.lua @@ -73,10 +73,10 @@ local option_cache = nil -- The option cache --- --- Initialize the binding. This function is called once by the display +-- Initiliaze 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} @@ -90,10 +90,10 @@ local option_cache = nil -- The option cache 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" @@ -113,7 +113,7 @@ end -- once more. -- -- Each graph drawing scope comes with a syntactic digraph that is --- build using methods like |addVertex| or |addEdge|. +-- 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 @@ -123,14 +123,14 @@ 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 @@ -138,7 +138,7 @@ end --- --- Arranges the current graph using the specified algorithm and options. +-- 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 @@ -165,22 +165,22 @@ function InterfaceToDisplay.runGraphDrawingAlgorithm() -- 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() - + InterfaceToDisplay.resumeGraphDrawingCoroutine() + -- End timing: local stop = os.clock() @@ -204,10 +204,10 @@ 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) @@ -258,7 +258,7 @@ end -- to the current |Binding|. -- -- @param anchors A table of anchors (mapping anchor positions to --- |Coordinates|). +-- |Coordinates|). function InterfaceToDisplay.createVertex(name, shape, path, height, binding_infos, anchors) @@ -266,7 +266,7 @@ function InterfaceToDisplay.createVertex(name, shape, path, height, binding_info -- 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") @@ -304,18 +304,18 @@ 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 @@ -326,9 +326,9 @@ end -- ``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 +-- collection like |hyper| is that the node is availble 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 @@ -339,7 +339,7 @@ end -- 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 @@ -350,34 +350,34 @@ end -- -- 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} -- +-- \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") @@ -387,7 +387,7 @@ function InterfaceToDisplay.pushSubgraphVertex(name, height, info) kind = "subgraph node", options = get_current_options_table(height-1) } - + vertex_created(v,scope) -- Store info @@ -429,12 +429,12 @@ 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) @@ -464,8 +464,8 @@ end -- -- @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 +-- @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|. -- @@ -477,12 +477,12 @@ function InterfaceToDisplay.createEdge(tail, head, direction, height, binding_in -- 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) @@ -493,14 +493,14 @@ function InterfaceToDisplay.createEdge(tail, head, direction, height, binding_in direction = direction, options = get_current_options_table(height) } - - -- Add to arc + + -- 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) @@ -509,15 +509,15 @@ function InterfaceToDisplay.createEdge(tail, head, direction, height, binding_in -- Call binding binding.storage[edge] = binding_infos binding:everyEdgeCreation(edge) - + end - + --- --- Push an option to the stack of options. +-- 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 @@ -533,7 +533,7 @@ end -- resulting stack height. -- -- In addition to this stack height, this function returns a Boolean --- value indicating whether a ``main algorithm phase was set''. This +-- 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 @@ -546,7 +546,7 @@ end -- above this height will be removed. -- -- @return A new stack height --- @return A Boolean that is |true| if the main algorithm phase was +-- @return A Boolean that is |true| iff 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 @@ -555,65 +555,65 @@ end 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 + -- 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) - + { 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] @@ -626,10 +626,10 @@ function InterfaceToDisplay.pushOption(key, value, height) local use_k = u.key local use_v = u.value if type(use_k) == "function" then - use_k = use_k(value) + use_k = use_k(value) end if type(use_v) == "function" then - use_v = use_v(value) + use_v = use_v(value) end height, flag = InterfaceToDisplay.pushOption(use_k, use_v, height+1) main_phase_set = main_phase_set or flag @@ -655,7 +655,7 @@ end --- --- Creates an event and adds it to the event string of the current scope. +-- 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. @@ -679,7 +679,7 @@ end -- 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|. +-- original table passed to |InterfaceToAlgorithms.declare|. -- -- @return A lookup table of all declared keys. @@ -699,7 +699,7 @@ end -- whole graph. -- -- In detail, this function calls: --- % +-- --\begin{codeexample}[code only, tikz syntax=false] --local binding = InterfaceCore.binding -- @@ -719,14 +719,14 @@ end 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() + binding:renderStop() end @@ -743,16 +743,15 @@ end -- binding layer. -- -- Consider the following code: --- % ---\begin{codeexample}[code only] +--\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 -- @@ -780,25 +779,24 @@ end -- 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 +-- field passed to |declare| during the declaration of the colleciton -- 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] +--\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: -- @@ -811,12 +809,12 @@ end --binding:renderCollectionStopKind("hyper", 1) --\end{codeexample} -- --- @param collections The |collections| table of the current scope. +-- @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 @@ -824,7 +822,7 @@ function render_collections(collections) if layer ~= 0 then binding:renderCollectionStartKind(kind, layer) for _,c in ipairs(collections[kind] or {}) do - binding:renderCollection(c) + binding:renderCollection(c) end binding:renderCollectionStopKind(kind, layer) end @@ -839,20 +837,19 @@ end -- -- 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 +-- this function, which in turn calls appropriate callbacks to the -- binding layer. -- -- Consider the following code: --- % ---\begin{codeexample}[code only] +--\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 -- @@ -880,14 +877,14 @@ local aliases = InterfaceCore.option_aliases local option_initial = InterfaceCore.option_initial local option_metatable = { - __index = + __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 + 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 @@ -904,19 +901,19 @@ local option_metatable = { -- with object.) -- -- (This function is local and internal and included only for documentation --- purposes.) +-- 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. +-- 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 @@ -929,49 +926,49 @@ function get_current_options_table (height, table) local cache if not table then cache = setmetatable( - { - algorithm_phases = setmetatable({}, InterfaceCore.option_initial.algorithm_phases), - collections = {} - }, option_metatable) + { + 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 + 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) + LookupTable.addOne(collections, v) else - cache[k] = v + 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 @@ -982,21 +979,21 @@ end 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") - + + 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 + InterfaceCore.option_cache_height = nil -- invalidate cache end --- Done +-- Done -return InterfaceToDisplay +return InterfaceToDisplay \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/interface/Scope.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/interface/Scope.lua index a750308e692..438925a2213 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/interface/Scope.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/interface/Scope.lua @@ -25,8 +25,8 @@ -- 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. +-- created. Graph drawing scopes are kepts 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 @@ -77,16 +77,16 @@ local Digraph = require "pgf.gd.model.Digraph" function Scope.new(initial) return setmetatable(lib.copy(initial, - { - syntactic_digraph = Digraph.new{}, - events = {}, - node_names = {}, - coroutine = nil, - collections = {}, - }), Scope) + { + syntactic_digraph = Digraph.new{}, + events = {}, + node_names = {}, + coroutine = nil, + collections = {}, + }), Scope) end --- Done +-- Done -return Scope +return Scope \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered.lua index 6988e7a3d9d..dd897fbe8ac 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered.lua @@ -20,7 +20,7 @@ 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. @@ -30,7 +30,7 @@ local Storage = require "pgf.gd.lib.Storage" -- Compute the ideal distance between two siblings -- -- @param paddings A |Storage| object in which the computed distances --- (paddings) are stored. +-- (paddings) are stored. -- @param graph The graph object -- @param n1 The first node -- @param n2 The second node @@ -55,9 +55,9 @@ function layered.ideal_sibling_distance (paddings, graph, n1, n2) 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) - + + 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 @@ -88,7 +88,7 @@ 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 @@ -110,7 +110,7 @@ function layered.baseline_distance (paddings, graph, l1, l2) 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 @@ -121,18 +121,18 @@ end -- -- @param layers A |Storage| object assigning layers to vertices. -- @param paddings A |Storage| object storing the computed distances --- (paddings). +-- (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 @@ -140,12 +140,12 @@ function layered.arrange_layers_by_baselines (layers, paddings, graph) 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 + v.pos.y = height end end end @@ -156,4 +156,4 @@ end -- Done -return layered +return layered \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/CrossingMinimizationGansnerKNV1993.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/CrossingMinimizationGansnerKNV1993.lua index da9ff9698c0..3fe3eac2552 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/CrossingMinimizationGansnerKNV1993.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/CrossingMinimizationGansnerKNV1993.lua @@ -58,7 +58,7 @@ function CrossingMinimizationGansnerKNV1993:computeInitialRankOrdering() local function init(search) for i=#self.graph.nodes,1,-1 do - local node = self.graph.nodes[i] + local node = self.graph.nodes[i] if direction == 'down' then if node:getInDegree() == 0 then search:push(node) @@ -81,7 +81,7 @@ function CrossingMinimizationGansnerKNV1993:computeInitialRankOrdering() self.ranking:setRankPosition(node, pos) if direction == 'down' then - local out = node:getOutgoingEdges() + local out = node:getOutgoingEdges() for i=#out,1,-1 do local neighbour = out[i]:getNeighbour(node) if not search:getDiscovered(neighbour) then @@ -90,9 +90,9 @@ function CrossingMinimizationGansnerKNV1993:computeInitialRankOrdering() end end else - local into = node:getIncomingEdges() - for i=#into,1,-1 do - local neighbour = into[i]:getNeighbour(node) + 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) @@ -122,7 +122,7 @@ 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 @@ -170,7 +170,7 @@ function CrossingMinimizationGansnerKNV1993:countNodeCrossings(ranking, left_nod left_edges = left_node:getOutgoingEdges() right_edges = right_node:getOutgoingEdges() end - + local crossings = 0 local function left_neighbour_on_other_rank(edge) @@ -186,20 +186,20 @@ function CrossingMinimizationGansnerKNV1993:countNodeCrossings(ranking, left_nod 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 + 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 @@ -252,7 +252,7 @@ function CrossingMinimizationGansnerKNV1993:computeMedianPosition(node, prev_ran function (edge) local n = edge:getNeighbour(node) if self.ranking:getRank(n) == prev_rank then - return self.ranking:getRankPosition(n) + return self.ranking:getRankPosition(n) end end) diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/CycleRemovalBergerS1990a.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/CycleRemovalBergerS1990a.lua index 76deb8adaf6..55207b845d3 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/CycleRemovalBergerS1990a.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/CycleRemovalBergerS1990a.lua @@ -10,6 +10,7 @@ -- @release $Header$ + local CycleRemovalBergerS1990a = {} local lib = require("pgf.gd.lib") @@ -26,20 +27,20 @@ function CycleRemovalBergerS1990a:run() 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) + 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) + 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 + -- 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 @@ -71,4 +72,4 @@ end -- done -return CycleRemovalBergerS1990a +return CycleRemovalBergerS1990a \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/CycleRemovalBergerS1990b.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/CycleRemovalBergerS1990b.lua index d8f28980c87..218ecbd2099 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/CycleRemovalBergerS1990b.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/CycleRemovalBergerS1990b.lua @@ -28,20 +28,20 @@ function CycleRemovalBergerS1990b:run() -- 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) + 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) + 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 + -- 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 @@ -73,4 +73,4 @@ end -- done -return CycleRemovalBergerS1990b +return CycleRemovalBergerS1990b \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/CycleRemovalGansnerKNV1993.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/CycleRemovalGansnerKNV1993.lua index e52b0d38d1a..b480b7c4e70 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/CycleRemovalGansnerKNV1993.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/CycleRemovalGansnerKNV1993.lua @@ -23,10 +23,10 @@ function CycleRemovalGansnerKNV1993:run () -- -- ignore self-loops -- - -- merge multiple edges into one edge each, whose weight is the sum of the + -- 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 + -- 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 @@ -36,10 +36,10 @@ function CycleRemovalGansnerKNV1993:run () -- 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 diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/NetworkSimplex.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/NetworkSimplex.lua index 0ccf7694cae..40078405f90 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/NetworkSimplex.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/NetworkSimplex.lua @@ -14,10 +14,10 @@ --- This file contains an implementation of the network simplex method ---- for node ranking and x coordinate optimization in layered drawing +--- for node ranking and x coordinate optimization in layered drawing --- algorithms, as proposed in --- ---- "A Technique for Drawing Directed Graphs" +--- "A Technique for Drawing Directed Graphs" -- by Gansner, Koutsofios, North, Vo, 1993. @@ -57,7 +57,7 @@ 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 @@ -72,7 +72,7 @@ function NetworkSimplex:run() self.low = {} self.parent_edge = {} self.ranking = Ranking.new() - + if #self.graph.nodes == 1 then self.ranking:setRank(self.graph.nodes[1], 1) else @@ -86,19 +86,19 @@ function NetworkSimplex:rankNodes() -- construct feasible tree of tight edges self:constructFeasibleTree() - -- iteratively replace edges with negative cut values + -- 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 + -- find the next tree edge with a negative cut value, if -- there are any left leave_edge = self:findNegativeCutEdge() end @@ -108,7 +108,7 @@ function NetworkSimplex:rankNodes() 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 + -- 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 @@ -140,7 +140,7 @@ function NetworkSimplex:constructFeasibleTree() 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() @@ -193,7 +193,7 @@ function NetworkSimplex:findReplacementEdge(leave_edge) local v = nil local direction = nil - + if self.lim[tail] < self.lim[head] then v = tail direction = 'in' @@ -206,7 +206,7 @@ function NetworkSimplex:findReplacementEdge(leave_edge) local enter_edge = nil local slack = math.huge - -- TODO Jannis: Get rid of this recursion: + -- TODO Janns: Get rid of this recursion: local function find_edge(v, direction) @@ -250,7 +250,7 @@ function NetworkSimplex:findReplacementEdge(leave_edge) 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 @@ -280,7 +280,7 @@ function NetworkSimplex:findReplacementEdge(leave_edge) end find_edge(v, direction) - + return enter_edge end @@ -293,7 +293,7 @@ function NetworkSimplex:exchangeTreeEdges(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) @@ -322,7 +322,7 @@ function NetworkSimplex:balanceRanksTopBottom() -- 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 = {} @@ -335,22 +335,22 @@ function NetworkSimplex:balanceRanksTopBottom() 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 + -- the ranks of all parent neighbours 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) + -- the ranks of all child neighbours minus the minimum level + -- sparation 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) @@ -400,7 +400,7 @@ end function NetworkSimplex:computeInitialRanking() - + -- queue for nodes to rank next local queue = {} @@ -408,7 +408,7 @@ function NetworkSimplex:computeInitialRanking() 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 + -- reset the two-dimensional mapping from ranks to lists -- of corresponding nodes self.ranking:reset() @@ -418,7 +418,7 @@ function NetworkSimplex:computeInitialRanking() -- 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 @@ -428,23 +428,23 @@ function NetworkSimplex:computeInitialRanking() -- 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 minimum possible rank is the maximum of all neighbour ranks plus -- the corresponding edge lengths rank = math.max(rank, self.ranking:getRank(neighbour) + edge.minimum_levels) end - end + end -- rank the node self.ranking:setRank(node, rank) @@ -452,7 +452,7 @@ function NetworkSimplex:computeInitialRanking() -- 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 + -- queue neighbours 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 @@ -480,7 +480,7 @@ function NetworkSimplex:findTightTree() 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 @@ -489,7 +489,7 @@ function NetworkSimplex:findTightTree() for _,node in ipairs(edge.nodes) do marked[node] = true end - + if #self.tree.edges == #self.graph.nodes-1 then return true end @@ -502,7 +502,7 @@ function NetworkSimplex:findTightTree() return false end - + for _,node in ipairs(self.graph.nodes) do self.tree = Graph.new() self.tree_node = {} @@ -511,7 +511,7 @@ function NetworkSimplex:findTightTree() self.orig_edge = {} build_tight_tree(node) - + if #self.tree.edges > 0 then break end @@ -561,10 +561,10 @@ function NetworkSimplex:initializeCutValues() 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 @@ -621,10 +621,10 @@ function NetworkSimplex:calculateDFSRange(root, edge_from_parent, lowest) -- 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 @@ -748,8 +748,8 @@ end function NetworkSimplex:nextSearchIndex() local index = 1 - - -- avoid tree edge index out of bounds by resetting the search index + + -- 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 @@ -774,10 +774,10 @@ function NetworkSimplex:rerank(node, delta) 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 @@ -800,10 +800,10 @@ 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 @@ -863,8 +863,8 @@ function NetworkSimplex:addEdgeToTree(edge) -- create tree nodes if necessary for _,node in ipairs(edge.nodes) do - local tree_node - + local tree_node + if self.tree_node[node] then tree_node = self.tree_node[node] else diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/NodePositioningGansnerKNV1993.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/NodePositioningGansnerKNV1993.lua index 3e5a0f8f873..3af15ad1593 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/NodePositioningGansnerKNV1993.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/NodePositioningGansnerKNV1993.lua @@ -32,9 +32,9 @@ function NodePositioningGansnerKNV1993:run() 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) @@ -45,7 +45,7 @@ function NodePositioningGansnerKNV1993:run() 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) diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/NodeRankingGansnerKNV1993.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/NodeRankingGansnerKNV1993.lua index d6765ae2f0a..4a53acf8646 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/NodeRankingGansnerKNV1993.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/NodeRankingGansnerKNV1993.lua @@ -142,7 +142,7 @@ function NodeRankingGansnerKNV1993:expandClusters() end self.graph:addEdge(edge) end - + for _,node in ipairs(self.cluster_nodes) do self.ranking:setRank(node, nil) self.graph:deleteNode(node) diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/NodeRankingMinimumHeight.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/NodeRankingMinimumHeight.lua index 644b99c28a9..8aa98bd03ad 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/NodeRankingMinimumHeight.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/NodeRankingMinimumHeight.lua @@ -28,8 +28,8 @@ function NodeRankingMinimumHeight:run() 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))) + for _,edge in ipairs(edge) do + max_rank = math.max(max_rank, ranking:getRank(edge:getNeighbour(node))) end assert(max_rank >= 1) @@ -44,4 +44,4 @@ end -- done -return NodeRankingMinimumHeight +return NodeRankingMinimumHeight \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/Ranking.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/Ranking.lua index 6ed63b0249d..228039b536f 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/Ranking.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/Ranking.lua @@ -12,8 +12,8 @@ ---- The Ranking class is used by the Sugiyama algorithm to compute an --- ordering on the nodes of a layer +--- The Ranking class is used by the Sugiyama algorithm to compute an ordering on the +-- nodes of a layer local Ranking = {} Ranking.__index = Ranking @@ -43,7 +43,7 @@ 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]) @@ -113,7 +113,7 @@ function Ranking:setRank(node, new_rank) 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] @@ -196,7 +196,7 @@ function Ranking:normalizeRanks() 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 diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/Sugiyama.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/Sugiyama.lua index c91818dc300..3ab9596322d 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/Sugiyama.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/Sugiyama.lua @@ -42,7 +42,7 @@ local Vector = require "pgf.gd.deprecated.Vector" declare { key = "layered layout", algorithm = Sugiyama, - + preconditions = { connected = true, loop_free = true, @@ -54,44 +54,46 @@ declare { old_graph_model = true, - summary = [[" - The |layered layout| is the key used to select the modular Sugiyama - layout algorithm. + 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: + 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 - }; - "]] + 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 + }; + "]] } } @@ -102,16 +104,16 @@ declare { 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. + 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; - }; + \tikz \graph [layered layout] { + a -- {b [> minimum layers=3], c, d} -- e -- a; + }; "]] } @@ -122,48 +124,48 @@ 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: + 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 \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 - } - }; - "]] - } + \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 + } + }; + "]] + } } @@ -174,15 +176,15 @@ 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 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 @@ -195,14 +197,14 @@ function Sugiyama:run() -- 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 } + 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() @@ -211,12 +213,12 @@ function Sugiyama:run() 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, @@ -228,13 +230,13 @@ function Sugiyama:run() 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 @@ -279,14 +281,14 @@ function Sugiyama:insertDummyNodes() 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{} + 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.ugraph:add {dummy.orig_vertex} self.ranking:setRank(dummy, rank) @@ -304,7 +306,7 @@ function Sugiyama:insertDummyNodes() local target = dummies[i] local dummy_edge = Edge.new{ - direction = Edge.RIGHT, + 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? } @@ -352,8 +354,8 @@ function Sugiyama:removeDummyNodes() 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] + local j = #bp + 1 - i + bp[i], bp[j] = bp[j], bp[i] end end @@ -373,7 +375,7 @@ function Sugiyama:mergeClusters() self.original_nodes = {} for _,cluster in ipairs(self.graph.clusters) do - + local cluster_node = cluster.nodes[1] table.insert(self.cluster_nodes, cluster_node) @@ -473,4 +475,4 @@ end -- done -return Sugiyama +return Sugiyama \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/crossing_minimization.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/crossing_minimization.lua index 54a1fafb231..6bede7eb015 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/crossing_minimization.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/crossing_minimization.lua @@ -48,11 +48,11 @@ local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare -- 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 +-- following various heuristics to solve this problem are -- presented. -- -- For more details, please see Section 4.1.4 of Pohlmann's Diploma --- thesis. +-- thesis. -- -- @end @@ -66,16 +66,16 @@ declare { 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. + 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. - "]] -} + 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/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/cycle_removal.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/cycle_removal.lua index 18670df14e8..63c43f5b14f 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/cycle_removal.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/cycle_removal.lua @@ -34,38 +34,39 @@ declare { phase = "cycle removal", phase_default = true, - summary = [[" - Selects a cycle removal algorithm that is especially - appropriate for graphs specified ``by hand''. + 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. - "]] + 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. + "]] } --- @@ -75,12 +76,12 @@ declare { 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. + 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. + documentation = [[" + See section 4.1.1 of Pohlmann's Diploma theses for details. "]] } @@ -92,12 +93,12 @@ declare { 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. + 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. + documentation = [[" + See section 4.1.1 of Pohlmann's Diploma theses for details. "]] } @@ -108,13 +109,14 @@ declare { 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. + 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. + documentation = [[" + See section 4.1.1 of Pohlmann's Diploma theses for details. "]] } @@ -125,12 +127,13 @@ declare { 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. + 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. + documentation = [[" + See section 4.1.1 of Pohlmann's Diploma theses for details. "]] - } \ No newline at end of file + } + diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/edge_routing.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/edge_routing.lua index eb9939c74ce..b790d527e3d 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/edge_routing.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/edge_routing.lua @@ -21,10 +21,10 @@ local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare -- 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. +-- applied in order to avoid overlaps of nodes and edges. -- --- For more details, please see Section~4.1.5 of Pohlmann's Diploma --- thesis. +-- For more details, please see Section 4.1.5 of Pohlmann's Diploma +-- thesis. -- -- @end @@ -38,12 +38,13 @@ declare { phase = "layer edge routing", phase_default = true, - summary = [[" - This edge routing algorithm uses polygonal lines to connect nodes. + 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. - "]] -} + 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/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/library.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/library.lua index 950e02ffa36..9f681929ecb 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/library.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/library.lua @@ -30,37 +30,34 @@ -- 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.) +-- \item +-- Jannis Pohlmann, +-- \newblock \emph{Configurable Graph Drawing Algorithms +-- for the \tikzname\ Graphics Description Language,} +-- \newblock Diploma Thesis, +-- \newblock Institute of Theoretical Computer Science, Univerist\"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. +-- \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, @@ -70,11 +67,11 @@ -- 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. +-- 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 diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/node_positioning.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/node_positioning.lua index e51382d6427..8fa55f9cbb9 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/node_positioning.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/node_positioning.lua @@ -22,14 +22,15 @@ local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare -- 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 +-- 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. +-- level distance in order to avoid overlaps. -- --- For more details, please see Section~4.1.2 of Pohlmann's Diploma thesis. +-- For more details, please see Section 4.1.2 of Pohlmann's Diploma +-- thesis. -- -- @end @@ -43,13 +44,14 @@ declare { phase = "node positioning", phase_default = true, - summary = [[" - This node positioning method, due to Gasner et al., is based on a - linear optimization problem. + 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. - "]] -} + 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/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/node_ranking.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/node_ranking.lua index c663d9ce366..7aef0bde5fc 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/node_ranking.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/layered/node_ranking.lua @@ -18,15 +18,15 @@ local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare -- -- 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 +-- 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. +-- For more details, please see Section 4.1.2 of Pohlmann's Diploma +-- thesis. -- -- @end @@ -40,17 +40,17 @@ declare { phase = "node ranking", phase_default = true, - summary = [[" - This layer assignment method, due to Gasner et al., is based on a - linear optimization problem. + summary = [[" + This layer assigment 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. - "]] -} + documentation = [[" + For more details, please see Section 4.1.2 of Pohlmann's Diploma + thesis. + + This is the default algorithm for layer assignments. + "]] + } @@ -61,12 +61,14 @@ declare { algorithm = "pgf.gd.layered.NodeRankingMinimumHeight", phase = "node ranking", - summary = [[" - This layer assignment method minimizes the height of the resulting graph. + summary = [[" + This layer assigment method minimizes the height of the resulting + graph. "]], - documentation = [[" - For more details, please see Section~4.1.3 of Pohlmann's Diploma thesis. - "]] -} + documentation = [[" + For more details, please see Section 4.1.3 of Pohlmann's Diploma + thesis. + "]] + } diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib.lua index cc39ddd6070..bcd4f6cfc1e 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib.lua @@ -67,7 +67,7 @@ end function lib.find_min(array, f) local best = math.huge local best_result - local best_index + local best_index for i=1,#array do local t = array[i] local result, p = f(t,i,array) @@ -89,9 +89,9 @@ 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 +-- @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. -- @@ -110,10 +110,10 @@ 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 +-- @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. -- @@ -129,7 +129,7 @@ end --- --- Apply a function to all pairs of a table, resulting in a new table. +-- 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 @@ -140,7 +140,7 @@ end -- 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) @@ -159,7 +159,7 @@ end --- -- Apply a function to all elements of an array, resulting in a new --- array. +-- array. -- -- @param source The array. -- @param fun A function taking two arguments (|val| and |i|, the @@ -169,14 +169,14 @@ end -- 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} @@ -238,27 +238,23 @@ end -- 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 +-- and if |/graph drawin/foo| has an inital 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 --- % +-- 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|. +-- set for the option |foo|. -- --- @param name The name of the options +-- @param name The name of the options -- @param ... Any number of objects. Each must have an options --- field. +-- field. -- -- @return The found option @@ -266,10 +262,10 @@ function lib.lookup_option(name, ...) local list = {...} for i=1,#list-1 do local o = list[i].options - if o then + if o then local v = rawget(o, name) if v then - return v + return v end end end @@ -284,12 +280,12 @@ end -- 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 +-- it exsist. 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 {} -- @@ -301,14 +297,13 @@ end -- --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 +-- local l = Point.length(self) -- Call base class's function -- return math.sqrt(l*l + self.z*self.zdy) --end -- @@ -323,31 +318,31 @@ end 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) - + t.new = t.new or + function (initial) + -- Create new object local obj = {} for k,v in pairs(initial or {}) do - obj[k] = v + obj[k] = v end setmetatable(obj, t) if obj.constructor then - obj:constructor() + obj:constructor() end - + return obj end - - -- Third, setup inheritance, if necessary + + -- Third, setup inheritence, if necessary if not getmetatable(t) then setmetatable(t, t.base_class) end @@ -364,8 +359,8 @@ end -- 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. --- % +-- another file. +-- --\begin{codeexample}[code only] -- -- File Foo.lua -- local Foo = {} @@ -393,24 +388,23 @@ end function lib.ondemand(filename, table, name) return function(...) - require (filename) - return table[name] (...) - end + 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. +-- This implements the legacy random number generator of Lua 5.2 in +-- pure Lua. This is needed for Lua 5.3 compatibility to obtain +-- consitent results. -- -- @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 + local r = math.random() if l and u then assert(l <= u) return math.floor(r*(u-l+1)) + l @@ -422,14 +416,6 @@ function lib.random(l,u) 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/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/Bezier.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/Bezier.lua index e4fe21d9422..292f9e56bf2 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/Bezier.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/Bezier.lua @@ -13,7 +13,7 @@ --- -- This library offers a number of methods for working with Bezi\'er --- curves. +-- curves. local Bezier = {} @@ -29,7 +29,7 @@ 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 +-- as return value as well as the two suport vector for curve -- before this point and two support vectors for the curve after the -- point. -- @@ -115,7 +115,7 @@ function Bezier.supportsForPointsAtTime(from, p1, t1, p2, t2, to) 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 @@ -127,7 +127,7 @@ function Bezier.supportsForPointsAtTime(from, p1, t1, p2, t2, to) -- -- 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 @@ -138,16 +138,16 @@ function Bezier.supportsForPointsAtTime(from, p1, t1, p2, t2, to) 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 diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/Direct.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/Direct.lua index 81728a1a444..aaad047c702 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/Direct.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/Direct.lua @@ -30,12 +30,12 @@ local Digraph = require "pgf.gd.model.Digraph" -- 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 +-- the other way round. In detail, "a <- b" is tranlated 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" +-- @param syntactic_digraph A syntacitic digraph, usually the "input" -- graph as specified syntactically be the user. -- -- @return A new "semantic" digraph object. @@ -49,12 +49,12 @@ function Direct.digraphFromSyntacticDigraph(syntactic_digraph) for _,m in ipairs(a.syntactic_edges) do local direction = m.direction if direction == "->" then - digraph:connect(a.tail, a.head) + digraph:connect(a.tail, a.head) elseif direction == "<-" then - digraph:connect(a.head, a.tail) + digraph:connect(a.head, a.tail) elseif direction == "--" or direction == "<->" then - digraph:connect(a.tail, a.head) - digraph:connect(a.head, a.tail) + digraph:connect(a.tail, a.head) + digraph:connect(a.head, a.tail) end -- Case -!-: No edges... end @@ -92,4 +92,4 @@ end -- Done -return Direct +return Direct \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/Event.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/Event.lua index 880796ce973..952f37796eb 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/Event.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/Event.lua @@ -19,7 +19,7 @@ -- 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 +-- accessed through the graph objects, some syntactic inforamtion 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 @@ -35,37 +35,37 @@ -- -- 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. +-- \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. +-- 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 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. +-- index. -- local Event = {} Event.__index = Event diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/LookupTable.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/LookupTable.lua index fc2043d5237..0014c94a375 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/LookupTable.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/LookupTable.lua @@ -13,7 +13,7 @@ --- -- This table provides two utility functions for managing ``lookup --- tables''. Such a table is a mixture of an array and a hashtable: +-- 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 @@ -30,7 +30,7 @@ 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. +-- again. -- -- This operation takes time $O(|\verb!array!|)$. -- @@ -50,7 +50,7 @@ end --- -- Add one element to a lookup table. If it is already present in the --- table, it will not be added again. +-- table, it will not be added again. -- -- This operation takes time $O(1)$. -- diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/PathLengths.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/PathLengths.lua index 4bfa896ef95..05b480713b0 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/PathLengths.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/PathLengths.lua @@ -27,11 +27,11 @@ local PriorityQueue = require "pgf.gd.lib.PriorityQueue" --- --- Performs the Dijkstra algorithm to solve the single-source shortest path problem. +-- Performs the Dijkstra algorithm to solve the single-source shortes 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 +-- 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. @@ -39,7 +39,7 @@ local PriorityQueue = require "pgf.gd.lib.PriorityQueue" -- @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 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 @@ -95,7 +95,7 @@ end --- --- Performs the Floyd-Warshall algorithm to solve the all-source shortest path problem. +-- Performs the Floyd-Warshall algorithm to solve the all-source shortes path problem. -- -- @param graph The graph to compute the shortest paths for. -- diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/PriorityQueue.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/PriorityQueue.lua index 3fd29cdb748..378800fbf5b 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/PriorityQueue.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/PriorityQueue.lua @@ -107,7 +107,7 @@ end --- Internals: An implementation of Fibonacci heaps. +-- Internals: An implementation of fibonacci heaps. FibonacciHeap.__index = FibonacciHeap @@ -200,7 +200,7 @@ 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) @@ -231,7 +231,7 @@ end function FibonacciHeap:linkRoots(root, child) child.root = root child.parent = root - + child = self:removeTableElement(self.trees, child) table.insert(root.children, child) diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/Simplifiers.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/Simplifiers.lua index bcb72761909..abb428b8725 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/Simplifiers.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/Simplifiers.lua @@ -12,7 +12,7 @@ --- The Simplifiers class is a singleton object. --- Its methods allow implement methods for simplifying graphs, for instance +-- Its methods allow implement methods for simplifing graphs, for instance -- for removing loops or multiedges or computing spanning trees. local Simplifiers = {} @@ -104,7 +104,7 @@ function Simplifiers:classifyEdges(graph) completed[node] = true pop() else - for i=#edges_to_traverse,1,-1 do + for i=#edges_to_traverse,1,-1 do local neighbour = edges_to_traverse[i]:getNeighbour(node) discovered[neighbour] = true push(neighbour) @@ -199,9 +199,9 @@ function Simplifiers:collapseMultiedgesOldModel(algorithm, collapse_action) collapsed_edges[multiedge[neighbour]] = {} end - if collapse_action then - collapse_action(multiedge[neighbour], edge, graph) - end + if collapse_action then + collapse_action(multiedge[neighbour], edge, graph) + end table.insert(collapsed_edges[multiedge[neighbour]], edge) end @@ -251,12 +251,12 @@ function Simplifiers:expandMultiedgesOldModel(algorithm) -- Copy bend points for _,p in ipairs(multiedge.bend_points) do - edge.bend_points[#edge.bend_points+1] = p:copy() + 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 + edge.algorithmically_generated_options[k] = v end for _,node in ipairs(edge.nodes) do @@ -276,4 +276,4 @@ end -- Done -return Simplifiers +return Simplifiers \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/Stack.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/Stack.lua index 75084b6e38b..dfab15697de 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/Stack.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/Stack.lua @@ -13,7 +13,7 @@ --- A Stack is a very simple wrapper around an array -- --- +-- local Stack = {} Stack.__index = Stack diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/Storage.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/Storage.lua index e029fdf7ff8..eb520e77452 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/Storage.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/Storage.lua @@ -19,12 +19,12 @@ -- 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''. +-- 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 +-- it has visisted. 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] @@ -40,13 +40,13 @@ -- 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. +-- 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() +--local info = Storage.newTableStorage() -- --info[v].marked = true -- the "info[v]" table is -- -- created automatically here @@ -66,7 +66,7 @@ require("pgf.gd.lib").Storage = Storage local SimpleStorageMetaTable = { __mode = "k" } --- The advanced metatable for table storages: +-- The adcanved metatable for table storages: local TableStorageMetaTable = { __mode = "k", @@ -91,7 +91,7 @@ end --- -- Create a new storage object which will install a table for every --- entry automatically. +-- entry automatilly. -- -- @return A new |Storage| instance. diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/Transform.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/Transform.lua index 7695b1b2395..1f81b269202 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/Transform.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/lib/Transform.lua @@ -42,7 +42,7 @@ function Transform.new(a,b,c,d,x,y) end ---- Creates a new transformation object that represents a shift. +--- Creates a new transformation object that represents a shift. -- -- @param x An x-shift -- @param y A y-shift @@ -54,7 +54,7 @@ function Transform.new_shift(x,y) end ---- Creates a new transformation object that represents a rotation. +--- Creates a new transformation object that represents a rotation. -- -- @param angle An angle -- @@ -67,7 +67,7 @@ function Transform.new_rotation(angle) end ---- Creates a new transformation object that represents a scaling. +--- 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) @@ -94,8 +94,8 @@ 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 } + a3*b1 + a4*b3, a3*b2 + a4*b4, + a1*b5 + a2*b6 + a5, a3*b5 + a4*b6 + a6 } end @@ -117,4 +117,4 @@ end -- Done -return Transform +return Transform \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Arc.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Arc.lua index e007e9b59b7..997a452399f 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Arc.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Arc.lua @@ -14,10 +14,10 @@ -- 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. +-- 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. +-- 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. @@ -28,7 +28,7 @@ -- 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. +-- synactic 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 @@ -72,7 +72,7 @@ -- @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 +-- @field syntactic_edges In case this arc is an arc in the syntatic -- 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|. @@ -106,17 +106,15 @@ local lib = require 'pgf.gd.lib' -- 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. +-- corresponding to the same arc. -- -- @param option A string option like |"length"|. -- --- @return A table with the following contents: --- % +-- @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: --- % +-- \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 @@ -127,32 +125,31 @@ local lib = require 'pgf.gd.lib' -- 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: --- % +-- 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 behaviour 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') @@ -161,16 +158,17 @@ local lib = require 'pgf.gd.lib' -- 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} +-- +--\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 @@ -187,23 +185,23 @@ function Arc:optionsArray(option) if arc then for _,m in ipairs(arc.syntactic_edges) do if m.options[option] ~= nil then - aligned[#aligned + 1] = m + 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 + 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 @@ -213,7 +211,7 @@ function Arc:optionsArray(option) t[#t+1] = anti_aligned[i].options[option] end cache[option] = t - + return t end @@ -223,11 +221,11 @@ 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. +-- synactic edge, |nil| is returned. -- -- @param option An option -- @param only_aligned If true, only aligned syntactic edges will be --- considered. +-- considered. -- @return The first entry of the |optionsArray| function Arc:options(option, only_aligned) if only_aligned then @@ -258,7 +256,7 @@ end -- 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 +-- corresponding to |self|, |nil| is returned. If there is exectly one -- edge, the value of this edge is returned. Otherwise, the result of -- repeatedly applying the |accumulator| function as described -- above. @@ -267,7 +265,6 @@ end -- |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} @@ -280,7 +277,7 @@ function Arc:optionsAccumulated(option, accumulator, only_aligned) if v == nil then v = opt[1] for i=2,#aligned do - v = accumulator(v, opt[i]) + v = accumulator(v, opt[i]) end align[accumulator] = v end @@ -290,7 +287,7 @@ function Arc:optionsAccumulated(option, accumulator, only_aligned) if v == nil then v = opt[1] for i=2,#opt do - v = accumulator(v, opt[i]) + v = accumulator(v, opt[i]) end opt[accumulator] = v end @@ -304,7 +301,7 @@ 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 +-- head, the arc's tail and head are returned. Otherweise, 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, @@ -341,15 +338,15 @@ function Arc:pointCloud () 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 + if type(p) == "table" then + cloud[#cloud + 1] = p + end end end end self.cached_point_cloud = cloud return cloud -end +end @@ -380,7 +377,7 @@ function Arc:eventIndex () end self.cached_event_index = e return e -end +end @@ -392,16 +389,21 @@ end -- 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. +-- \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. @@ -410,7 +412,7 @@ 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 @@ -420,8 +422,8 @@ function Arc:spanPriority() 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) + 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 @@ -431,15 +433,15 @@ function Arc:spanPriority() 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) - + 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 @@ -459,7 +461,6 @@ end -- 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) @@ -484,34 +485,34 @@ function Arc:sync() 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 + 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 + 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 @@ -520,19 +521,19 @@ function Arc:sync() 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 + 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 + for _,o in ipairs(self.generated_options) do + e.generated_options[#e.generated_options+1] = o + end end - end + end end if self.animations then local head = self.head @@ -540,17 +541,17 @@ function Arc:sync() 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 + 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 + for _,o in ipairs(self.animations) do + e.animations[#e.animations+1] = o + end end end end @@ -571,8 +572,8 @@ end -- 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: --- % +-- Here is the code you would use to create the abovementioned path: +-- --\begin{codeexample}[code only, tikz syntax=false] --local a = g:connect(tail,head) --... @@ -584,19 +585,19 @@ end -- -- 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 + local a = edge.options['tail anchor'] + if a == "" then + a = "center" + end + return self.tail:anchor(a) + self.tail.pos + end end --- @@ -604,12 +605,12 @@ end 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 + local a = edge.options['head anchor'] + if a == "" then + a = "center" + end + return self.head:anchor(a) + self.head.pos + end end @@ -632,7 +633,7 @@ function Arc:setPolylinePath(coordinates) end p:appendLineto(self:headAnchorForArcPath()) - + self.path = p end diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Collection.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Collection.lua index abc454b7dbb..8ebb6f144cf 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Collection.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Collection.lua @@ -20,11 +20,11 @@ -- 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 +-- 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. +-- are the collections. On the displya 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 @@ -48,14 +48,14 @@ -- 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, +-- 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. +-- colleciton. 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| @@ -86,7 +86,7 @@ local Storage = require "pgf.gd.lib.Storage" -- function Collection.new(t) assert (type(t.kind) == "string" and t.kind ~= "", "collection kind not set") - + return setmetatable( { vertices = t.vertices or {}, @@ -111,7 +111,7 @@ end function Collection:registerAsChildOf(parent) self.parent = parent - if parent then + if parent then assert (getmetatable(parent) == Collection, "parent must be a collection") parent.child_collections[#parent.child_collections+1] = self end @@ -149,10 +149,10 @@ end 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 + if d.kind == kind then + a[#a + 1] = d else - rec (d, a) + rec (d, a) end end return a @@ -163,7 +163,7 @@ end --- -- The descendants of a collection are its children, plus their --- children, plus their children, and so on. +-- children, plus their children, and so on. -- -- @return An array of all descendants of |self|. It will be in -- preorder. @@ -184,15 +184,15 @@ end --- -- The descendants of a collection of the given |kind|. -- --- @param kind A collection kind. +-- @param kind A colleciton 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 + if d.kind == kind then + a[#a + 1] = d end rec (d, a) end @@ -205,4 +205,4 @@ end -- Done -return Collection +return Collection \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Coordinate.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Coordinate.lua index 3a4448ab089..815544ee705 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Coordinate.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Coordinate.lua @@ -10,17 +10,17 @@ -- @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 x -- @field y -- --- There is also a static field called |origin| that is always equal to the origin. +-- There is also a static field called |origin| that is always equal to the origin. local Coordinate = {} Coordinate.__index = Coordinate @@ -61,7 +61,7 @@ end --- Apply a transformation matrix to a coordinate, -- see |pgf.gd.lib.Transform| for details. -- --- @param t A transformation. +-- @param t A tansformation. function Coordinate:apply(t) local x = self.x @@ -74,7 +74,7 @@ end --- Shift a coordinate -- -- @param a An $x$ offset --- @param b A $y$ offset +-- @param b A $y$ offset function Coordinate:shift(a,b) self.x = self.x + a @@ -87,7 +87,7 @@ end -- inversed coordinate; only faster). -- -- @param a An $x$ offset --- @param b A $y$ offset +-- @param b A $y$ offset function Coordinate:unshift(a,b) self.x = self.x - a @@ -110,7 +110,7 @@ end --- -- Like |unshift|, only for coordinate parameters. -- --- @param c Another coordinate. +-- @param c Another coordinate. function Coordinate:unshiftByCoordinate(c) self.x = self.x - c.x @@ -119,7 +119,7 @@ end --- --- Moves the coordinate a fraction of |f| along a straight line to |c|. +-- Moves the coordinate a fraction of |f| along a straight line to |c|. -- -- @param c Another coordinate -- @param f A fraction @@ -268,13 +268,13 @@ end -- @return |max_x| -- @return |max_y| -- @return |center_x| The center of the bounding box --- @return |center_y| +-- @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 @@ -284,7 +284,7 @@ function Coordinate.boundingBox(array) 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 diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Digraph.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Digraph.lua index 30b600e308d..5c48059a605 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Digraph.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Digraph.lua @@ -12,12 +12,12 @@ ---- +--- -- 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, +-- the normal behaviour 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 @@ -31,17 +31,14 @@ -- 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. +-- \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 @@ -53,12 +50,12 @@ -- 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 +-- 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 @@ -66,7 +63,7 @@ -- 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. +-- same. -- -- @field vertices This array contains the vertices that are part of -- the digraph. Internally, this array @@ -106,18 +103,15 @@ -- 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. +--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: --- % +-- 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 @@ -128,7 +122,7 @@ -- -- 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 -- ... @@ -136,7 +130,7 @@ --\end{codeexample} -- -- @field arcs For any two vertices |t| and |h| of a graph, there may --- or may not be +-- 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 @@ -144,7 +138,7 @@ -- 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. +-- 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 @@ -170,7 +164,7 @@ -- 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 +-- The bottom line of the behaviour 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| @@ -194,12 +188,12 @@ local function recalc_arcs (digraph) end end digraph.arcs = arcs - return arcs + return arcs end -Digraph.__index = +Digraph.__index = function (t, k) - if k == "arcs" then + if k == "arcs" then return recalc_arcs(t) else return rawget(Digraph,k) @@ -229,7 +223,7 @@ local Vertex = require "pgf.gd.model.Vertex" -- 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 } @@ -245,8 +239,8 @@ local Vertex = require "pgf.gd.model.Vertex" --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)$. +-- +-- 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 @@ -274,7 +268,7 @@ function Digraph.new(initial) digraph.vertices = {} digraph.arcs = {} - if vertices then + if vertices then digraph:add(vertices) end return digraph @@ -315,25 +309,25 @@ end -- 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. +--- Test, whether a graph contains a given vertex. -- -- This operation takes time $O(1)$. -- @@ -348,7 +342,7 @@ end --- -- Returns the arc between two nodes, provided it exists. Otherwise, --- |nil| is returned. +-- |nil| is retured. -- -- This operation takes time $O(1)$. -- @@ -366,7 +360,7 @@ end ---- +--- -- Returns an array containing the outgoing arcs of a vertex. You may -- only iterate over his array using ipairs, not using pairs. -- @@ -421,7 +415,7 @@ function Digraph:orderOutgoing(v, vertices) -- Compute ordering of the arcs local reordered = {} for _,arc in ipairs(outgoing) do - reordered [lookup[arc.head]] = arc + reordered [lookup[arc.head]] = arc end -- Copy back @@ -463,7 +457,7 @@ function Digraph:orderIncoming(v, vertices) -- Compute ordering of the arcs local reordered = {} for _,arc in ipairs(incoming) do - reordered [lookup[arc.head]] = arc + reordered [lookup[arc.head]] = arc end -- Copy back @@ -476,9 +470,9 @@ end ---- +--- -- Connects two nodes by an arc and returns the newly created arc --- object. If they are already connected, the existing arc is returned. +-- object. If they are already connected, the existing arc is returned. -- -- This operation takes time $O(1)$. -- @@ -528,10 +522,10 @@ 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. +-- are given as parameter, remove the arc between them, if it exsits. -- -- 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 @@ -551,23 +545,23 @@ function Digraph:disconnect(v, t) -- 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 + 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 + 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 @@ -575,15 +569,15 @@ function Digraph:disconnect(v, t) 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 + -- 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 @@ -592,14 +586,14 @@ function Digraph:disconnect(v, t) 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 + 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 @@ -616,12 +610,12 @@ 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 +-- 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 @@ -643,16 +637,16 @@ end -- 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 + new_arc[k] = v end end @@ -688,11 +682,11 @@ end -- 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. +-- the graph in which the collapse occured. -- -- @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. +-- 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|. @@ -700,7 +694,7 @@ end -- 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. +-- @return The new vertex that represents the collapsed vertices. function Digraph:collapse(collapse_vertices, collapse_vertex, vertex_fun, arc_fun) @@ -710,7 +704,7 @@ function Digraph:collapse(collapse_vertices, collapse_vertex, vertex_fun, arc_fu collapse_vertex = Vertex.new {} end self:add {collapse_vertex} - + -- Copy the collapse_vertices and create lookup local cvs = {} for i=1,#collapse_vertices do @@ -722,29 +716,29 @@ function Digraph:collapse(collapse_vertices, collapse_vertex, vertex_fun, arc_fu -- 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 + 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) + 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 @@ -776,7 +770,7 @@ function Digraph:expand(vertex, vertex_fun, arc_fun) -- Add all vertices: self:add(cvs) - if vertex_fun then + if vertex_fun then for _,v in ipairs(cvs) do vertex_fun(vertex, v) end @@ -785,13 +779,13 @@ function Digraph:expand(vertex, vertex_fun, arc_fun) -- 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 + new_arc[k] = v end end - + if arc_fun then arc_fun(new_arc, vertex) end @@ -815,7 +809,7 @@ 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. @@ -831,13 +825,13 @@ function Digraph:__tostring() if #out_arcs > 0 then local t = {} for j,a in ipairs(out_arcs) do - t[j] = tostring(a.head) + 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(vstrings, ",\n") .. "\n }; \n" .. table.concat(astrings, ";\n") .. "\n}"; end @@ -846,4 +840,4 @@ end -- Done -return Digraph +return Digraph \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Edge.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Edge.lua index 45cbc60f9f7..87b06661e54 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Edge.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Edge.lua @@ -10,12 +10,12 @@ -- @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 +-- edges betwen 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: @@ -33,15 +33,15 @@ -- 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 |"-!-"| +-- \item |"->"| +-- \item |"--"| +-- \item |"<-"| +-- \item |"<->"| +-- \item |"-!-"| -- \end{enumerate} --- +-- -- -- @field head The head vertex of this edge. -- @@ -63,7 +63,7 @@ -- |InterfaceToAlgorithms|. -- -- @field animations An array of animations, see the |animations| --- field of the |Vertex| class for the syntax. +-- field of the |Vertex| class for the syntax. local Edge = {} Edge.__index = Edge @@ -79,14 +79,14 @@ require("pgf.gd.model").Edge = Edge 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} +--\end{codeexample} -- -- @param initial Values to override defaults. -- -- @return A new edge object. @@ -125,10 +125,10 @@ end -- 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. +-- routed differently. +-- +-- Here is the code you would use to create the abovementioned path: -- --- 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] @@ -140,19 +140,19 @@ end --\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 + local a = self.options['tail anchor'] + if a == "" then + a = "center" + end + return self.tail:anchor(a) + self.tail.pos + end end --- @@ -160,12 +160,12 @@ end 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 + local a = self.options['head anchor'] + if a == "" then + a = "center" + end + return self.head:anchor(a) + self.head.pos + end end @@ -188,7 +188,7 @@ function Edge:setPolylinePath(coordinates) end p:appendLineto(self:headAnchorForEdgePath()) - + self.path = p end diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Hyperedge.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Hyperedge.lua index cc265023fa5..3819e193689 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Hyperedge.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Hyperedge.lua @@ -11,7 +11,7 @@ ---- +--- -- @section subsection {Hyperedges} -- -- @end @@ -28,19 +28,19 @@ 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. + 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}; @@ -50,7 +50,7 @@ declare { \end{codeexample} "]] } - --- Done + +-- Done return Hyperedge \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Path.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Path.lua index cbd0f079bfb..93cd44cc218 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Path.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Path.lua @@ -10,32 +10,32 @@ -- @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 +-- closed or not. Each path segement, in turn, consists of a series of +-- Bézier curvers 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 +-- |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. +-- \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 bz 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 @@ -93,36 +93,36 @@ function Path.new(initial) 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 + 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 + 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 + if count == 0 then + new[#new+1] = "lineto" + else + count = count - 1 + end + new[#new+1] = e else - error ("invalid object on path") + error ("invalid object on path") end i = i + 1 end @@ -158,7 +158,7 @@ end -- @return A copy of the reversed path function Path:reversed() - + -- First, build segments local subpaths = {} local subpath = {} @@ -169,7 +169,7 @@ function Path:reversed() subpath = {} end end - + local prev local start @@ -178,9 +178,9 @@ function Path:reversed() local x = self[i] if x == "lineto" then subpath[#subpath+1] = { - action = 'lineto', - from = prev, - to = self[i+1] + action = 'lineto', + from = prev, + to = self[i+1] } prev = self[i+1] i = i + 2 @@ -192,9 +192,9 @@ function Path:reversed() i = i + 2 elseif x == "closepath" then subpath [#subpath + 1] = { - action = "closepath", - from = prev, - to = start, + action = "closepath", + from = prev, + to = start, } prev = nil start = nil @@ -203,11 +203,11 @@ function Path:reversed() 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, + action = "curveto", + from = prev, + to = to, + support_1 = s1, + support_2 = s2, } prev = self[i+3] i = i + 4 @@ -216,7 +216,7 @@ function Path:reversed() end end closepath () - + local new = Path.new () for _,subpath in ipairs(subpaths) do @@ -226,29 +226,29 @@ function Path:reversed() 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 + 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() + new:appendClosepath() end end end - + return new end @@ -314,7 +314,7 @@ 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. +-- not |nil|, a number that is the $x$-part of a coordiante . -- @param y The $y$-part of the coordinate. function Path:appendMoveto(x,y) @@ -327,7 +327,7 @@ 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. +-- |nil|, a number that is the $x$-part of a coordiante . -- @param y The $y$-part of the coordinate. function Path:appendLineto(x,y) @@ -362,7 +362,7 @@ function Path:appendCurveto(a,b,c,d,e,f) self[#self + 1] = a self[#self + 1] = b self[#self + 1] = c - end + end end @@ -371,7 +371,7 @@ end --- --- Makes a path ``rigid'', meaning that all coordinates that are only +-- Makes a path ``rigid,'' meaning that all coordinates that are only -- given as functions are replaced by the values these functions -- yield. @@ -406,7 +406,7 @@ 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. +-- rather than the actual boinding box of the path. -- -- If the path contains no coordinates, all return values are 0. -- @@ -415,22 +415,22 @@ end -- @return |max_x| -- @return |max_y| -- @return |center_x| The center of the bounding box --- @return |center_y| +-- @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 + 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 @@ -453,22 +453,21 @@ 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 +-- ``along the path |self|.'' The implementation uses a -- divide-and-conquer approach that should be reasonably fast in --- practice. +-- 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. +-- \item |index| The index of the segment in |self| where +-- the intersection occurs. +-- \item |time| The ``time'' at which a point travelling along the +-- segment from its start point to its end point. +-- \item |point| The point itself. -- \end{itemize} function Path:intersectionsWith(path) @@ -479,13 +478,13 @@ function Path:intersectionsWith(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 @@ -493,103 +492,103 @@ function Path:intersectionsWith(path) 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 + 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 + 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) + 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) + 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) + 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 + 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) + 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) + 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) + 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 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) - + return a.index < b.index or + a.index == b.index and a.time < b.time + end) + -- Remove duplicates local remains = {} remains[1] = intersections[1] @@ -609,15 +608,15 @@ end 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) + 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. +-- up a memoization array for the bounding boxes. function segmentize (path) @@ -628,20 +627,20 @@ function segmentize (path) 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), - } + 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 @@ -651,16 +650,16 @@ function segmentize (path) 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), - } + 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 @@ -668,18 +667,18 @@ function segmentize (path) 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), - } + 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 @@ -693,16 +692,16 @@ 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 @@ -713,8 +712,8 @@ end function bb (i, j, memo) local b = memo[memo.base*i + j] if not b then - assert (i < j, "memorization table filled incorrectly") - + assert (i < j, "memoization table filled incorrectly") + local mid = math.floor((i+j)/2) local bb1 = bb (i, mid, memo) local bb2 = bb (mid+1, j, memo) @@ -726,21 +725,21 @@ function bb (i, j, memo) } memo[memo.base*i + j] = b end - + return b end --- Intersect two Bézier curves. +-- Intersect two Bezier 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) - + 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) @@ -750,12 +749,12 @@ function intersect_curves(t0, t1, 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 - + 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 @@ -766,57 +765,57 @@ function intersect_curves(t0, t1, 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 + t=0 elseif t>1 then - t=1 + 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)) + 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) + 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) + 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) + 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) + 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 @@ -829,30 +828,30 @@ end -- segment and everything in the segment before the given time is -- removed from the path. -- --- @param index The index of a path segment. +-- @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") + "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 @@ -889,20 +888,20 @@ function Path:cutAtBeginning(index, time) 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 + local found for i=index,1,-1 do if self[i] == "moveto" then - -- Bingo: - found = i - break + -- Bingo: + found = i + break end end assert(found, "no moveto found in path") - + local to = rigid(self[found+1]) from:moveTowards(to,time) @@ -935,36 +934,36 @@ 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 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") + "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]) @@ -987,20 +986,20 @@ function Path:cutAtEnd(index, time) 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 + local found for i=index,1,-1 do if self[i] == "moveto" then - -- Bingo: - found = i - break + -- 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) @@ -1029,7 +1028,7 @@ 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 +-- 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 @@ -1041,29 +1040,29 @@ end -- 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] + start = 2 + subpath.skipped = subpath[1] end subpath[#subpath + 1] = subpath[start] subpath[#subpath + 1] = subpath[start+1] @@ -1071,11 +1070,11 @@ function Path:pad(padding) subpath = {} end end - + for i,p in ipairs(padded) do if p ~= "closepath" then if type(p) == "table" then - subpath[#subpath + 1] = p + subpath[#subpath + 1] = p end else closepath (i) @@ -1088,7 +1087,7 @@ function Path:pad(padding) 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 @@ -1096,19 +1095,19 @@ function Path:pad(padding) 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 + count = count + 1 elseif diff > math.pi then - count = count - 1 + 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) @@ -1116,21 +1115,21 @@ function Path:pad(padding) orth2:normalize() if count < 0 then - orth1:scale(-1) - orth2:scale(-1) + 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) + c = orth1 + orth2 + c:scale(padding/2) else - c = Coordinate.new (padding*(orth2.y-orth1.y)/det, padding*(orth1.x-orth2.x)/det) + c = Coordinate.new (padding*(orth2.y-orth1.y)/det, padding*(orth1.x-orth2.x)/det) end new_coordinates[i] = c+p @@ -1147,50 +1146,50 @@ function Path:pad(padding) local p = subpath[1] local new_p = new_coordinates[#subpath-2] p.x = new_p.x - p.y = new_p.y + 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 + 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 @@ -1203,12 +1202,12 @@ end -- 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. +-- 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. +-- 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 @@ -1233,7 +1232,7 @@ Path.appendArc = lib.ondemand("Path_arced", Path, "appendArc") -- 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. +-- clockise. -- @param trans A transformation matrix. If missing, -- the identity matrix is assumed. @@ -1250,7 +1249,7 @@ function Path:__tostring() 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 @@ -1275,4 +1274,4 @@ end -- Done -return Path +return Path \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Path_arced.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Path_arced.lua index 1875b8d1a50..92dd8ad87ac 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Path_arced.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Path_arced.lua @@ -61,7 +61,7 @@ local function cos_quarter(x) 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 @@ -80,14 +80,14 @@ local function atan2deg(y,x) 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 @@ -103,7 +103,7 @@ local function subarc (path, startx, starty, start_angle, delta, radius, trans, 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" @@ -116,14 +116,14 @@ local function subarc (path, startx, starty, start_angle, delta, radius, 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 @@ -132,65 +132,65 @@ local function arc (path, start, start_angle, end_angle, radius, trans, centerx, -- @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 + -- 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) + -- 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) + -- 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 + 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) + -- 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) + -- 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 + subarc(path, startx, starty, start_angle, end_angle - start_angle, radius, trans, centerx, centery) + break end end - + -- else, do nothing end end @@ -199,10 +199,10 @@ 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)) @@ -223,13 +223,13 @@ function Path:appendArcTo (target, radius_or_center, clockwise, trans) 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() @@ -242,56 +242,56 @@ function Path:appendArcTo (target, radius_or_center, clockwise, trans) 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 + centerx = start.x + centery = trans_target.y else - centerx = trans_target.x - centery = start.y + 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") + 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 + 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) + 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 @@ -302,7 +302,7 @@ function Path:appendArcTo (target, radius_or_center, clockwise, trans) 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: @@ -313,4 +313,4 @@ end -- Done -return true +return true \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Vertex.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Vertex.lua index 677ea4fbd06..c287181992f 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Vertex.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/model/Vertex.lua @@ -39,12 +39,12 @@ -- 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 +-- alwyas, ``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 +-- center, conside 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 @@ -100,7 +100,7 @@ -- |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 +-- time in secondds, 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 @@ -207,29 +207,29 @@ 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, + 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, + 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, + 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, + 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, + return min_x, max_y + end, ["north east"] = function(min_x, min_y, max_x, max_y) - return max_x, max_y - end, + return max_x, max_y + end, ["south west"] = function(min_x, min_y, max_x, max_y) - return min_x, min_y - end, + return min_x, min_y + end, ["south east"] = function(min_x, min_y, max_x, max_y) - return max_x, min_y - end, + return max_x, min_y + end, } --- @@ -260,10 +260,10 @@ function Vertex:anchor(anchor) 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) + 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 diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/pedigrees/Koerner2015.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/pedigrees/Koerner2015.lua index 32927530a29..df366a31687 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/pedigrees/Koerner2015.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/pedigrees/Koerner2015.lua @@ -29,9 +29,9 @@ local declare = InterfaceToAlgorithms.declare declare { key = "mate", type = "boolean", - - summary = [[" - Edges of type |mate| join mates. + + summary = [[" + Edges of type |mate| join mates. "]], } @@ -41,51 +41,50 @@ 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. + 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). + 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. + 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 }; - }; + \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 @@ -94,9 +93,9 @@ function Koerner2015:run() local visited = {} local ranks = {} - + local queue = { { g.vertices[1], 1 } } - + local queue_start = 1 local queue_end = 1 @@ -111,51 +110,51 @@ function Koerner2015:run() 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 + 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 + 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 + 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 + 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/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/AuthorDefinedPhylogeny.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/AuthorDefinedPhylogeny.lua index 04e1ca49f1a..f1acbd71281 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/AuthorDefinedPhylogeny.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/AuthorDefinedPhylogeny.lua @@ -34,22 +34,22 @@ declare { phase_default = true, summary = [[" - When this key is used, the phylogenetic tree must be specified - by the author (rather than being generated algorithmically). + 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. + 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] - } - }; + \tikz \graph [phylogenetic tree layout] { + a -- { + b [>length=2] --[length=1] { c, d }, + e [>length=3] + } + }; "]] } diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/BalancedMinimumEvolution.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/BalancedMinimumEvolution.lua index ef40f0ee60d..d2b64270796 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/BalancedMinimumEvolution.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/BalancedMinimumEvolution.lua @@ -34,44 +34,44 @@ declare { algorithm = BalancedMinimumEvolution, phase = "phylogenetic tree generation", - summary = [[" - The BME (Balanced Minimum Evolution) algorithm tries to minimize - the total tree length. + 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. + 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 }; + \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: @@ -79,25 +79,25 @@ function BalancedMinimumEvolution:run() 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'] + local optimization_class = self.tree.options.algorithm_phases['phylogenetic tree optimization'] optimization_class.new { main_algorithm = self.main_algorithm, tree = self.tree, @@ -106,11 +106,11 @@ function BalancedMinimumEvolution:run() is_leaf = self.is_leaf, }:run() end - - -- Finish + + -- Finish self:computeFinalLengths() self:createFinalEdges() - + return self.tree end @@ -119,8 +119,8 @@ end -- the BME (Balanced Minimum Evolution) algorithm -- [DESPER and GASCUEL: Fast and Accurate Phylogeny Reconstruction --- Algorithms Based on the Minimum-Evolution Principle, 2002] --- +-- 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. @@ -129,14 +129,14 @@ function BalancedMinimumEvolution:runBME() 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 + -- create the new node which will be connected to the first three leaves local new_node = InterfaceToAlgorithms.createVertex( self.main_algorithm, { @@ -147,12 +147,12 @@ function BalancedMinimumEvolution:runBME() 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]) + 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) - + 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]) @@ -166,7 +166,7 @@ function BalancedMinimumEvolution:runBME() -- 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 @@ -175,8 +175,8 @@ function BalancedMinimumEvolution:runBME() -- remove the old arc g:disconnect(tail, head) g:disconnect(head, tail) - - -- create the new node + + -- create the new node local new_node = InterfaceToAlgorithms.createVertex( self.main_algorithm, { @@ -187,28 +187,28 @@ function BalancedMinimumEvolution:runBME() } ) 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] + distances[leaves[k]][tail] = k_dists[head][tail] end if not is_leaf[head] then - distances[leaves[k]][head] = k_dists[tail][head] + 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)) - + 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 @@ -218,9 +218,9 @@ function BalancedMinimumEvolution:runBME() 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 @@ -228,27 +228,27 @@ end -- - 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 +-- 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! + 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 l = values.l local visited = values.visited visited[vertex] = vertex @@ -258,7 +258,7 @@ function BalancedMinimumEvolution:updateAverageDistances(vertex, values, k, leav local l = values.l local y1= values.y1 - -- calculate distance between Y{k} and X + -- 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) @@ -269,7 +269,7 @@ function BalancedMinimumEvolution:updateAverageDistances(vertex, values, k, leav 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 @@ -292,7 +292,7 @@ function BalancedMinimumEvolution:updateAverageDistances(vertex, values, k, leav 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 @@ -300,7 +300,7 @@ function BalancedMinimumEvolution:updateAverageDistances(vertex, values, k, leav 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) @@ -321,18 +321,18 @@ end -- 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 +-- it has 3 neighbours 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 +-- if center is a leaf, it has only one neighbour, 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 @@ -340,13 +340,13 @@ function BalancedMinimumEvolution:computeAverageDistancesToAllSubtreesForK(verte 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 + else -- to compute the distance we need the root's neighbouring 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 @@ -356,25 +356,25 @@ function BalancedMinimumEvolution:computeAverageDistancesToAllSubtreesForK(verte else arc_back = next_arc end - 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 + 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 + 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 +-- In computeAverageDistancesToAllSubtreesForK the distances to ALL possbile -- 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 @@ -386,7 +386,7 @@ end 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 @@ -395,11 +395,11 @@ function BalancedMinimumEvolution:setAccurateDistancesForK(center,visited,k,k_di 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 + distance = k_dists[center][vertex] -- use previously calculated distance distances[leaves[k]][vertex] = distance distances[vertex][leaves[k]] = distance end - -- go deeper + -- go deeper if not visited[vertex] then self:setAccurateDistancesForK(vertex,visited,k,k_dists,leaves) end @@ -419,7 +419,7 @@ end -- - 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 +-- length is minimzed -- - min_length: The smallest tree_length found so far function BalancedMinimumEvolution:findBestEdge(vertex, values, k_dists) local arcs = self.tree.arcs @@ -437,9 +437,9 @@ function BalancedMinimumEvolution:findBestEdge(vertex, values, k_dists) c = arc.head --last visited arc end end - + for i, arc in ipairs (unvisited_arcs) do - local change_in_tree_length = 0 + 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 @@ -456,15 +456,15 @@ function BalancedMinimumEvolution:findBestEdge(vertex, values, k_dists) 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 + -- 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 @@ -527,7 +527,7 @@ function BalancedMinimumEvolution:distance(a, b) else local distances = self.distances return distances[a][b] or distances[b][a] - end + end end @@ -543,7 +543,7 @@ function BalancedMinimumEvolution:computeFinalLengths() for _, arc in ipairs(g.arcs) do local head = arc.head local tail = arc.tail - local distance + 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 diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/BalancedNearestNeighbourInterchange.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/BalancedNearestNeighbourInterchange.lua index 1980afe7ad0..8077790224a 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/BalancedNearestNeighbourInterchange.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/BalancedNearestNeighbourInterchange.lua @@ -25,7 +25,7 @@ local lib = require("pgf.gd.lib") -- Shorthand: local declare = InterfaceToAlgorithms.declare - + --- declare { key = "balanced nearest neighbour interchange", @@ -33,45 +33,45 @@ declare { 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. + summary = [[" + The BNNI (Balanced Nearest Neighbour 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. + 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. + summary = [[" + Switches off any phylogenetic tree optimization. "]], } - - + + -- creates a binary heap, implementation as an array as described in --- the respective wikipedia article +-- 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] @@ -80,43 +80,43 @@ local function new_heap() 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 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 + 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 + 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 + left_child = 2*i right_child = 2*i +1 - else + else return element end end return element end - return heap + return heap end --- BNNI (Balanced Nearest Neighbor Interchange) +-- BNNI (Balanced Nearest Neighbour 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 -- @@ -140,21 +140,21 @@ function BalancedNearestNeighbourInterchange:run() -- achieve best swap and update the distance matrix, until there is -- no more swap to perform - while #possible_swaps > 0 do + 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) @@ -164,7 +164,7 @@ function BalancedNearestNeighbourInterchange:run() --update distance matrix self:updateBNNI(swap) - -- update heap: check neighboring arcs for new possible swaps + -- update heap: check neighbouring 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) @@ -179,7 +179,7 @@ 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 +-- is the -- same as the distance from b to a. -- -- @param a,b The nodes @@ -196,11 +196,11 @@ 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 +-- 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 @@ -211,7 +211,7 @@ function BalancedNearestNeighbourInterchange:updateBNNI(swap) 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) @@ -222,10 +222,10 @@ function BalancedNearestNeighbourInterchange:updateBNNI(swap) local v = swap.v local d = swap.same local w = swap.w - + if not values then values = { - visited = {[v] = v}, + visited = {[v] = v}, possible_ys = {v}, x = a, y = v @@ -239,16 +239,16 @@ function BalancedNearestNeighbourInterchange:updateBNNI(swap) 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 - + 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) @@ -257,13 +257,13 @@ function BalancedNearestNeighbourInterchange:updateBNNI(swap) 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 @@ -274,13 +274,13 @@ function BalancedNearestNeighbourInterchange:updateBNNI(swap) 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) @@ -288,7 +288,7 @@ function BalancedNearestNeighbourInterchange:updateBNNI(swap) 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) ) + 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 @@ -314,19 +314,19 @@ function BalancedNearestNeighbourInterchange:getBestSwap(arc, 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 + 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 @@ -334,7 +334,7 @@ function BalancedNearestNeighbourInterchange:getBestSwap(arc, heap_of_swaps) 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) @@ -349,9 +349,9 @@ function BalancedNearestNeighbourInterchange:getBestSwap(arc, heap_of_swaps) -- 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 + 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 @@ -360,7 +360,7 @@ function BalancedNearestNeighbourInterchange:getBestSwap(arc, heap_of_swaps) 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 + elseif swap2 > 0 then local swap = { v = v, w = w, subtree1 = b, subtree2 = d, d = c, a = a } possible_swaps:insert(swap, swap2) end diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/DistanceMatrix.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/DistanceMatrix.lua index a65a83da17b..d44f098161f 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/DistanceMatrix.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/DistanceMatrix.lua @@ -27,22 +27,22 @@ declare { 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. + 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'|. + 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 { @@ -50,95 +50,88 @@ declare { 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. + 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} + 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 behaviour 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|. - % + \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} "]] } - + --- @@ -147,38 +140,34 @@ declare { type = "string", summary = [[" - This key is used to specify the ``desired distances'' between - a vertex and the other vertices in a graph. + 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|. - % + 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) +local function to_index(s, indices) if s and s ~= "" then if s:sub(1,1) == '"' then local _, _, m = s:find('"(.*)"') @@ -189,9 +178,9 @@ local function to_index(s, indices) else local num = tonumber(s) if not num then - return indices[InterfaceToAlgorithms.findVertexByName(s)] + return indices[InterfaceToAlgorithms.findVertexByName(s)] else - return num + return num end end end @@ -199,7 +188,7 @@ 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 @@ -211,17 +200,17 @@ local function compute_indices(vertex_string, vertices) 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 + 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 @@ -233,24 +222,24 @@ end --- -- Compute a distance matrix based on the values of a --- |distance matrix| and a |distance matrix vertices|. +-- |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 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) +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 = {} @@ -266,29 +255,29 @@ function DistanceMatrix.computeDistanceMatrix(matrix_string, vertex_string, vert 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 + 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 + x = 1 + y = y + 1 elseif start == ',' then - x = x + 1 + 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) + 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 @@ -305,7 +294,7 @@ function DistanceMatrix.computeDistanceMatrix(matrix_string, vertex_string, vert for x=1,n do for y=1,n do if not m[x][y] then - m[x][y] = m[y][x] or 0 + m[x][y] = m[y][x] or 0 end end end @@ -337,11 +326,11 @@ end -- 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) + +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 = {} @@ -352,19 +341,19 @@ function DistanceMatrix.computeDistanceVector(vector_string, vertex_string, vert 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 + local _, parse + _, pos, parse = vector_string:find(">([^%s>;]*)", pos) + x = to_index(parse, indices) or x elseif start == ',' then - x = x + 1 + 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) + 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 @@ -387,7 +376,7 @@ end --- -- Compute a distance matrix for a graph that incorporates all -- information stored in the different options of the graph and the --- vertices. +-- vertices. -- -- @param graph A digraph object. -- @@ -407,7 +396,7 @@ function DistanceMatrix.graphDistanceMatrix(digraph) indices[i] = v indices[v] = i end - + if digraph.options['distance matrix'] then local sub, vers = DistanceMatrix.computeDistanceMatrix( digraph.options['distance matrix'], @@ -417,7 +406,7 @@ function DistanceMatrix.graphDistanceMatrix(digraph) for x=1,#vers do for y=1,#vers do - m[vers[x]][vers[y]] = sub[x][y] + m[vers[x]][vers[y]] = sub[x][y] end end end @@ -425,24 +414,24 @@ function DistanceMatrix.graphDistanceMatrix(digraph) 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 + v.options['distances'], + v.options['distance matrix vertices'], + vertices ) - + for x=1,#vers do - m[vers[x]][v] = sub[x] + 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 diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/Maeusle2012.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/Maeusle2012.lua index a9acc488652..528110b57ea 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/Maeusle2012.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/Maeusle2012.lua @@ -39,36 +39,36 @@ declare { algorithm = { base_class = Maeusle2012, run = function (self) - local root = self:getRoot() - self:setPosForRectangularLayout(root) - end + local root = self:getRoot() + self:setPosForRectangularLayout(root) + end }, phase = "phylogenetic tree layout", phase_default = true, - summary = [[" - A rooted rectangular phylogram is... + 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 }; + \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" } }, @@ -81,35 +81,35 @@ declare { algorithm = { base_class = Maeusle2012, run = function (self) - local root = self:getRoot() - self:setXPos(root) - self:setYPosForStraightLayout(root) - end + local root = self:getRoot() + self:setXPos(root) + self:setYPosForStraightLayout(root) + end }, phase = "phylogenetic tree layout", - summary = [[" - A rooted straight phylogram is... + 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 }; + \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" } }, @@ -122,91 +122,91 @@ declare { algorithm = { base_class = Maeusle2012, run = function (self) - local root1, root2 = self:getRoot() - self:setPosForUnrootedRectangular(root2, root1) - end + local root1, root2 = self:getRoot() + self:setPosForUnrootedRectangular(root2, root1) + end }, phase = "phylogenetic tree layout", - summary = [[" - A unrooted rectangular phylogram is... + 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 }; + \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 + local root1, root2 = self:getRoot() + self:setPosForUnrootedStraight(root2, root1) + end }, phase = "phylogenetic tree layout", - summary = [[" - A unrooted straight phylogram is... + 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 }; + \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. + 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|.) + (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 @@ -221,12 +221,12 @@ end -- @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. +-- 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 @@ -235,10 +235,10 @@ function Maeusle2012:setPosForRectangularLayout(vertex, values, vertex2) 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) + --current vertex (for the later determination of inner vertices + --x-positions) for _, arc in ipairs (self.tree:outgoing(vertex)) do @@ -251,10 +251,10 @@ function Maeusle2012:setPosForRectangularLayout(vertex, values, vertex2) -- 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 @@ -263,9 +263,9 @@ function Maeusle2012:setPosForRectangularLayout(vertex, values, vertex2) -- 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 @@ -276,7 +276,7 @@ function Maeusle2012:setPosForRectangularLayout(vertex, values, vertex2) 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. @@ -287,12 +287,12 @@ function Maeusle2012:setPosForRectangularLayout(vertex, values, vertex2) 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 @@ -301,33 +301,33 @@ function Maeusle2012:setPosForRectangularLayout(vertex, values, vertex2) 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 + -- 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. +-- 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 @@ -349,26 +349,26 @@ function Maeusle2012:setXPos(vertex, values, vertex2) -- go deeper self:setXPos(arc.head, values, vertex2) - + -- get the children of the current vertex - table.insert(children, arc.head) + 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 + else -- determine the outer children local left_child = children[1] local right_child = left_child @@ -376,12 +376,12 @@ function Maeusle2012:setXPos(vertex, values, vertex2) 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 @@ -406,7 +406,7 @@ 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 @@ -421,7 +421,7 @@ function Maeusle2012:setYPosForStraightLayout(vertex, values, vertex2) 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 @@ -439,10 +439,10 @@ function Maeusle2012:setYPosForStraightLayout(vertex, values, vertex2) -- go deeper self:setYPosForStraightLayout(arc.head, values, vertex2) - + -- get the children of the current vertex - table.insert(children, arc.head) - + table.insert(children, arc.head) + values.length = values.length - arc_length end end @@ -451,13 +451,13 @@ function Maeusle2012:setYPosForStraightLayout(vertex, values, vertex2) -- 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 + + -- 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 @@ -472,7 +472,7 @@ end -- @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 @@ -484,12 +484,12 @@ function Maeusle2012:correctXPos(vertex1, vertex2, straight) 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) + + 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 @@ -499,9 +499,9 @@ function Maeusle2012:correctXPos(vertex1, vertex2, straight) return values end - + -- compute the difference of the x-positions of the two subtrees' - -- roots + -- roots local diff = vertex1.pos.x - vertex2.pos.x local values = { visited = {} } if diff < 0 then @@ -510,7 +510,7 @@ function Maeusle2012:correctXPos(vertex1, vertex2, straight) elseif diff > 0 then values.diff = diff x_correction(vertex2, values, vertex1) - end + end end @@ -521,10 +521,10 @@ end -- 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 +-- +-- @param vertex1, vertex2: The vertices functioning as roots function Maeusle2012:setPosForUnrootedRectangular(vertex1, vertex2) - -- set positions for first half of the tree... + -- 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 @@ -547,14 +547,14 @@ end -- 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={ @@ -576,7 +576,7 @@ 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) @@ -597,7 +597,7 @@ function Maeusle2012:findLongestPath() 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 @@ -615,7 +615,7 @@ function Maeusle2012:findLongestPath() 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 @@ -626,11 +626,11 @@ function Maeusle2012:findLongestPath() 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 @@ -659,7 +659,7 @@ function Maeusle2012:getPathLengthsToLeaves(vertex, values) } table.insert(values.path,vertex) end - + local vertex_is_leaf = true values.visited[vertex] = true @@ -671,13 +671,13 @@ function Maeusle2012:getPathLengthsToLeaves(vertex, values) 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 @@ -699,7 +699,7 @@ function Maeusle2012:getPathLengthsToLeaves(vertex, values) paths = values.paths, leaves = values.leaves } return path_information -end +end -- Gets the root of a tree @@ -732,13 +732,13 @@ function Maeusle2012:computeCenterOfPath() 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 - + 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 @@ -765,12 +765,12 @@ function Maeusle2012:computeCenterOfPath() 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 end break end end - + return root, neighbor_of_root end diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/PhylogeneticTree.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/PhylogeneticTree.lua index 242ccf183ff..f66f2553306 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/PhylogeneticTree.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/PhylogeneticTree.lua @@ -29,53 +29,53 @@ local declare = InterfaceToAlgorithms.declare declare { key = "phylogenetic tree layout", algorithm = PhylogeneticTree, - + postconditions = { upward_oriented = true }, - summary = [[" - Layout for drawing phylogenetic trees. + 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 }; + \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 +-- "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 + -- 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 { diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/SokalMichener1958.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/SokalMichener1958.lua index 6a665b67322..8be5c1d51e9 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/SokalMichener1958.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/SokalMichener1958.lua @@ -35,33 +35,33 @@ declare { 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. - "]], + 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. + 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 }; + \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" } }, @@ -79,14 +79,14 @@ declare { -- 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 + + -- store the phylogentic tree object, containing all user-specified -- graph information self:runUPGMA() self:createFinalEdges() @@ -109,19 +109,19 @@ function SokalMichener1958:runUPGMA() 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: + -- Iniitialise 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 @@ -153,7 +153,7 @@ function SokalMichener1958:newCluster(vertex) 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. + -- necessary for determining the distances of newly generated nodes to their children. } end @@ -184,7 +184,7 @@ end -- @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] @@ -199,7 +199,7 @@ function SokalMichener1958:mergeClusters(clusters, index_of_first_cluster, index cluster.distances[cluster1] = dist end end - + -- delete cluster2 table.remove(clusters, index_of_second_cluster) @@ -218,8 +218,8 @@ function SokalMichener1958:mergeClusters(clusters, index_of_first_cluster, index 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 - + 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 @@ -229,7 +229,7 @@ function SokalMichener1958:mergeClusters(clusters, index_of_first_cluster, index 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 @@ -252,7 +252,7 @@ function SokalMichener1958:createFinalEdges() InterfaceToAlgorithms.createEdge( self.main_algorithm, arc.tail, arc.head, { generated_options = { - { key = "phylogenetic edge", value = tostring(self.lengths[arc.tail][arc.head]) } + { key = "phylogenetic edge", value = tostring(self.lengths[arc.tail][arc.head]) } }}) end end diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/library.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/library.lua index 5ab821c4a81..29183a57739 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/library.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/phylogenetics/library.lua @@ -12,7 +12,7 @@ --- --- A phylogenetic tree (or network) depicts the evolutionary history +-- A phylogenetic tree (or network) depicts the evolutionary histroy -- of species or, more generally, so called taxa. The present library -- includes a number of algorithms for drawing phylogenetic trees. -- diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/BoyerMyrvold2004.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/BoyerMyrvold2004.lua index f587861d79d..f30c940a921 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/BoyerMyrvold2004.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/BoyerMyrvold2004.lua @@ -41,7 +41,7 @@ first in the dfs) -leastancestor Dfi of the vertex with lowest dfi that can be reached using one back edge -(non-tree edge) +(non-tree edge) -lowpoint Dfi of the vertex with lowest dfi that can be reached using any number of @@ -119,143 +119,143 @@ local Embedding = require "pgf.gd.planar.Embedding" BM.__index = BM function BM.new() - local t = {} - setmetatable(t, BM) - return t + 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 + 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) + 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) + 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) + 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 + -- 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 + -- 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 + 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, @@ -266,63 +266,63 @@ end -- 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 + 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] + -- 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 @@ -336,76 +336,76 @@ end -- 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] + 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 + 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 + -- 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() + return vertex.backedgeindex == currentindex + or not vertex.pertinentroots:empty() end --- returns true if the given vertex is externally active at the current step +-- returns ttue 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) + 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 @@ -414,148 +414,148 @@ end -- 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 + 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 sais, 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 + 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 + 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 @@ -565,91 +565,91 @@ end -- 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 + -- 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 @@ -659,20 +659,20 @@ end -- 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 + 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/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/Embedding.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/Embedding.lua index 8d9d3b53b14..50fc3672207 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/Embedding.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/Embedding.lua @@ -6,783 +6,782 @@ require("pgf.gd.planar").Embedding = E 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 + __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 + __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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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] + 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 + 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 + 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 + 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 + 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 + 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/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/LinkedList.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/LinkedList.lua index 35f8418fdf0..99a23501858 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/LinkedList.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/LinkedList.lua @@ -3,86 +3,86 @@ local LinkedList = {} LinkedList.__index = LinkedList function LinkedList.new() - local list = {elements = {}} - setmetatable(list, LinkedList) - return list + 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 + 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 + 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 + 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 + 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() + 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 + return self.head and self.head.payload end function LinkedList:last() - return self.head and self.head.prev.payload + return self.head and self.head.prev.payload end function LinkedList:empty() - return self.head == nil + return self.head == nil end return LinkedList diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/List.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/List.lua index 22a91e65710..564216a8c37 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/List.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/List.lua @@ -3,47 +3,47 @@ local List = {} List.__index = List function List.new() - local t = {first = 0, last = -1} - setmetatable(t, List) - return t + 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 + 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 + 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 + 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 + 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 + return self.last - self.first + 1 end function List:empty() - return self.last < self.first + return self.last < self.first end return List diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/PDP.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/PDP.lua index 8c159cf61dc..fbf94a52502 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/PDP.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/PDP.lua @@ -11,564 +11,564 @@ 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 + 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 + 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 + 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 devided + 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 devided + 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 devided + 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 devided + 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 + 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 + 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 diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/PlanarLayout.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/PlanarLayout.lua index 9e5b8d72ec0..8796148de80 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/PlanarLayout.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/PlanarLayout.lua @@ -15,145 +15,145 @@ 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 - } - "]] - } + 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 + --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/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/ShiftMethod.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/ShiftMethod.lua index c568ca56964..9716aa27e4a 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/ShiftMethod.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/ShiftMethod.lua @@ -8,121 +8,121 @@ local Embedding = require("pgf.gd.planar.Embedding") SM.__index = SM function SM.new() - local t = {} - setmetatable(t, SM) - return t + 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 = {} + 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] + 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[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[v3] = 1 + self.pos[v3].y = 1 + self.right[v3] = v2 - self.xoff[v2] = 1 - self.pos[v2].y = 0 + 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 + 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 + 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 + 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 + 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/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/parameters.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/parameters.lua index 603f2ee7cce..9e18eb07246 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/parameters.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/planar/parameters.lua @@ -2,143 +2,143 @@ 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. - "]] + 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. - "]] + 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. - "]] + 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. - "]] + 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", + key = "start repulsive exponent", + type = "number", + initial = "2", - summary = [[" - Start value of the exponent used in the calculation of all repulsive forces in PDP - "]] + 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", + key = "end repulsive exponent", + type = "number", + initial = "2", - summary = [[" - End value of the exponent used in the calculation of all repulsive forces in PDP. - "]] + 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. - "]] + 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. - "]] + 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. - "]] + 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. - "]] + 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. - "]] + 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", + 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. - "]] + summary = [[" + The number of iterations an edge has to be under stress before it will be subdevided. + "]] } declare { - key = "edge divisions", - type = "number", - initial = "0", + key = "edge divisions", + type = "number", + initial = "0", - summary = [[" - The number of edges in which stressed edges will be subdivided. - "]] + summary = [[" + The number of edges in which stressed edges will be subdivided. + "]] } diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/routing/Hints.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/routing/Hints.lua index 7d34726f47b..1f68bd99f5f 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/routing/Hints.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/routing/Hints.lua @@ -17,7 +17,7 @@ -- 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 +-- the necklace'' or not. Thus, necklace routing algoirthms 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. @@ -47,14 +47,14 @@ 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 +-- 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, +-- 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''. +-- wins.'' -- -- @param ugraph The ugraph to which this hint is added -- @param necklace The sequence of vertices that form the necklace. If @@ -68,7 +68,7 @@ local necklaces = Storage.new() 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, @@ -95,6 +95,6 @@ function Hints.getNecklaceHints(ugraph) end -- done - + return Hints diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/routing/NecklaceRouting.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/routing/NecklaceRouting.lua index defcf9f8c61..9a99ea2275f 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/routing/NecklaceRouting.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/routing/NecklaceRouting.lua @@ -35,28 +35,28 @@ declare { 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. + 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 rounting| 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 }; - "]] + \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 }; + "]] } @@ -65,19 +65,19 @@ declare { 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 + 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 @@ -87,4 +87,4 @@ end -- done -return NecklaceRouting +return NecklaceRouting \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/tools/make_gd_wrap.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/tools/make_gd_wrap.lua index a0aee6501cc..b13dcb9abb4 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/tools/make_gd_wrap.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/tools/make_gd_wrap.lua @@ -17,7 +17,7 @@ -- 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. +-- wraper. @@ -29,7 +29,7 @@ Usage: make_gd_wrap library1 library2 ... libraryn template library_name target_ 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 +(declared using declare { algorithm_written_in_c = ... }) and will produce the code for library for the required target C files based on the template. "]]) @@ -82,79 +82,79 @@ 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 + + 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 + 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 + 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 - }) - + { + 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 - }) + { + 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 + 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 + 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' + 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' + factory_class = k.module_class, + factory_code = k.code, + factory_base = k.module_base, + factory_name = k.module_class .. '_factory' }) end end @@ -180,4 +180,4 @@ file:write ((template:gsub( }))) file:close() - + \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/trees/ChildSpec.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/trees/ChildSpec.lua index 5af36428858..0b975fd3291 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/trees/ChildSpec.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/trees/ChildSpec.lua @@ -33,11 +33,10 @@ -- 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: --- % +-- \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} @@ -52,18 +51,15 @@ -- 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: --- % +-- \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|. +-- \item You can simply specify the index of a child directly using +-- the key |desired child index|. -- \end{enumerate} -- -- @end @@ -82,27 +78,27 @@ declare { initial = "0", summary = [[" - Specifies how many children a tree node must have at least. If - there are less, ``virtual'' children are added. + 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. + 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 } }; + \tikz \graph [binary tree layout,level distance=5mm] + { a -> { b->c->d, e->f->g } }; "]] } @@ -112,60 +108,65 @@ 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. + 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. + 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} }; - "]] + 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} }; + "]] } } @@ -178,9 +179,9 @@ declare { { key = "desired child index", value = 1}, }, - summary = [[" - A shorthand for setting the desired child number to |1|. - "]] + summary = [[" + A shorthand for setting the desired child number to |1|. + "]] } --- @@ -191,11 +192,11 @@ declare { { key = "desired child index", value = 2}, }, - summary = [[" - A shorthand for setting the desired child number to |2|. - "]] + summary = [[" + A shorthand for setting the desired child number to |2|. + "]] } - + --- @@ -205,11 +206,11 @@ declare { { key = "desired child index", value = 3}, }, - summary = [[" - A shorthand for setting the desired child number to |3|. + summary = [[" + A shorthand for setting the desired child number to |3|. "]] } - + --- @@ -219,7 +220,8 @@ declare { { key = "desired child index", value = 4} }, - summary = [[" - A shorthand for setting the desired child number to |4|. + summary = [[" + A shorthand for setting the desired child number to |4|. "]] } + diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/trees/ReingoldTilford1981.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/trees/ReingoldTilford1981.lua index 69babd443c7..8eba23a2106 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/trees/ReingoldTilford1981.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/trees/ReingoldTilford1981.lua @@ -27,7 +27,7 @@ local Storage = require "pgf.gd.lib.Storage" declare { key = "tree layout", algorithm = ReingoldTilford1981, - + preconditions = { connected = true, tree = true @@ -69,7 +69,7 @@ declare { }, documentation_in = "pgf.gd.trees.doc" } - + --- declare { key = "extended binary tree layout", @@ -86,16 +86,16 @@ declare { -- 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) @@ -113,7 +113,7 @@ function ReingoldTilford1981:precomputeDescendants(node, depth, layers, descenda my_descendants[#my_descendants + 1] = d end end - + layers[node] = depth descendants[node] = my_descendants end @@ -121,7 +121,7 @@ end function ReingoldTilford1981:computeHorizontalPosition(node, layers, descendants) - + local children = self.spanning_tree:outgoing(node) node.pos.x = 0 @@ -133,19 +133,19 @@ function ReingoldTilford1981:computeHorizontalPosition(node, layers, descendants 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 + 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 @@ -160,7 +160,7 @@ function ReingoldTilford1981:computeHorizontalPosition(node, layers, descendants -- 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 + 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 @@ -179,13 +179,13 @@ function ReingoldTilford1981:computeHorizontalPosition(node, layers, descendants local n1 = right_borders[layer] if n1 then shift = math.max( - shift, + 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 + (left_borders[layer].pos.x - local_right_borders[layer].pos.x <= first_dist) then is_significant = true end end @@ -200,7 +200,7 @@ function ReingoldTilford1981:computeHorizontalPosition(node, layers, descendants 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 diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/trees/SpanningTreeComputation.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/trees/SpanningTreeComputation.lua index 8951ce0538c..791fb81e658 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/trees/SpanningTreeComputation.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/trees/SpanningTreeComputation.lua @@ -18,7 +18,7 @@ -- 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 +-- laid out individiually. 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, @@ -28,9 +28,9 @@ -- 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 +-- computation of spanning trees and the cylce removal in layered graph -- drawing algorithms will be unified, but, currently, they are --- implemented differently.) +-- 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 @@ -39,15 +39,15 @@ --\begin{codeexample}[] --\tikz \graph [tree layout, breadth first spanning tree] --{ --- 1 -- {2,3,4,5} -- 6; ---}; +-- 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} +-- 1 --[bend right] {2,3,4,5 [>bend left]} -- 6; +--}; +--\end{codeexample} -- -- @end @@ -82,91 +82,90 @@ local declare = require("pgf.gd.interface.InterfaceToAlgorithms").declare -- declare { key = "breadth first spanning tree", - algorithm = { + algorithm = { run = function (self) - return SpanningTreeComputation.computeSpanningTree(self.ugraph, false, self.events) + 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. + 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 = { + algorithm = { run = function (self) - return SpanningTreeComputation.computeSpanningTree(self.ugraph, true, self.events) + 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. - "]] -} + summary = [[" + Works exactly like |breadth first spanning tree| (same handling of + priorities), only the queues are now lifo instead of + fifo. + "]] + } --- -- @@ -175,13 +174,13 @@ declare { 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. - "]] -} + 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. + "]] + } --- @@ -190,29 +189,29 @@ 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|. - "]] -} - + 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. +-- 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 - "]] -} - + 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 + "]] + } + @@ -224,29 +223,29 @@ declare { { 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 } + 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 } + } } - } - }; + }; "]] } @@ -258,85 +257,79 @@ declare { 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. + 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 - % + documentation = [[" + When you write \begin{codeexample}[code only] -graph { a -> b -- c <- [span priority=2] d } +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} + 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 = [[" + 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 - % + documentation = [[" + When you write \begin{codeexample}[code only] -graph { a -> b -- c <- [span priority=2] d } +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''. + 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 <-", @@ -395,23 +388,23 @@ declare { { 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. + 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 - }; + 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 + }; "]] } @@ -431,9 +424,9 @@ declare { { key = "span priority reversed --", value = 5}, { key = "span priority reversed -!-", value = 5}, }, - - summary = [[" - Assings a uniform priority of 5 to all edges. + + summary = [[" + Assings a uniform priority of 5 to all edges. "]] } @@ -447,7 +440,7 @@ declare { -- determined through an edge priority function. -- -- @param ugraph An undirected graph for which the spanning tree --- should be computed +-- should be computed -- @param dfs True if depth first should be used, false if breadth -- first should be used. -- @@ -456,7 +449,7 @@ declare { 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] @@ -467,7 +460,7 @@ function SpanningTreeComputation.computeSpanningTree (ugraph, dfs, events) local marked = {} local stacks = { -- 10 stacks for 10 priorities, with 1 being the highest - { { parent = nil, node = root}, top = 1, bottom = 1 }, + { { parent = nil, node = root}, top = 1, bottom = 1 }, { top = 0, bottom = 1}, { top = 0, bottom = 1}, { top = 0, bottom = 1}, @@ -478,51 +471,51 @@ function SpanningTreeComputation.computeSpanningTree (ugraph, dfs, events) { 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 + -- 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) + 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 + 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 @@ -532,105 +525,106 @@ function SpanningTreeComputation.computeSpanningTree (ugraph, dfs, events) 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 + 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 + 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) + + -- 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 diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/trees/doc.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/trees/doc.lua index 169c7ff5e19..753f386bb9e 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/trees/doc.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/trees/doc.lua @@ -25,55 +25,49 @@ 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. +\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. +\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. +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): -% +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. +\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. +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 @@ -82,7 +76,6 @@ 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} @@ -92,9 +85,7 @@ zero-height subtree were present at that positions: } child[missing]; \end{codeexample} -% or in |graph| syntax: -% \begin{codeexample}[] \tikz \graph [tree layout, nodes={draw,circle}] { @@ -106,36 +97,31 @@ or in |graph| syntax: } }; \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): -% +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|. +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] @@ -147,8 +133,7 @@ overall structure of a tree. Consider the following two trees: \graph [nodes={circle, inner sep=0pt, minimum size=2mm, fill, as=}]{ a -- { b -- c -- d -- e, i -- j -- { f -- {g,h}, k } } }; -\end{codeexample} -% +\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 @@ -164,7 +149,6 @@ 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}] @@ -174,7 +158,6 @@ while in the second example |a| and |b| form such a pair. 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. @@ -207,8 +190,9 @@ 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. +When set to true, missing children are treated as if they +where zero-width, zero-height nodes during the whole tree layout +process. ]] @@ -228,10 +212,8 @@ example key "significant sep" summary -[[ -This space is added to significant pairs by the modified -Reingold--Tilford algorithm. -]] +[[ This space is added to signifcant pairs by the modified +Reingold--Tilford algorithm. ]] example [[ @@ -256,22 +238,18 @@ example key "binary tree layout" summary -[[ -A layout based on the Reingold--Tilford method for drawing -binary trees. -]] +[[ 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. +\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 @@ -292,33 +270,31 @@ example \tikz \graph [binary tree layout] { Knuth -> { Beeton -> Kellermann [second] -> Carnes, - Tobin -> Plass -> { Lamport, Spivak } + 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}}] + edges={decorate,decoration={snake, post length=5pt}}] { Knuth -> { Beeton -> Kellermann [second] -> Carnes, - Tobin -> Plass -> { Lamport, Spivak } + Tobin -> Plass -> { Lamport, Spivak } } }; ]] -------------------------------------------------------------------- - + -------------------------------------------------------------------- key "extended binary tree layout" summary -[[ -This algorithm is similar to |binary tree layout|, only the +[[ 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. -]] +\texttt{significant sep} is zero. ]] example [[ @@ -329,3 +305,5 @@ example }; ]] -------------------------------------------------------------------- + + diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/trees/library.lua b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/trees/library.lua index a0019666ac8..b8e36982cfc 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/trees/library.lua +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/lua/pgf/gd/trees/library.lua @@ -16,7 +16,7 @@ -- 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. +-- 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 diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/tex/pgflibrarygraphdrawing.circular.code.tex b/Master/texmf-dist/tex/generic/pgf/graphdrawing/tex/pgflibrarygraphdrawing.circular.code.tex index cdcd7a54cb3..61f2e4bed00 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/tex/pgflibrarygraphdrawing.circular.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/tex/pgflibrarygraphdrawing.circular.code.tex @@ -11,6 +11,6 @@ \ProvidesFileRCS{pgflibrarygraphdrawing.circular.code.tex} -\usegdlibrary{circular}% +\usegdlibrary{circular} \endinput diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/tex/pgflibrarygraphdrawing.examples.code.tex b/Master/texmf-dist/tex/generic/pgf/graphdrawing/tex/pgflibrarygraphdrawing.examples.code.tex index 90ebe0f15af..c5c4997d627 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/tex/pgflibrarygraphdrawing.examples.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/tex/pgflibrarygraphdrawing.examples.code.tex @@ -9,9 +9,9 @@ \ProvidesFileRCS{pgflibrarygraphdrawing.examples.code.tex} -\usepgflibrary{graphdrawing}% +\usepgflibrary{graphdrawing} -\usegdlibrary{examples}% +\usegdlibrary{examples} \endinput diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/tex/pgflibrarygraphdrawing.force.code.tex b/Master/texmf-dist/tex/generic/pgf/graphdrawing/tex/pgflibrarygraphdrawing.force.code.tex index 2ffad530012..cd6851466a3 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/tex/pgflibrarygraphdrawing.force.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/tex/pgflibrarygraphdrawing.force.code.tex @@ -11,9 +11,9 @@ -\usepgflibrary{graphdrawing}% +\usepgflibrary{graphdrawing} -\usegdlibrary{force}% +\usegdlibrary{force} \endinput @@ -81,7 +81,7 @@ % % Edge parameters for spring algorithms. % -}% +} \pgfgddeclareforwardedkeys{/graph drawing}{ % diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/tex/pgflibrarygraphdrawing.layered.code.tex b/Master/texmf-dist/tex/generic/pgf/graphdrawing/tex/pgflibrarygraphdrawing.layered.code.tex index 940c8236cf3..794fff40275 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/tex/pgflibrarygraphdrawing.layered.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/tex/pgflibrarygraphdrawing.layered.code.tex @@ -9,9 +9,9 @@ \ProvidesFileRCS{pgflibrarygraphdrawing.layered.code.tex} -\usepgflibrary{graphdrawing}% +\usepgflibrary{graphdrawing} -\usegdlibrary{layered}% +\usegdlibrary{layered} \endinput diff --git a/Master/texmf-dist/tex/generic/pgf/graphdrawing/tex/pgflibrarygraphdrawing.trees.code.tex b/Master/texmf-dist/tex/generic/pgf/graphdrawing/tex/pgflibrarygraphdrawing.trees.code.tex index 87ff6eee233..10231f221ad 100644 --- a/Master/texmf-dist/tex/generic/pgf/graphdrawing/tex/pgflibrarygraphdrawing.trees.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/graphdrawing/tex/pgflibrarygraphdrawing.trees.code.tex @@ -11,9 +11,9 @@ \ProvidesFileRCS{pgflibrarygraphdrawing.trees.code.tex} -\usepgflibrary{graphdrawing}% -\usepgflibrary{graphdrawing.layered}% +\usepgflibrary{graphdrawing} +\usepgflibrary{graphdrawing.layered} -\usegdlibrary{trees}% +\usegdlibrary{trees} \endinput diff --git a/Master/texmf-dist/tex/generic/pgf/libraries/decorations/pgflibrarydecorations.pathmorphing.code.tex b/Master/texmf-dist/tex/generic/pgf/libraries/decorations/pgflibrarydecorations.pathmorphing.code.tex index 72ed4ca6b6e..3f628da582d 100644 --- a/Master/texmf-dist/tex/generic/pgf/libraries/decorations/pgflibrarydecorations.pathmorphing.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/libraries/decorations/pgflibrarydecorations.pathmorphing.code.tex @@ -111,7 +111,7 @@ }% \state{zigzag}[width=\pgfmetadecorationsegmentlength, next state=line to] { - \decoration{zigzag} + \decoration{zigzag} }% \state{final} { diff --git a/Master/texmf-dist/tex/generic/pgf/libraries/decorations/pgflibrarydecorations.shapes.code.tex b/Master/texmf-dist/tex/generic/pgf/libraries/decorations/pgflibrarydecorations.shapes.code.tex index 08781d04fb8..6b1571518b6 100644 --- a/Master/texmf-dist/tex/generic/pgf/libraries/decorations/pgflibrarydecorations.shapes.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/libraries/decorations/pgflibrarydecorations.shapes.code.tex @@ -127,16 +127,16 @@ % 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 @@ -220,7 +220,7 @@ \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}% + \edef\pgf@lib@shapedecoration@heightchange{\the\pgf@y}% % % Calculate the sep. % @@ -271,7 +271,7 @@ \ifpgfshapedecorationscaled% \pgf@xa\pgf@lib@shapedecoration@widthchange\relax% \divide\pgf@xa\c@pgf@counta% - \edef\pgf@lib@shapedecoration@specialwidth{\the\pgf@xa}% + \edef\pgf@lib@shapedecoration@specialwidth{\the\pgf@xa}% \fi% \else% \pgf@lib@shapedecoration@betweenbordersfalse% @@ -283,7 +283,7 @@ \advance\pgf@x5pt\relax% An arbitrary value >0pt. \edef\pgf@lib@shapedecoration@initialise{\the\pgf@x}% \fi% - \fi% + \fi% \else% % % Between centers. @@ -345,7 +345,7 @@ % \pgf@y\pgfdecoratedcompleteddistance% \advance\pgf@y\pgfdecoratedremainingdistance% - \pgfmathdivide@{\pgfmath@tonumber{\pgfdecoratedcompleteddistance}}{\pgfmath@tonumber{\pgf@y}}% + \pgfmathdivide@{\pgfmath@tonumber{\pgfdecoratedcompleteddistance}}{\pgfmath@tonumber{\pgf@y}}% \fi% % % Get the new width. @@ -370,8 +370,8 @@ \pgf@x\pgfmathresult\pgf@x% \advance\pgf@x\pgf@lib@shapedecoration@startwidth\relax% \fi% - \fi% - \edef\pgf@lib@shapedecoration@width{\the\pgf@x}% + \fi% + \edef\pgf@lib@shapedecoration@width{\the\pgf@x}% % % New height = R*h + H % @@ -387,7 +387,7 @@ \edef\pgf@lib@shapedecoration@beforeshape{\the\pgf@x}% \else% \def\pgf@lib@shapedecoration@beforeshape{0pt}% - \fi% + \fi% }] {}% \state{shape}[width=+0sp,next state=after shape] @@ -424,7 +424,7 @@ % % And draw the shape path. % - \csname pgf@sh@bg@\pgfkeysvalueof{/pgf/decoration/shape}\endcsname% + \csname pgf@sh@bg@\pgfkeysvalueof{/pgf/decoration/shape}\endcsname% }% \state{after shape} [ diff --git a/Master/texmf-dist/tex/generic/pgf/libraries/luamath/pgf/luamath/functions.lua b/Master/texmf-dist/tex/generic/pgf/libraries/luamath/pgf/luamath/functions.lua index 367d6ae298f..3eecaf99c0a 100644 --- a/Master/texmf-dist/tex/generic/pgf/libraries/luamath/pgf/luamath/functions.lua +++ b/Master/texmf-dist/tex/generic/pgf/libraries/luamath/pgf/luamath/functions.lua @@ -14,24 +14,24 @@ local pgfluamathfunctions = pgfluamathfunctions or {} -- Maps function names to their function. -- --- Note that this allows to register functions which are not in pgfluamathfunctions. +-- 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) +-- 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) + 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 }) @@ -56,16 +56,16 @@ 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 + 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 @@ -75,422 +75,422 @@ pgfluamathfunctions.stringToFunctionMap["setRandomSeed"] = nil ------------------------------------------- function pgfluamathfunctions.add(x,y) - return x+y + return x+y end function pgfluamathfunctions.subtract(x,y) - return x-y + return x-y end function pgfluamathfunctions.neg(x) - return -x + return -x end function pgfluamathfunctions.multiply(x,y) - return x*y + return x*y end function pgfluamathfunctions.veclen(x,y) - return mathsqrt(x*x+y*y) + return mathsqrt(x*x+y*y) end function pgfluamathfunctions.divide(x,y) - return x/y + return x/y end function pgfluamathfunctions.div(x,y) - return mathfloor(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 + -- 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 + 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 + 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 + 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 + 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 + if x < y then + return 1 + else + return 0 + end end function pgfluamathfunctions.min(x,y) - return mathmin(x,y) + return mathmin(x,y) end function pgfluamathfunctions.max(x,y) - return mathmax(x,y) + return mathmax(x,y) end function pgfluamathfunctions.notequal(x,y) - if x ~= y then - return 1 - else - return 0 - end + 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 + 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 + 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 + 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 + 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 + if x == 0 then + return 1 + else + return 0 + end end function pgfluamathfunctions.pi() - return mathpi + return mathpi end function pgfluamathfunctions.e() - return mathexp(1) + return mathexp(1) end function pgfluamathfunctions.abs(x) - return mathabs(x) + return mathabs(x) end function pgfluamathfunctions.floor(x) - return mathfloor(x) + return mathfloor(x) end function pgfluamathfunctions.ceil(x) - return mathceil(x) + return mathceil(x) end function pgfluamathfunctions.exp(x) - return mathexp(x) + return mathexp(x) end function pgfluamathfunctions.ln(x) - return mathlog(x) + return mathlog(x) end local logOf10 = mathlog(10) function pgfluamathfunctions.log10(x) - return mathlog(x) / logOf10 + return mathlog(x) / logOf10 end local logOf2 = mathlog(2) function pgfluamathfunctions.log2(x) - return mathlog(x) / logOf2 + return mathlog(x) / logOf2 end function pgfluamathfunctions.sqrt(x) - return mathsqrt(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 + 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 + -- "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() + return mathrandom() end function pgfluamathfunctions.rand() - return -1 + mathrandom() *2 + 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 + 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) + return mathdeg(x) end function pgfluamathfunctions.rad(x) - return mathrad(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 + 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 + 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 + 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 - i = i + 1 - end - end - if ifisprime then - return 1 - else - return 0 - 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) + -- (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 + 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 + return 1.0 end pgfluamathfunctions.stringToFunctionMap["true"] = pgfluamathfunctions.mathtrue function pgfluamathfunctions.mathfalse() - return 0.0 + return 0.0 end pgfluamathfunctions.stringToFunctionMap["false"] = pgfluamathfunctions.mathfalse function pgfluamathfunctions.frac(a) - -- should be positive, apparently - return mathabs(a - pgfluamathfunctions.int(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 + 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 + 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 + 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 + 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 + 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)) + 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)) + -- 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)) + -- 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) + -- 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)) + return mathcos(trigFormatToRadians(x)) end pgfluamathfunctions.cos=pgfluamathfunctions.Cos function pgfluamathfunctions.Tan(x) - return mathtan(trigFormatToRadians(x)) + return mathtan(trigFormatToRadians(x)) end pgfluamathfunctions.tan=pgfluamathfunctions.Tan function pgfluamathfunctions.aSin(x) - return radiansToTrigFormat(mathasin(x)) + return radiansToTrigFormat(mathasin(x)) end pgfluamathfunctions.asin=pgfluamathfunctions.aSin function pgfluamathfunctions.aCos(x) - return radiansToTrigFormat(mathacos(x)) + return radiansToTrigFormat(mathacos(x)) end pgfluamathfunctions.acos=pgfluamathfunctions.aCos function pgfluamathfunctions.aTan(x) - return radiansToTrigFormat(mathatan(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 + -- math.atan2 has been deprecated since LUA 5.3 + mathatan2 = function (y,x) return mathatan(y,x) end else - mathatan2 = math.atan2 + mathatan2 = math.atan2 end function pgfluamathfunctions.aTan2(y,x) - return radiansToTrigFormat(mathatan2(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) + return pgfluamathfunctions.cos(x) / pgfluamathfunctions.sin(x) end function pgfluamathfunctions.sec(x) - return 1 / pgfluamathfunctions.cos(x) + return 1 / pgfluamathfunctions.cos(x) end function pgfluamathfunctions.cosec(x) - return 1 / pgfluamathfunctions.sin(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 + local pgfx_normalised, pgfy_normalised + if pgfx == 0. and pgfy == 0. then + -- Orginal 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 + return x ~= x end pgfluamathfunctions.isnan = isnan @@ -509,44 +509,44 @@ 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 + 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 @@ -558,69 +558,69 @@ 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; + 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 mantissaStart = stringfind(x, "e") - local mantissa = stringsub(x,1,mantissaStart-1) - local exponent = stringsub(x,mantissaStart) + local mantissa = stringsub(x,1,mantissaStart-1) + local exponent = stringsub(x,mantissaStart) - return discardTrailingZeros(mantissa) .. exponent + 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 + if x == nil then + return "" + end - return discardTrailingZeros(stringformat("%f", x)) + 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 + 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 - end - return result + return result end return pgfluamathfunctions diff --git a/Master/texmf-dist/tex/generic/pgf/libraries/luamath/pgf/luamath/parser.lua b/Master/texmf-dist/tex/generic/pgf/libraries/luamath/pgf/luamath/parser.lua index 42b690e6cf8..30eff2e6992 100644 --- a/Master/texmf-dist/tex/generic/pgf/libraries/luamath/pgf/luamath/parser.lua +++ b/Master/texmf-dist/tex/generic/pgf/libraries/luamath/pgf/luamath/parser.lua @@ -8,7 +8,7 @@ -- -- See the file doc/generic/pgf/licenses/LICENSE for more details. -- --- $Id$ +-- $Id$ -- -- usage: -- @@ -32,22 +32,22 @@ 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') + +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 +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 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) @@ -57,7 +57,7 @@ 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 identifier_pattern = letter_pattern^1 * alphanum__pattern^0 local openparen_pattern = P("(") * space_pattern local closeparen_pattern = P(")") @@ -94,56 +94,56 @@ local function eval (v1, op, v2) elseif (op == "*") then return v1 * v2 elseif (op == "/") then return v1 / v2 else - error("This function must not be invoked for operator "..op) + 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(...) + 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 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 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 + 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 ! and != : +-- apparently, we need to distinghuish between ! and != : 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.") + error("The function in this context cannot be evaluated by LUA because it depends on TeX macros.") end local ternary_eval = pgfluamathfunctions.ifthenelse @@ -156,117 +156,118 @@ local pow_eval = pgfluamathfunctions.pow -- @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 + 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) + 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) + 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 + -- 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 + 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 + -- 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)] + -- 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 + -- 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 + -- dimension should be a string + pgfluamathparser.units_declared = true + return tex.sp(dimension) / 65536 end @@ -281,66 +282,66 @@ 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 + 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 + if controlsequence==nil then + return scale + else + return scale * controlsequence_eval(controlsequence, intSuffix) + end end -- Grammar -- --- for me: +-- 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 - ; + 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 + 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 @@ -348,12 +349,12 @@ end -- -- @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 + pgfluamathparser.units_declared = false - return pgfmathparseinternal(str) + return pgfmathparseinternal(str) end local pgfmathparse = pgfluamathparser.pgfmathparse @@ -378,7 +379,7 @@ local stackOfLocalFunctions = {} -- -- ATTENTION: local functions behave DIFFERENTLY in LUA! -- In LUA, local variables are not expanded whereas TeX expands them. --- The difference is +-- The difference is -- -- declare function={mu1(\x,\i)=\x^\i;} -- \pgfmathparse{mu1(-5,2)} --> -25 @@ -392,53 +393,53 @@ local stackOfLocalFunctions = {} -- 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" 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 + -- 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" 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) + local name = stackOfLocalFunctions[#stackOfLocalFunctions] + pgfStringToFunctionMap[name] = nil + -- this removes the last element: + table.remove(stackOfLocalFunctions) end @@ -446,36 +447,36 @@ end -- @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 + 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/Master/texmf-dist/tex/generic/pgf/libraries/luamath/pgflibraryluamath.code.tex b/Master/texmf-dist/tex/generic/pgf/libraries/luamath/pgflibraryluamath.code.tex index 300ba52e989..c559a0cc1ba 100644 --- a/Master/texmf-dist/tex/generic/pgf/libraries/luamath/pgflibraryluamath.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/libraries/luamath/pgflibraryluamath.code.tex @@ -62,15 +62,15 @@ \pgfutil@ifluatex \let\pgfutil@directlua\directlua \pgfutil@directlua{% - tex.enableprimitives('pgfutil@',{'luaescapestring'})}% + tex.enableprimitives('pgfutil@',{'luaescapestring'})} \else - \def\pgfutil@directlua#1{}% - \def\pgfutil@luaescapestring#1{}% + \def\pgfutil@directlua#1{} + \def\pgfutil@luaescapestring#1{} \fi \pgfutil@directlua{% pgfluamathfunctions = require("pgf.luamath.functions") - pgfluamathparser = require("pgf.luamath.parser")}% + pgfluamathparser = require("pgf.luamath.parser")} % Patch some configuration macros such that the modifications are @@ -78,7 +78,7 @@ \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}% diff --git a/Master/texmf-dist/tex/generic/pgf/lua/pgf/manual/DocumentParser.lua b/Master/texmf-dist/tex/generic/pgf/lua/pgf/manual/DocumentParser.lua index d2f6780822c..2f367dfdd4d 100644 --- a/Master/texmf-dist/tex/generic/pgf/lua/pgf/manual/DocumentParser.lua +++ b/Master/texmf-dist/tex/generic/pgf/lua/pgf/manual/DocumentParser.lua @@ -18,7 +18,7 @@ -- @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 +-- return |true| if the funciton stored in the |renderer| should be -- called. (Typically, the |test| will test whether the ``head line'' -- following a documentation block has a special form.) @@ -46,11 +46,11 @@ local collect_infos, render_infos 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") + 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 = {} @@ -61,33 +61,33 @@ function DocumentParser.include(filename, typ) -- 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) + tex.print(l) else l() end end - + end @@ -140,7 +140,7 @@ local function process_string(s) if min < math.huge then -- Now, trim 'em all! for i=1,#t do - t[i] = string.sub(t[i],min,-2) + t[i] = string.sub(t[i],min,-2) end end return t @@ -156,7 +156,7 @@ local function process_examples(t) if type(t) == "string" then t = {t} end - + local n = {} for i=1,#t do n[i] = process_string(strip_quotes(t[i])) @@ -176,7 +176,7 @@ DocumentParser.addRenderer ( return infos.keywords["function"] or infos.head_line:match("^%s*function%s+") or - infos.head_line:match("^%s*local%s+function%s+") + infos.head_line:match("^%s*local%s+function%s+") end, function (infos, output) -- The renderer @@ -185,43 +185,43 @@ DocumentParser.addRenderer ( 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, "}") + 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 .. ")" + 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) + 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 ( @@ -238,43 +238,43 @@ DocumentParser.addRenderer ( 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*=") - + 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, "}") + [[\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 + 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) @@ -283,9 +283,9 @@ DocumentParser.addRenderer ( 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, "}") @@ -294,13 +294,13 @@ DocumentParser.addRenderer ( 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) @@ -317,7 +317,7 @@ DocumentParser.addRenderer ( end ) - + -- The documentation (plain text) renderer DocumentParser.addRenderer ( function (infos) @@ -342,19 +342,19 @@ DocumentParser.addRenderer ( return infos.keywords["declare"] or infos.head_line:match("declare%s*{") or - infos.head_line:match("^%s*key%s*") + 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*'(.*)'") + 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*'(.*)'") @@ -362,48 +362,48 @@ DocumentParser.addRenderer ( 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 "", "}") + "\\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 - - + "\\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") + "\\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}") + 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}") + + print_on_output(output, key.type and "\\end{luadeclare}" or "\\end{luadeclarestyle}") end ) --- The empty line +-- The empty line DocumentParser.addRenderer ( function (infos) -- The test @@ -421,8 +421,8 @@ function print_lines_on_output(output, lines) output[#output+1] = l end end - -function print_on_output(output, ...) + +function print_on_output(output, ...) local args = {...} if #args > 0 then for i = 1, #args do @@ -432,7 +432,7 @@ function print_on_output(output, ...) end end -function print_on_output_escape(output, ...) +function print_on_output_escape(output, ...) local args = {...} if #args > 0 then for i = 1, #args do @@ -453,9 +453,9 @@ function print_docline_on_output(output, l, 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+(.*)")) + 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) @@ -468,26 +468,26 @@ function print_docline_on_output(output, l, mode) mode = open_mode (output, "text") end print_on_output(output, "\\par\\emph{See also:} \\texttt{", - l:match("%s@see%s+(.*)"):gsub("_", "\\_"), - "}") + 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+(.*)")) + 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+(.*)")) + (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 @@ -501,8 +501,8 @@ function print_docline_on_output(output, l, mode) else print_on_output(output, l) end - - return mode + + return mode end function open_mode (output, mode) @@ -529,7 +529,7 @@ end function collect_infos (lines, i, state) - + local doc_lines = {} local keywords = {} @@ -543,13 +543,13 @@ function collect_infos (lines, i, state) 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)) @@ -557,7 +557,7 @@ function collect_infos (lines, i, state) end local head_line = "" - + if not keywords["end"] then -- Skip empty lines while lines[i] and lines[i]:match("^%s*$") do @@ -568,7 +568,7 @@ function collect_infos (lines, i, state) i = i - 1 end end - + return { lines = lines, last_line = i, @@ -576,7 +576,7 @@ function collect_infos (lines, i, state) keywords = keywords, head_line = head_line } - + end @@ -589,9 +589,9 @@ function render_infos(infos, state) return end end - + pgf.debug(infos) - error("Unknown documentation type") + error("Unkown documentation type") end diff --git a/Master/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex b/Master/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex index fb629421d54..fd3eea1b0bf 100644 --- a/Master/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex @@ -23,4 +23,4 @@ \input pgfmathcalc.code.tex \input pgfmathfloat.code.tex -\endinput +\endinput \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex b/Master/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex index 58c51558c8a..5cc58e62e5d 100644 --- a/Master/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex @@ -40,7 +40,7 @@ \pgfmath@selectfont% #1#2\unskip% \expandafter\endgroup% - \expandafter#1\the#1\relax% + \expandafter#1\the#1\relax% }% {% \pgfmathparse{#2}% @@ -68,7 +68,7 @@ \advance#1#2\unskip% \expandafter% \endgroup% - \expandafter#1\the#1\relax% + \expandafter#1\the#1\relax% }% {% \pgfmathparse{#2}% @@ -202,7 +202,7 @@ \def\pgfmathsetmacro#1#2{% \begingroup% \pgfmathparse{#2}% - \let#1=\pgfmathresult + \let#1=\pgfmathresult \pgfmath@smuggleone{#1}% \endgroup% } @@ -264,7 +264,7 @@ % *** 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 @@ -354,7 +354,7 @@ -% \pgfmathpointintersectionoflineandarc +% \pgfmathpointintersectionoflineandarc % % A bit experimental at the moment: % @@ -385,10 +385,10 @@ \pgf@polar@#6 and #6\@@% \fi% \edef\xarcradius{\the\pgf@x}% - \edef\yarcradius{\the\pgf@y}% + \edef\yarcradius{\the\pgf@y}% % % Get the start and end angles of the arc... - % + % \pgfmathsetmacro\s{#4}% \pgfmathsetmacro\e{#5}% % @@ -420,7 +420,7 @@ \pgfmathadd@{\s}{\e}% \pgfmathdivide@{\pgfmathresult}{2}% \let\p\pgfmathresult% - \ifdim\p pt=\s pt\relax% + \ifdim\p pt=\s pt\relax% \else% \pgfmathanglebetweenpoints{#2}{% \pgfpointadd{#3}{% @@ -466,14 +466,14 @@ \ifdim\pgfmathresult pt<\m pt\relax% \let\m\pgfmathresult% \let\n\p% - \fi% + \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. @@ -489,7 +489,7 @@ \fi% \pgf@xa\pgf@x% \pgf@ya\pgf@y% - \pgf@process{#1}% + \pgf@process{#1}% \ifdim\pgf@x=0pt\relax% \pgfutil@tempdima1pt\relax% \else% @@ -530,7 +530,7 @@ \ifdim\pgf@y=0pt\relax% \pgfutil@tempdima0pt\relax% \fi% - \fi% + \fi% \fi% \pgfmath@returnone\pgfutil@tempdima% \endgroup% diff --git a/Master/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex b/Master/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex index bda29cb51b7..006d6ea4046 100644 --- a/Master/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex @@ -13,23 +13,23 @@ \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,% + % 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,% } @@ -55,7 +55,7 @@ % can be changed with options. \def\pgfmathfloat@round@precision{2} -% I introduced this to access the "original" precision in case a +% I introduced this to acces 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. @@ -70,7 +70,7 @@ % [FLAGS] MANTISSE EXPONENT % meaning % [+-]X.XXXXXXX*10^C -% where +% where % X.XXXXXX is a mantissa with first number != 0, C is an integer and % FLAGS contains the sign and some other special cases. % @@ -78,7 +78,7 @@ % 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. +% errors in these cases. % % It is to be used to compute logs, because log(X*10^Y) = log(X) + log(10)*Y % @@ -98,12 +98,12 @@ % 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' +% 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. @@ -116,15 +116,15 @@ % \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 + \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. @@ -135,36 +135,36 @@ % 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}% + \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}% + \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}% + \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}% + \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}% + \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}% + \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}% + \expandafter\pgfmathfloat@decompose@E#1\relax{#2}% } @@ -179,22 +179,22 @@ % 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% + \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 + \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 }% @@ -208,12 +208,12 @@ % \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% + \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 @@ -227,12 +227,12 @@ % \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% + \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 @@ -243,44 +243,44 @@ % \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% + \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% + \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% + \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% + \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% + \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}}% @@ -289,67 +289,67 @@ \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 + \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 + \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 + \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 + \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 + \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 + \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 + \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 } @@ -358,7 +358,7 @@ % % All arguments are characters and will be expanded using '\edef'. \def\pgfmathfloatcreate#1#2#3{% - \edef\pgfmathresult{#1Y#2e#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 @@ -373,54 +373,54 @@ % \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 + \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 +% @see \pgfmathfloatint \def\pgfmathfloattoint#1{% - \pgfmathfloattofixed{#1}% - \expandafter\pgfmathfloattoint@@\pgfmathresult\relax + \pgfmathfloattofixed{#1}% + \expandafter\pgfmathfloattoint@@\pgfmathresult\relax }% \def\pgfmathfloattoint@@#1.#2\relax{% - \def\pgfmathresult{#1}% + \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 + \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@ @@ -430,36 +430,36 @@ \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 +% \pgfmathfloatvalueof{1Y1.0e1} -> 1.0e1 +% \pgfmathfloatvalueof{2Y1.0e1} -> -1.0e1 % and wrong arguments as well: -% \pgfmathfloatvalueof{1} -> 1 -% \pgfmathfloatvalueof{1e2} -> 1e2 +% \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 + \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 + \ifcase#1 % + 0.0e0% + \or + #2e#3% + \or + -#2e#3% + \or nan% + \or inf% + \or -inf% + \fi }% \def\pgfmathfloatvalueof@abort#1@@{#1}% @@ -472,7 +472,7 @@ % See \pgfmathroundtozerofill if you want trailing zeros and fixed % width. % -% This method is PURELY text based and can work with arbitrary +% This method is PURELY text based and can work with arbirtrary % precision (well, limited to TeX's stack size and integer size). % % Examples: @@ -487,16 +487,16 @@ % % 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 + \pgfmathfloatroundhasperiodtrue + \begingroup + \pgfmathfloat@fixed@digits@after@periodfalse + \pgfmathroundto@impl{#1}% + \pgfmath@smuggleone\pgfmathresult + \endgroup } -% Overloaded method. +% Overloaded method. % % This variant always uses a FIXED number behind the period and fills % in zeros if necessary. @@ -509,255 +509,255 @@ % % 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 + \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 + \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 + \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 + \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\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 + \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 + \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 thise 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\@@ % -> % 01234525 \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 + \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@ + \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\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}% + \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}% + \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 + \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 +% It does not apply numerics, but it is responsable for typesetting the % rounded number. % It can access the \ifpgfmathfloatroundhasperiod boolean. % % Arguments: % #1#2#3e#4\relax -% Input: +% 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 @@ -766,7 +766,7 @@ \let\pgfmathprintnumber@fixed@style=\pgfmathprintnumber@fixed@styleDEFAULT -% Rounds a normalized floating point number to \pgfmathfloat@round@precision +% 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. @@ -776,13 +776,13 @@ % 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 + \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. @@ -795,13 +795,13 @@ % 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 + \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 @@ -811,134 +811,134 @@ % #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 +% 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'. +% 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 + \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 + \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 + \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}}% + \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}}% + \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}}% + \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}% + \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}% + \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 + \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 'e' and @@ -947,7 +947,7 @@ % % PRECONDITION: % the floating point number has already been rounded properly and -% the mantissa has been rounded correctly. +% the mantissa has been rounded correcty. % % The argument needs to be in the format returned by % \pgfmathfloat@to@FMeE@style and terminated by '\relax'. @@ -971,331 +971,331 @@ \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={} - 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}}, + /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={} + 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 inclear + % 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 + % 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 + \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 + \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 + % 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 + \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 + \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 + % 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 digits - not the first - % +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 + \begingroup + \pgfmathfloatcreate{#1}{#2}{#3}% + % we want the first digits - not the first + % +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 + % 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 + \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 + \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 @@ -1311,179 +1311,179 @@ % % 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}% - }% + \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 + \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 + \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 + \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 @@ -1491,146 +1491,146 @@ % % #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 + \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 + \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% + \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 + \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 +% 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 + \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 + \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 + \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 + \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 + \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 + \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 + \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 + \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 @@ -1638,89 +1638,89 @@ % % 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 + % \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}% + \pgfutil@ifnextchar[% + {\pgfmathprintnumber@OPT}% + {\pgfmathprintnumber@noopt}% } \def\pgfmathprintnumber@noopt#1{% - \pgfmathprintnumber@{#1}% - \ifpgfmathprintnumber@assumemathmode - \pgfmathresult - \else - \pgfutilensuremath{\pgfmathresult}% - \fi + \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 + \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}% + \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 + \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 + \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 + \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: +% equals only itsself when compared with \ifx: \def\pgfmathfloat@EOI{\pgfmathfloat@EOI}% % Re-use counters internally. @@ -1734,33 +1734,34 @@ \newif\ifpgfmathround@impl@PREPERIOD@is@negative@zero % PRECONDITION: -% \ifpgfmathfloatroundhasperiod=\iftrue holds outside of the current TeX group. +% \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 + \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 +% 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" +% "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. % @@ -1773,31 +1774,31 @@ % 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) +% 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 +% 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. @@ -1806,22 +1807,22 @@ % 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. +% - 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}% + \pgfmathfloatroundhasperiodfalse + \aftergroup\pgfmathfloatroundhasperiodfalse + \def\pgfmathresult{#1}% } \def\pgfmathroundto@impl@gobble@rest@and@start#1\pgfmathfloat@EOI{% - \pgfmathroundto@impl@start + \pgfmathroundto@impl@start } \def\pgfmathroundto@impl@gobble@and@start\pgfmathfloat@EOI{% - \pgfmathroundto@impl@start + \pgfmathroundto@impl@start } \def\pgfmathroundto@impl@gobble\pgfmathfloat@EOI{}% \def\pgfmathroundto@impl@gobble@rest#1\pgfmathfloat@EOI{}% @@ -1829,281 +1830,281 @@ % 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 -} - + \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 + \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 + \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 + \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 - }% - }% - }% - }% + \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 + \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 + \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 + \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 + \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 + \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 + \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 - }% + \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 + \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 + \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 - }% + \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 + \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\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 + \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 } %-------------------------------------------- @@ -2122,20 +2123,20 @@ % \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}% + \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}% + \pgfmathroundto@impl{#1.#2#3}% } @@ -2145,106 +2146,106 @@ % 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 + \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 + \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 + \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 } @@ -2275,46 +2276,46 @@ % % 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 + \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}% + \pgfmathfloat@a@S=1 % + \pgfflt@init}% \expandafter\def\csname pgfflt@-\endcsname{% - \pgfmathfloat@a@S=2 % - \pgfflt@init}% + \pgfmathfloat@a@S=2 % + \pgfflt@init}% \expandafter\def\csname pgfflt@\pgfflt@EOI\endcsname{% - \pgfmathfloatparsenumber@handleerror{empty number}{}{}}% + \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 - }, + /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 @@ -2322,30 +2323,30 @@ % #3 the part which produced the error % % POSTCONDITION: the three registers -% \pgfmathfloat@a@S -% \pgfmathfloat@a@Mtok -% \pgfmathfloat@a@E +% \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 + \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 + \begingroup + \pgfmathfloat@a@Mtok={#1}% + \xdef\pgfmathfloat@glob@TMP{% + \noexpand\pgfmathfloatparsenumber@handleerror + {invalid number}{\pgfmathresult}{\the\pgfmathfloat@a@Mtok}}% + \endgroup + \pgfmathfloat@glob@TMP }% @@ -2353,11 +2354,11 @@ % 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} + \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}% @@ -2370,82 +2371,82 @@ \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}% + \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}% + \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 - }% + \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 + \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 + \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@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@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} + \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} @@ -2459,35 +2460,35 @@ \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}% + \pgfmathfloat@a@E=-1 + \pgfflt@leadingzero@foundperiod}% \expandafter\def\csname pgffltB@,\endcsname{% - \pgfmathfloat@frenchinput{% - \pgfmathfloat@a@E=-1 - \pgfflt@leadingzero@foundperiod - }% + \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}% + \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}% + \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} + \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}% + \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}% @@ -2498,28 +2499,28 @@ \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}% + \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}% + \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} + \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}% + \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}% @@ -2536,51 +2537,51 @@ \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}% + \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 + \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. + \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 + \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} + \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}% + \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}% @@ -2596,26 +2597,26 @@ \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}% + \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} + \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}% + \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}% @@ -2629,26 +2630,26 @@ \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}% + \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} + \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}% + \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}% @@ -2662,13 +2663,13 @@ \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}% + \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/Master/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.tex b/Master/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.tex index 9370a219fe3..581cdaade5f 100644 --- a/Master/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code.tex @@ -14,46 +14,46 @@ % 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% + \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% -} + \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% + \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% + \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. +% Convert a representation of an integer from +% the spcified base to base 10. % % #1 - a macro to store the result. % #2 - the representation of a number (i.e. not a register) @@ -66,62 +66,62 @@ % \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} - + \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} + \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} + \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}% + \expandafter\pgfmath@ensurenumberlength\expandafter{\pgfmath@base@macro}% } % \pgfmathdectobase % -% Convert a representation of an integer from -% base 10 to the specified base. Letters for bases +% Convert a representation of an integer from +% base 10 to the spcified base. Letters for bases % greater than 10 are in lowercase. % % #1 - a macro to store the result. @@ -135,25 +135,25 @@ % \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}} + \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 +% Convert a representation of an integer from +% base 10 to the spcified base. Letters for bases % greater than 10 are in uppercase. % % #1 - a macro to store the result. @@ -165,45 +165,45 @@ % \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}} + \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@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} + \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 +% Convert a representation of an integer from % between the specified bases. Letters for target -% bases greater than 10 are in uppercase. +% bases greater than 10 are in lppercase. % % #1 - a macro to store the result. % #2 - a number (in a macro, not a register) @@ -215,15 +215,15 @@ % \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}% + \pgfmathbasetodec{\pgfmath@base@temp}{#2}{#3}% + \pgfmathdectobase{#1}{\pgfmath@base@temp}{#4}% } % \pgfmathbasetobase % -% Convert a representation of an integer from +% Convert a representation of an integer from % between the specified bases. Letters for target % bases greater than 10 are in uppercase. % @@ -237,34 +237,34 @@ % \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}% + \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} - + \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@} + \expandafter\pgfmath@checknumber@#1\pgfmath@} \def\pgfmath@checknumber@#1#2\pgfmath@{% - \ifx#1-% - \pgfmath@error{Cannot process negative numbers.}% - \fi} + \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. +% a specific length, byt prefixing zeros to the number. % -% #1 - a macro containing a representation of an integer. +% #1 - a macro contatining a representation of an integer. % #2 - the number of digits to ensure. % % e.g. @@ -277,54 +277,55 @@ % \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@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} + \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@@@} + \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}} - + \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. +% 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@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% + \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/Master/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code.tex b/Master/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code.tex index 2dbf154d8be..b6ac16c8bf3 100644 --- a/Master/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code.tex @@ -14,7 +14,7 @@ % add function. % \pgfmathdeclarefunction{add}{2}{% - \begingroup% + \begingroup% \pgfmath@x=#1pt\relax% \pgfmath@y=#2pt\relax% \advance\pgfmath@x by\pgfmath@y% @@ -26,7 +26,7 @@ % subtract function. % \pgfmathdeclarefunction{subtract}{2}{% - \begingroup% + \begingroup% \pgfmath@x=#1pt\relax% \pgfmath@y=#2pt\relax% \advance\pgfmath@x by-\pgfmath@y% @@ -37,11 +37,11 @@ % neg function. % \pgfmathdeclarefunction{neg}{1}{% - \begingroup% - \pgfmath@x=-#1pt\relax% - \edef\pgfmathresult{\pgfmath@tonumber{\pgfmath@x}}% - \pgfmath@smuggleone\pgfmathresult% - \endgroup% + \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 @@ -64,206 +64,206 @@ \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% + \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% + \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}% + \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 + #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\@@} + \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% + \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@} + \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% + \c@pgfmath@counta#2#3#4#5#6\relax% + % If the number is an integer, use TeX arithmatic. + \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% + \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. @@ -285,27 +285,27 @@ % 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% + \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% + \begingroup% + \expandafter\pgfmath@x#1pt\relax% + \ifdim\pgfmath@x<0pt\relax% + \pgfmath@x-\pgfmath@x% + \fi% + \pgfmath@returnone\pgfmath@x% + \endgroup% } % sign(x) @@ -334,189 +334,189 @@ % 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% + \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% + \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% +\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 @@ -527,7 +527,7 @@ % exp function. % -\pgfmathdeclarefunction{exp}{1}{% +\pgfmathdeclarefunction{exp}{1}{% \begingroup \pgfmath@xc=#1pt\relax \pgfmath@yc=#1pt\relax @@ -559,186 +559,186 @@ % 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@% +\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@% + \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% + \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} + \edef\pgfmathresult{\pgfmath@root}% + \pgfmath@smuggleone\pgfmathresult% + \endgroup} % \pgfmathpow % % Calculates #1 ^ #2 % -\pgfmathdeclarefunction{pow}{2}{% +\pgfmathdeclarefunction{pow}{2}{% \begingroup% \pgfmath@xa=#1pt% \pgfmath@xb=#2pt% @@ -775,27 +775,27 @@ \pgfmathexp@{\pgfmath@tonumber{\pgfmath@x}}% \pgfmath@x=\pgfmathresult pt\relax% \fi% - \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% +\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: diff --git a/Master/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex b/Master/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex index d1c3c43443e..b35e3d2595b 100644 --- a/Master/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex @@ -15,49 +15,45 @@ % % 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@check#1#2#3{% + \expandafter\ifx\csname pgfmath@function@#1\endcsname\relax% + \pgfmath@declarefunction{#1}{#2}{#3}% + \else% + \pgfmath@error{The function `#1' already exists}{}% + \fi% } \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% + \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}}% + \edef\pgf@marshal{\noexpand\pgfmathdeclarefunction*{#1}{\csname pgfmath@operation@#1@arity\endcsname}}% \pgf@marshal{#2}% - \fi% + \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}% - }% - \begingroup% - \catcode`\^^I=9\relax% - \catcode`\ =9\relax% - \catcode`\~=10\relax% - \endlinechar=`\ \relax - \pgfmath@marshal% + \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. @@ -66,116 +62,115 @@ % #4 - code for function . % \def\pgfmath@@declarefunction#1#2#3#4{% Function of arity 0 - 9. - \endgroup% - \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}% + \ifcase#3\relax% + \def#1{#2}% + \def#2{#4}% + \or + \def#1##1{\pgfmathparse{##1}\expandafter#2\expandafter{\pgfmathresult}}% + \def#2##1{#4}% + \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% + \pgfmath@@head{#4}% + \fi% } \def\pgfmath@addto@toks#1{% - \edef\pgfmath@toks@expanded{\the\pgfmath@toks}% - \expandafter\pgfmath@toks\expandafter{\pgfmath@toks@expanded#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@=@;% - } + /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}% + \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@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} + \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% + \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@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% + \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 @@ -183,76 +178,76 @@ % #3: a math expression containing '#1', '#2', ... ,'#' % This callback is overwritten by pgflibraryluamath. \def\pgfmathnotifynewdeclarefunction#1#2#3{% - \pgfmathdeclarefunction{#1}{#2}{\pgfmathparse{#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@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}}% + \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% + \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% + \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}% + \pgfmathdeclarefunction*{#1}{0}{#2}% }% % Redefines a pseudo constant '#1'. \def\pgfmathredeclarepseudoconstant#1#2{% - \pgfmathredeclarefunction{#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.comparison.code.tex +\input pgfmathfunctions.base.code.tex +\input pgfmathfunctions.round.code.tex +\input pgfmathfunctions.misc.code.tex \input pgfmathfunctions.integerarithmetics.code.tex diff --git a/Master/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison.code.tex b/Master/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison.code.tex index f6e69993e8c..54a8d64220e 100644 --- a/Master/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison.code.tex @@ -14,7 +14,7 @@ \pgfmathdeclarefunction{greater}{2}{% \begingroup% \ifdim#1pt>#2pt\relax% - \def\pgfmathresult{1}% + \def\pgfmathresult{1}% \else% \def\pgfmathresult{0}% \fi% @@ -26,7 +26,7 @@ \pgfmathdeclarefunction{less}{2}{% \begingroup% \ifdim#1pt<#2pt\relax% - \def\pgfmathresult{1}% + \def\pgfmathresult{1}% \else% \def\pgfmathresult{0}% \fi% @@ -38,7 +38,7 @@ \pgfmathdeclarefunction{equal}{2}{% \begingroup% \ifdim#1pt=#2pt\relax% - \def\pgfmathresult{1}% + \def\pgfmathresult{1}% \else% \def\pgfmathresult{0}% \fi% @@ -48,26 +48,26 @@ \let\pgfmathequalto=\pgfmathequal -% approxequalto function from Christian Feuersaenger. +% approxequalto function from Christian Feuersanger. % \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% + \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% } @@ -75,14 +75,14 @@ % 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% + \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. @@ -90,7 +90,7 @@ \pgfmathdeclarefunction{notequal}{2}{% \begingroup% \ifdim#1pt=#2pt\relax% - \def\pgfmathresult{0}% + \def\pgfmathresult{0}% \else% \def\pgfmathresult{1}% \fi% @@ -103,7 +103,7 @@ \pgfmathdeclarefunction{notless}{2}{% \begingroup% \ifdim#1pt<#2pt\relax% - \def\pgfmathresult{0}% + \def\pgfmathresult{0}% \else% \def\pgfmathresult{1}% \fi% @@ -116,7 +116,7 @@ \pgfmathdeclarefunction{notgreater}{2}{% \begingroup% \ifdim#1pt>#2pt\relax% - \def\pgfmathresult{0}% + \def\pgfmathresult{0}% \else% \def\pgfmathresult{1}% \fi% @@ -128,15 +128,15 @@ % \pgfmathdeclarefunction{and}{2}{% \begingroup% - \def\pgfmathresult{1}% + \def\pgfmathresult{1}% \ifdim#1pt=0pt\relax% - \def\pgfmathresult{0}% - \else% - \ifdim#2pt=0pt\relax% - \def\pgfmathresult{0}% - \fi% - \fi% - \pgfmath@smuggleone\pgfmathresult% + \def\pgfmathresult{0}% + \else% + \ifdim#2pt=0pt\relax% + \def\pgfmathresult{0}% + \fi% + \fi% + \pgfmath@smuggleone\pgfmathresult% \endgroup% } @@ -144,16 +144,16 @@ % \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% + \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% } @@ -161,12 +161,12 @@ % \pgfmathdeclarefunction{not}{1}{% \begingroup% - \ifdim#1pt=0pt\relax% - \def\pgfmathresult{1}% - \else% - \def\pgfmathresult{0}% - \fi% - \pgfmath@smuggleone\pgfmathresult% + \ifdim#1pt=0pt\relax% + \def\pgfmathresult{1}% + \else% + \def\pgfmathresult{0}% + \fi% + \pgfmath@smuggleone\pgfmathresult% \endgroup% } diff --git a/Master/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerarithmetics.code.tex b/Master/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerarithmetics.code.tex index ab8f4e6d3c1..9094da50dc9 100644 --- a/Master/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerarithmetics.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerarithmetics.code.tex @@ -11,28 +11,28 @@ \pgfmathcontinuelooptrue \pgfmath@xa=#1pt \pgfmath@xb=#2pt - \ifdim\pgfmath@xa=0pt\relax + \ifdim\pgfmath@xa=0pt \pgfmathcontinueloopfalse \pgfmath@xa=\pgfmath@xb - \fi - \ifdim\pgfmath@xb=0pt\relax + \fi + \ifdim\pgfmath@xb=0pt \pgfmathcontinueloopfalse \pgfmath@xb=\pgfmath@xa \fi - \ifdim\pgfmath@xa<0pt\relax + \ifdim\pgfmath@xa<0pt \pgfmath@xa=-\pgfmath@xa \fi - \ifdim\pgfmath@xb<0pt\relax + \ifdim\pgfmath@xb<0pt \pgfmath@xb=-\pgfmath@xb \fi \loop - \ifpgfmathcontinueloop + \ifpgfmathcontinueloop \ifdim\pgfmath@xa=\pgfmath@xb \pgfmathcontinueloopfalse \else - \ifdim\pgfmath@xa>\pgfmath@xb + \ifdim\pgfmath@xa>\pgfmath@xb \advance\pgfmath@xa by-\pgfmath@xb - \else + \else \advance\pgfmath@xb by-\pgfmath@xa \fi \fi @@ -42,14 +42,14 @@ \endgroup} \newif\ifpgfmath@isprime@unknown -\newif\ifpgfmath@isprime +\newif\ifpgfmath@isprime \pgfmathdeclarefunction{isprime}{1}{% \begingroup \pgfmath@isprime@unknowntrue \pgfmathsetcount\c@pgfmath@counta{abs(int(#1))}% - \ifcase\c@pgfmath@counta\relax - % |#1| = 0 + \ifcase\c@pgfmath@counta\relax + % |#1| = 0 \pgfmath@isprimefalse \pgfmath@isprime@unknownfalse \or @@ -66,17 +66,17 @@ \pgfmath@isprime@unknownfalse \else % |#1| > 3 - \ifodd\c@pgfmath@counta\relax + \ifodd\c@pgfmath@counta\relax \else \pgfmath@isprimefalse \pgfmath@isprime@unknownfalse \fi - \fi + \fi \ifpgfmath@isprime@unknown \c@pgfmath@countd=3 \pgfmath@isprimetrue \pgfmathloop - \c@pgfmath@countb=\c@pgfmath@counta + \c@pgfmath@countb=\c@pgfmath@counta \divide\c@pgfmath@countb by\c@pgfmath@countd \ifnum\c@pgfmath@countb>\c@pgfmath@countd \pgfmath@isprime@unknowntrue @@ -84,7 +84,7 @@ \pgfmath@isprime@unknownfalse \fi \multiply\c@pgfmath@countb by\c@pgfmath@countd - \ifnum\c@pgfmath@countb=\c@pgfmath@counta + \ifnum\c@pgfmath@countb=\c@pgfmath@counta \global\pgfmath@isprimefalse \pgfmath@isprime@unknownfalse \fi diff --git a/Master/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.tex b/Master/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.tex index bab8fefd4eb..9b807992787 100644 --- a/Master/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code.tex @@ -11,116 +11,116 @@ % % Version 1.414213 29/9/2007 -% veclen function adapted from ideas due to Rouben Rostamian. +% veclen function adpated from ideas due to Rouben Rostamian. % -% Calculate the Euclidean length of a 2D vector. +% Calcluate the Eulidean length of a 2D vector. % % -\pgfmathdeclarefunction{veclen}{2}{% +\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% + \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} + \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 + \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 + \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 @@ -134,136 +134,136 @@ % 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@} + \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@@@} - + \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% + \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} - + \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% + \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% + \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% + \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% + \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\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% + \pgfmath@smuggleone\pgfmathresult\endgroup% } % dim function: return dimension of an array @@ -288,55 +288,55 @@ % max function. % \pgfmathdeclarefunction{max}{...}{% - \begingroup% - \pgfmath@x=-16383pt\relax% - \pgfmathmax@@#1{}} + \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\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. +% For compatability with old code. \def\pgfmathmax#1#2{% - \pgfmathparse{#1,#2}% - \expandafter\pgfmathmax@\expandafter{\pgfmathresult}% + \pgfmathparse{#1,#2}% + \expandafter\pgfmathmax@\expandafter{\pgfmathresult}% } % min function. % \pgfmathdeclarefunction{min}{...}{% - \begingroup% - \pgfmath@x=16383pt\relax% - \pgfmathmin@@#1{}} + \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\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. +% For compatability with old code. \def\pgfmathmin#1#2{% - \pgfmathparse{#1,#2}% - \expandafter\pgfmathmin@\expandafter{\pgfmathresult}% + \pgfmathparse{#1,#2}% + \expandafter\pgfmathmin@\expandafter{\pgfmathresult}% } @@ -346,4 +346,4 @@ \pgfmathdeclarefunction{scalar}{1}{% \def\pgfmathresult{#1}% \global\pgfmathunitsdeclaredfalse% -} +} \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.code.tex b/Master/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.code.tex index 531383dfdcd..44b8ef8f6ef 100644 --- a/Master/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.code.tex @@ -7,7 +7,7 @@ % % See the file doc/generic/pgf/licenses/LICENSE for more details. -% This file defines the pseudorandom numbers. +% This file defines the pesudorandom numbers. % % Version 1.414213 29/9/2007 @@ -15,8 +15,8 @@ % % See: % \book@{pressetal1992, -% author = {William H. Press and Brian P. Flannery and Saul A. -% Teukolsky and William T. Vetterling}, +% 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} @@ -30,26 +30,23 @@ \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. +\xdef\pgfmath@rnd@z{\the\c@pgfmath@counta}% The seed. \endgroup % \pgfmathsetseed % -% Explicitly set the seed for the generator -% +% Explictly 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 + % 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}}% +\def\pgfmath@setseed#1.#2\pgfmath@stop{\def\pgfmath@rnd@z{#1}}% -% Alternative parameters - see Press et al (1992) p278-279, +% Alternative paramaters - see Press et al (1992) p278-279, % for discussion. % % a=16807 q=127773 r=2836 @@ -60,33 +57,33 @@ \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}% + \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 @@ -94,22 +91,22 @@ % 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% + \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% + \edef\pgfmath@temp{#2.#3}% + \pgfmath@x=\pgfmath@temp pt\relax% }% % \pgfmathrand @@ -117,57 +114,57 @@ % 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% + \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% + \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} + \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% + \ifx\pgfmath@token\bgroup% + \expandafter\pgfmath@random@@@@% + \else% + \expandafter\pgfmath@random@@@@@% + \fi% } \def\pgfmath@random@@@@@#1\pgfmath@stop{% - \pgfmathrandominteger\pgfmathresult{1}{#1}% + \pgfmathrandominteger\pgfmathresult{1}{#1}% } \def\pgfmath@random@@@@#1#2\pgfmath@stop{% - \pgfmathrandominteger\pgfmathresult{#1}{#2}% + \pgfmathrandominteger\pgfmathresult{#1}{#2}% } % \pgfmathrandominteger @@ -179,29 +176,29 @@ % #3 - the upper limit of the range. % \def\pgfmathrandominteger#1#2#3{% - \begingroup% - \pgfmathgeneratepseudorandomnumber% - \c@pgfmath@counta#2\relax% - \c@pgfmath@countb#3\relax% - \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% - \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% - \advance\c@pgfmath@counta#2\relax% - \edef\pgfmathresult{\the\c@pgfmath@counta}% - \pgfmath@smuggleone{\pgfmathresult}% - \endgroup% - \edef#1{\pgfmathresult}% + \begingroup% + \pgfmathgeneratepseudorandomnumber% + \c@pgfmath@counta#2\relax% + \c@pgfmath@countb#3\relax% + \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% + \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% + \advance\c@pgfmath@counta#2\relax% + \edef\pgfmathresult{\the\c@pgfmath@counta}% + \pgfmath@smuggleone{\pgfmathresult}% + \endgroup% + \edef#1{\pgfmathresult}% } % \pgfmathdeclarerandomlist @@ -212,24 +209,24 @@ % #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@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} + \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 % @@ -239,7 +236,8 @@ % #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}}} + \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/Master/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code.tex b/Master/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code.tex index 4bd05c18c41..07f7b8b6d90 100644 --- a/Master/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code.tex @@ -13,111 +13,111 @@ % 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% +\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% +\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 + \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% +\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} + \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} + \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} +\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@@@}% + \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% + \begingroup% + \pgfmath@x=#1pt\relax% + \edef\pgfmathresult{\pgfmath@tonumber{\pgfmath@x}}% + \pgfmath@smuggleone\pgfmathresult% + \endgroup% } diff --git a/Master/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonometric.code.tex b/Master/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonometric.code.tex index 76b58bc0f16..aa98934e807 100644 --- a/Master/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonometric.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonometric.code.tex @@ -9,7 +9,7 @@ % This file defines the trigonometric functions/functions. % -% Much of this file is based on ideas and code (particularly +% 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 @@ -19,25 +19,25 @@ \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, + /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 + \if0\pgfmath@trig@format@choice + #1% + \else + #2% + \fi }% -% \pgfmathradians -% (for compatibility with 1.18 beta, will be deprecated) -% +% \pgfmathradians +% (for comptability with 1.18 beta, will be deprecated) +% % Convert #1 from radians to degrees (accurate to 1 deg). % \pgfmathdeclarefunction{radians}{1}{% @@ -49,13 +49,13 @@ }% % \pgfmathdeg -% +% % Convert #1 from radians to degrees. % -\pgfmathdeclarefunction{deg}{1}{% +\pgfmathdeclarefunction{deg}{1}{% \begingroup% \expandafter\pgfmath@x#1pt\relax% - \pgfmath@scale@rad@to@deg\pgfmath@x + \pgfmath@scale@rad@to@deg\pgfmath@x \pgfmath@returnone\pgfmath@x% \endgroup% }% @@ -65,24 +65,24 @@ }% % \pgfmathrad -% +% % Convert #1 from degrees to radians. % -\pgfmathdeclarefunction{rad}{1}{% +\pgfmathdeclarefunction{rad}{1}{% \begingroup% \expandafter\pgfmath@x#1pt\relax% - \pgfmath@scale@deg@to@rad\pgfmath@x + \pgfmath@scale@deg@to@rad\pgfmath@x \pgfmath@returnone\pgfmath@x% \endgroup% }% \def\pgfmath@scale@deg@to@rad#1{% - #1=3.14159#1% + #1=3.14159#1% \divide#1180\relax% }% % \pgfmathsin -% +% % Calculate the sine of #1 (in degrees). % \pgfmathdeclarefunction{sin}{1}{% @@ -91,10 +91,10 @@ % \begingroup% \expandafter\pgfmath@x#1pt\relax% - \if1\pgfmath@trig@format@choice - % trig format=rad - \pgfmath@scale@rad@to@deg\pgfmath@x - \fi + \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@ @@ -128,7 +128,7 @@ } % \pgfmathcos -% +% % Calculate the cosine of #1 (in degrees). % \pgfmathdeclarefunction{cos}{1}{% @@ -137,12 +137,12 @@ % \begingroup% \expandafter\pgfmath@x#1pt\relax% - \if1\pgfmath@trig@format@choice - % trig format=rad - \pgfmath@scale@rad@to@deg\pgfmath@x - \fi + \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@% + \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% @@ -173,7 +173,7 @@ } % \pgfmathsincos -% +% % Calculate the sin and cosine of #1 (in degrees). % \def\pgfmathsincos#1{% @@ -186,7 +186,7 @@ } % \pgfmathtan -% +% % Calculate the tangent of #1 (in degrees). % \pgfmathdeclarefunction{tan}{1}{% @@ -203,16 +203,16 @@ } % \pgfmathcosec -% +% % Calculate the cosec of #1 (in degrees). % -\pgfmathdeclarefunction{cosec}{1}{% +\pgfmathdeclarefunction{cosec}{1}{% \expandafter\pgfmathsin@\expandafter{#1}% \pgfmathreciprocal@{\pgfmathresult}% } % \pgfmathsec -% +% % Calculate the sec of #1 (in degrees). % \pgfmathdeclarefunction{sec}{1}{% @@ -221,10 +221,10 @@ } % \pgfmathcot -% +% % Calculate the cotangent of #1 (in degrees). % -\pgfmathdeclarefunction{cot}{1}{% +\pgfmathdeclarefunction{cot}{1}{% \begingroup% \edef\pgfmath@temparg{#1}% \pgfmathsin@{\pgfmath@temparg}% @@ -262,10 +262,10 @@ \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 + \if1\pgfmath@trig@format@choice + % trig format=rad + \pgfmath@scale@deg@to@rad\pgfmath@x + \fi \pgfmath@returnone\pgfmath@x% \endgroup% } @@ -301,7 +301,7 @@ % \pgfmathacos % % The acos of #1 -% +% \pgfmathdeclarefunction{acos}{1}{% \begingroup% \pgfmath@x#1pt\relax% @@ -318,10 +318,10 @@ \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 + \if1\pgfmath@trig@format@choice + % trig format=rad + \pgfmath@scale@deg@to@rad\pgfmath@x + \fi \pgfmath@returnone\pgfmath@x% \endgroup% } @@ -351,10 +351,10 @@ \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 + \if1\pgfmath@trig@format@choice + % trig format=rad + \pgfmath@scale@deg@to@rad\pgfmath@x + \fi \pgfmath@returnone\pgfmath@x% \endgroup% } @@ -362,8 +362,8 @@ \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}% + \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% @@ -402,12 +402,12 @@ \pgfmath@x=-\pgfmath@x% \fi% \fi% - \if1\pgfmath@trig@format@choice@@ - % trig format=rad - \pgfmath@scale@deg@to@rad\pgfmath@x - \fi + \if1\pgfmath@trig@format@choice@@ + % trig format=rad + \pgfmath@scale@deg@to@rad\pgfmath@x + \fi \pgfmath@returnone\pgfmath@x% - \endgroup% + \endgroup% } % This is needed since \pgfmathatan2 is not a legal macro name @@ -557,7 +557,7 @@ \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} +\pgfmath@def{cosfrac}{100}{0.70710} % Oh No! Some really loooooong tables. \pgfmath@def{atan}{0}{0.00000} \pgfmath@def{atan}{1}{0.05729} @@ -1060,8 +1060,8 @@ \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{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} diff --git a/Master/texmf-dist/tex/generic/pgf/math/pgfmathode.code.tex b/Master/texmf-dist/tex/generic/pgf/math/pgfmathode.code.tex index cb3d0d26ca8..d8837897558 100644 --- a/Master/texmf-dist/tex/generic/pgf/math/pgfmathode.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/math/pgfmathode.code.tex @@ -36,12 +36,12 @@ %********************************************************************** % Numerically solve a differential system with 1st order Runge-Kutta -% (Euler method) +% (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))}, @@ -58,7 +58,7 @@ % * 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) +% pendulum) % \pgfmathodeRKI{\Sol}{{\Sol[2],-\Sol[2]/2-sin(deg(\Sol[1]))}}% % {{0,-1,5}}{15}{50} @@ -71,8 +71,8 @@ % 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 + % add [\pgfmathode@timeindex] after every occurence of #1 in #2. + % No need to brace #2 since it is already surounded 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 @@ -93,9 +93,9 @@ \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. + % qk[t(i-1)] + % Note: this part can be really slow due to array managment in + % pgfmath. % TODO: find a better way (at least inside this loop) \pgfmathparse{% \pgfmathode@Deltat*(\pgfmathode@func[\pgfmathode@funcindex-1])+ @@ -132,7 +132,7 @@ % Start the function loop \foreach \pgfmathode@funcindex in {1,...,\pgfmathode@dimfunc} {% % The RKIV algorithm - % qk[t(i)] = qk[t(i-1)] + + % 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, @@ -175,4 +175,4 @@ \endgroup} -\endinput +\endinput \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex b/Master/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex index f9afe04d72d..0ede2314cfe 100644 --- a/Master/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex @@ -24,7 +24,7 @@ \fi \pgfmath@parse@next} -\def\pgfmath@catcodes{% Maybe unnecessary. +\def\pgfmath@catcodes{% Maybe unecessary. \catcode`\==12 % \catcode`\,=12 % \catcode`\|=12 % @@ -36,23 +36,23 @@ \pgfmath@catcodes \pgfmath@quickparsetrue \pgfmathparse@} - + \def\pgfmathparse@#1{% - % No (math) units yet. + % No (math) units yet. \global\pgfmathunitsdeclaredfalse \global\pgfmathmathunitsdeclaredfalse - % Expand expression so any remaining CSs are registers + % Expand expression so any reamining CSs are registers % or box dimensions (i.e. |\wd|, |\ht|, |\dp|). \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% + % + \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\pgfmath@parse@stop{\pgfmath@parse@stop}% equals only itsself \def\pgfmathparse@trynumber@token{numeric} \begingroup @@ -66,52 +66,52 @@ % % #1 a single token \def\pgfmathparse@trynumber@loop{% - \futurelet\pgfmath@token@let\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 + \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 + \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. + % |\pgfmathqparse|). + % Stuff for calc compatiability. \let\real=\pgfmath@calc@real \let\minof=\pgfmath@calc@minof \let\maxof=\pgfmath@calc@maxof @@ -141,7 +141,7 @@ \let\pgfmathpostparse=\relax -% For compatibility with older version. +% For compatiability with older version. % \def\pgfmathscaleresult{% \ifpgfmathunitsdeclared @@ -178,7 +178,7 @@ \pgfmath@next% }% -% Stuff for computability with the calc package. +% Stuff for compatability with the calc package. % \def\pgfmath@calc@real#1{#1} \def\pgfmath@calc@minof#1#2{min(#1,#2)} @@ -208,14 +208,14 @@ \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 + % Defines for each token or balenced text in |#2| a control sequence % |\pgfmath@token@<#1>@\string| 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 @@ -265,7 +265,7 @@ \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 @@ -305,9 +305,9 @@ \def\pgfmath@parse@@operand{% \pgfmath@parse@ifbgroup{\pgfmath@parse@@operand}{\pgfmath@parse@@operand@}} -% An operand is +% An operand is % * |+| (unary plus), -% * |-| (unary minus), +% * |-| (unary minus), % * a prefix operator \def\pgfmath@parse@@operand@#1{% \def\pgfmath@token{#1}% @@ -396,8 +396,8 @@ % 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. -% +% 7. A binary, hexadeciaml, 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% @@ -430,7 +430,7 @@ \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. + % A CS following a count register should be \wd, \ht or \dp. \let\pgfmath@parse@next=\pgfmath@parse@number% \else% \let\pgfmathresult=\pgfmath@number% @@ -464,7 +464,7 @@ \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% + \let\pgfmathresult=\pgfmath@number% \else% \ifx\pgfmath@number\pgfmath@char@zero% \let\pgfmathresult=\pgfmath@number% @@ -491,7 +491,7 @@ \let\pgfmath@parse@next=\pgfmath@parse@base% \fi% \else% ... and here, it is the exponent characters. - \let\pgfmath@parse@next=\pgfmath@parse@exponent% + \let\pgfmath@parse@next=\pgfmath@parse@exponent% \fi% \else% ...but here it is units. \global\pgfmathunitsdeclaredtrue% @@ -555,7 +555,7 @@ \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. + % A CS following a count register should be \wd, \ht or \dp. \let\pgfmath@parse@next=\pgfmath@parse@number% \else% \let\pgfmathresult=\pgfmath@number% @@ -579,7 +579,7 @@ \pgfmath@parse@@operator% } -% Parse binary or hexadecimal numbers (octal numbers done elsewhere). +% Parse binary or hexadecimal numbers (octal numbers done elsehwere). % \def\pgfmath@parse@base{% \ifnum\pgfmath@base=2\relax% @@ -596,7 +596,7 @@ \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}% @@ -622,7 +622,7 @@ \fi% \pgfmath@parse@next% } - + % Parse a function. % \def\pgfmath@parse@function{\pgfmath@parse@ifbgroup{\pgfmath@parse@function}{\pgfmath@parse@@function}} @@ -645,7 +645,7 @@ \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 _. + \else% It is from from A-Z, a-z, or _. \edef\pgfmath@function{\pgfmath@function#1}% \let\pgfmath@parse@next=\pgfmath@parse@function@% \fi% @@ -683,7 +683,7 @@ \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} + \pgfmath@parse@@@operator} \def\pgfmath@parse@@@operator{% \expandafter\ifx\csname pgfmath@operator@\pgfmath@token\expandafter\string\pgfmath@token@next\endcsname\relax% @@ -770,10 +770,10 @@ % \def\pgfmath@operator@@@process{% Process an operator. \pgfmath@stack@pop@operation\pgfmath@@operator% - \pgfmath@stack@pop@operand\pgfmath@operand@a% + \pgfmath@stack@pop@operand\pgfmath@operand@a% \ifcase\csname pgfmath@operation@\pgfmath@@operator @arity\endcsname\relax% % Zero arity operators (!). - \or% + \or% \pgfmath@operator@@@@process{\pgfmath@operand@a}% \or% \pgfmath@stack@pop@operand\pgfmath@operand@b% @@ -781,7 +781,7 @@ \or% \pgfmath@stack@pop@operand\pgfmath@operand@b% \expandafter\pgfmath@operator@@@@process\expandafter% - {\expandafter\pgfmath@operand@b\expandafter}\pgfmath@operand@a% + {\expandafter\pgfmath@operand@b\expandafter}\pgfmath@operand@a% \else% % No operators with more than tenary arity. \fi% @@ -807,7 +807,7 @@ \else% \expandafter\pgfmath@function@@@@process\expandafter{\pgfmath@@operand}% \fi% - \fi% + \fi% } \def\pgfmath@function@@@@process{\csname pgfmath\pgfmath@@function @\endcsname} @@ -834,7 +834,7 @@ \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{% @@ -844,11 +844,11 @@ \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 +% 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{% @@ -896,7 +896,7 @@ \pgfmathdeclareoperator{)}{@endgroup} {0}{postfix}{4} \pgfmathdeclareoperator{\pgfmath@bgroup}{@startarray}{1}{prefix} {3} -\pgfmathdeclareoperator{\pgfmath@egroup}{@endarray} {1}{postfix}{2}% +\pgfmathdeclareoperator{\pgfmath@egroup}{@endarray} {1}{postfix}{2}% % Special operators. \pgfmathdeclareoperator{"}{}{1}{prefix}{1} diff --git a/Master/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex b/Master/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex index d98ecb25d59..44d39c75b6a 100644 --- a/Master/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex @@ -1,9 +1,9 @@ % Copyright 2007 Mark Wibrow % -% but subject to the LaTeX Project Public License +% but subject to the LaTeX Project Public License % (http://www.latex-project.org/lppl.txt) % -% and the GNU Public License +% and the GNU Public License % (http://www.gnu.org/licenses/gpl.txt) % @@ -21,30 +21,30 @@ % #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@} + \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% + \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. +% Check registers exist. If not, create them. % \pgfmath@ensureregister{dimen}{\pgf@x} \pgfmath@ensureregister{dimen}{\pgf@xa} @@ -91,63 +91,63 @@ \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). +% Just \let pgfmath versions. If not, define pgfmath versions (Arghhh). % % \...ifnextchar % \ifx\pgfutil@ifnextchar\pgfmath@undefined% - \long\def\pgfmath@ifnextchar#1#2#3{% + \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} - }% + \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= } \: - }% + \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}% + \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% + \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% + \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% + \let\pgfmath@selectfont\pgfutil@selectfont% \fi% % New definition easier than fussing around with let. @@ -163,43 +163,43 @@ % \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} + \def\pgfmath@tonumber#1{\expandafter\Pgf@geT\the#1} \else% - \let\pgfmath@tonumber\pgf@sys@tonumber% + \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.}}% + \def\pgfmath@PackageWarning#1#2{\immediate\write-1{Package #1: Warning! #2.}}% \else% - \let\pgfmath@PackageWarning\PackageWarning% + \let\pgfmath@PackageWarning\PackageWarning% \fi% \ifx\PackageError\pgfmath@undefined - \def\pgfmath@PackageError#1#2#3{\errmessage{Package #1 Error: #2.}}% + \def\pgfmath@PackageError#1#2#3{\errmessage{Package #1 Error: #2.}}% \else% - \let\pgfmath@PackageError\PackageError% + \let\pgfmath@PackageError\PackageError% \fi% \def\pgfmath@error#1#2{% - \pgfmath@PackageError{PGF Math}{% - #1% - \pgfutil@ifundefined{pgfmath@expression}{}{ (in '\pgfmath@expression')}% - }{#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@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}} +{\catcode`\p=12\catcode`\t=12\gdef\PgfmaTh@PT{pt}} \edef\pgfmath@pt{\PgfmaTh@PT}% % \pgfmath@empty @@ -214,7 +214,7 @@ % \pgfmath@gobbletilpgfmath@ % % Gobble stream until \pgfmath@ {which is undefined}. -% +% \def\pgfmath@gobbletilpgfmath@#1\pgfmath@{} \def\pgfmath@gobbleone#1{}% @@ -231,17 +231,17 @@ % \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} + \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}% @@ -251,7 +251,7 @@ % % Changed by TT: made faster and simpler since it is used % *heavily*. #1 must be something that can be assigned to a -% dimension. +% dimension. % \def\pgfmath@returnone#1\endgroup{% \pgfmath@x#1% @@ -269,6 +269,6 @@ % followed by \endgroup % \def\pgfmath@smuggleone#1\endgroup{% - \expandafter\endgroup\expandafter\def\expandafter#1\expandafter{#1}} + \expandafter\endgroup\expandafter\def\expandafter#1\expandafter{#1}} \let\pgfmathsmuggle=\pgfmath@smuggleone diff --git a/Master/texmf-dist/tex/generic/pgf/modules/pgfmoduleanimations.code.tex b/Master/texmf-dist/tex/generic/pgf/modules/pgfmoduleanimations.code.tex index d4e82cb1af5..4860107d1c2 100644 --- a/Master/texmf-dist/tex/generic/pgf/modules/pgfmoduleanimations.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/modules/pgfmoduleanimations.code.tex @@ -34,15 +34,15 @@ % 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. +% 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. +% ascending times. % % The syntax of the second parameter of the entry key depends on % #1. Currently, these are: -% +% % Attribute Value Type % --------------------------------------- % fill opacity scalar @@ -71,7 +71,7 @@ \def\pgfanimateattribute#1#2{% \pgfanimateattributecode{#1}{\pgfkeys{/pgf/animation/.cd,#2}}% -}% +} % Variant of \pgfanimateattribute @@ -91,7 +91,7 @@ \csname pgf@animation@check@\pgf@animation@attribute\endcsname% \pgfsysanimate{\pgf@animation@attribute}% }% -}% +} @@ -124,8 +124,8 @@ % \fill (0,0) rectangle (1,1); % } -\def\pgfsnapshot#1{\pgfparsetime{#1}\expandafter\pgfsysanimsnapshot\expandafter{\pgftimeresult}}% -\def\pgfsnapshotafter#1{\pgfparsetime{#1}\expandafter\pgfsysanimsnapshotafter\expandafter{\pgftimeresult}}% +\def\pgfsnapshot#1{\pgfparsetime{#1}\expandafter\pgfsysanimsnapshot\expandafter{\pgftimeresult}} +\def\pgfsnapshotafter#1{\pgfparsetime{#1}\expandafter\pgfsysanimsnapshotafter\expandafter{\pgftimeresult}} % The animation attributes @@ -155,23 +155,23 @@ 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 +% 2) The postfix operator "ms" is added, which devides a number by % 1000, so "2ms" equals "0.002". % 3) The postfix operator "min" is added, which multiplies a number by % 60. @@ -195,11 +195,11 @@ \pgfmathparse{#1}% \expandafter\endgroup% \expandafter\def\expandafter\pgftimeresult\expandafter{\pgfmathresult}% -}% +} \newif\ifpgfanim@m@encountered \newif\ifpgfanim@i@encountered -\pgfmathdeclarefunction{@seconds}{1}{% +\pgfmathdeclarefunction{@seconds}{1}{% \begingroup% \expandafter\pgfmath@x#1pt\relax% \ifpgfanim@m@encountered% @@ -228,7 +228,7 @@ \pgfmath@returnone\pgfmath@x% \endgroup% }% -\pgfmathdeclarefunction{@minutes}{1}{% +\pgfmathdeclarefunction{@minutes}{1}{% \ifpgfanim@i@encountered% \global\pgfanim@i@encounteredfalse% \else% @@ -240,7 +240,7 @@ \pgfmath@returnone\pgfmath@x% \endgroup% }% -\pgfmathdeclarefunction{@hours}{1}{% +\pgfmathdeclarefunction{@hours}{1}{% \begingroup% \expandafter\pgfmath@x#1pt\relax% \pgfmath@x3600\pgfmath@x\relax% @@ -255,23 +255,23 @@ \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}}% +\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); @@ -286,7 +286,7 @@ \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}% @@ -296,45 +296,45 @@ \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. +% 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}, -}% + 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 -% +% 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. +% active. % % Example: -% +% % \pgfanimateattribute{fill opacity}{entry={0s}{1}, entry={1s}{0}, restart=false} \pgfanimationset{ @@ -343,29 +343,29 @@ restart/true/.code=\pgfsysanimkeyrestartalways, restart/false/.code=\pgfsysanimkeyrestartnever, restart/never/.code=\pgfsysanimkeyrestartnever, - restart/when not active/.code=\pgfsysanimkeyrestartwhennotactive, -}% + restart/when not active/.code=\pgfsysanimkeyrestartwhennotactive +} % Sets the number times an animation should repeat -% +% % #1 = A string of the following form: -% +% % [ | | for