texlive[43129] Master: forest (3feb17)

commits+karl at tug.org commits+karl at tug.org
Sat Feb 4 01:23:35 CET 2017


Revision: 43129
          http://tug.org/svn/texlive?view=revision&revision=43129
Author:   karl
Date:     2017-02-04 01:23:35 +0100 (Sat, 04 Feb 2017)
Log Message:
-----------
forest (3feb17)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/forest/README
    trunk/Master/texmf-dist/doc/latex/forest/forest-doc.pdf
    trunk/Master/texmf-dist/doc/latex/forest/forest-doc.tex
    trunk/Master/texmf-dist/doc/latex/forest/forest.pdf
    trunk/Master/texmf-dist/source/latex/forest/forest.dtx
    trunk/Master/texmf-dist/tex/latex/forest/forest.sty
    trunk/Master/tlpkg/bin/tlpkg-ctan-check
    trunk/Master/tlpkg/libexec/ctan2tds

Modified: trunk/Master/texmf-dist/doc/latex/forest/README
===================================================================
--- trunk/Master/texmf-dist/doc/latex/forest/README	2017-02-03 21:33:11 UTC (rev 43128)
+++ trunk/Master/texmf-dist/doc/latex/forest/README	2017-02-04 00:23:35 UTC (rev 43129)
@@ -1,4 +1,4 @@
-LaTeX package: forest [2017/01/27 v2.1.3 Drawing (linguistic) trees]
+LaTeX package: forest [2017/02/02 v2.1.4 Drawing (linguistic) trees]
 
 Copyright (c) 2012-2017 Saso Zivanovic
                    (Sa\v{s}o \v{Z}ivanovi\'{c})

Modified: trunk/Master/texmf-dist/doc/latex/forest/forest-doc.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/forest/forest-doc.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/forest/forest-doc.tex	2017-02-03 21:33:11 UTC (rev 43128)
+++ trunk/Master/texmf-dist/doc/latex/forest/forest-doc.tex	2017-02-04 00:23:35 UTC (rev 43129)
@@ -6409,7 +6409,25 @@
 \subsubsection{v2.1}
 
 \begin{description}
+\item[v2.1.4 (2017/02/02)] \mbox{}
+  
+  Performance:
+  \begin{itemize}
+  \item Reimplement some internals of the packing algorithm to avoid consuming the string pool in
+    documents with many trees. (We're about 10\% slower now, but (depending on the document) the
+    memory usage can drop up to five times!)
+  \end{itemize}
+
+  Bugfixes:
+  \begin{itemize}
+  \item Fix aggregate function \index{aggregate>count}.
+  \item Provide a workaround for a PGF bug: for coordinate-shaped nodes, |\positionnodelater|
+    provides dimensions with |pt| in a wrong catcode, so \index{max y} and friends did not work for
+    such nodes.
+  \end{itemize}
+  
 \item[v2.1.3 (2017/01/27)] \mbox{}
+  
   Bugfixes:
   \begin{itemize}
   \item Update \index{nice empty nodes} to use \index{for step=\index{current and siblings}}.

Modified: trunk/Master/texmf-dist/doc/latex/forest/forest.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/source/latex/forest/forest.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/forest/forest.dtx	2017-02-03 21:33:11 UTC (rev 43128)
+++ trunk/Master/texmf-dist/source/latex/forest/forest.dtx	2017-02-04 00:23:35 UTC (rev 43129)
@@ -1,4 +1,4 @@
-% \CheckSum{16610}
+% \CheckSum{16623}
 % \iffalse meta-comment
 % forest.dtx
 %% `forest' is a `pgf/tikz'-based package for drawing (linguistic) trees.
@@ -83,7 +83,7 @@
 %
 % \section{Identification}
 %    \begin{macrocode}
-\ProvidesPackage{forest}[2017/01/27 v2.1.3 Drawing (linguistic) trees]
+\ProvidesPackage{forest}[2017/02/02 v2.1.4 Drawing (linguistic) trees]
 
 \RequirePackage{tikz}[2013/12/13]
 \usetikzlibrary{shapes}
@@ -2988,8 +2988,8 @@
   \expandafter\endgroup
   \expandafter\edef\expandafter#2\expandafter{\forest at temp@message}%
 }
-\NewDocumentCommand\forestdebugtypeouttree{o m}{%
-  \forestdebug at typeouttree{#1}\forest at temp
+\NewDocumentCommand\forestdebugtypeouttree{d() O{\forest at cn}}{%
+  \forestdebug at typeouttree{#2}\forest at temp
   \typeout{\IfValueTF{#1}{#1: }{}\forest at temp}%
 }
 %    \end{macrocode}
@@ -5117,10 +5117,10 @@
   {#2}%
 }
 \def\forest at aggregate@count#1{\forest at aggregate
-  {\def\forestmathresult{1}}%
-  {\def\forestmathresult{1}}%
-  {\edef\forestmathresult{\the\numexpr\forestregister{aggregate result}+1}}%
-  {\forestrget{aggregate result}\forestmathresult}%
+  {\def\forestmathresult{0}\let\forestmathresulttype\forestmathtype at count}%
+  {\def\forestmathresult{1}\let\forestmathresulttype\forestmathtype at count}%
+  {\edef\forestmathresult{\the\numexpr\forestregister{aggregate result}+1}\let\forestmathresulttype\forestmathtype at count}%
+  {\forestrget{aggregate result}\forestmathresult\let\forestmathresulttype\forestmathtype at count}%
   {#1}%
 }
 \def\forest at aggregate@average#1#2{\forest at aggregate
@@ -7139,11 +7139,18 @@
   \forest at patch@enormouscoordinateboxbounds at minus\pgfpositionnodelatermaxx
   \forest at patch@enormouscoordinateboxbounds at minus\pgfpositionnodelatermaxy
   % end of patch
-  \xappto\forest at smuggle{\noexpand\forestoset{min x}{\pgfpositionnodelaterminx}}%
-  \xappto\forest at smuggle{\noexpand\forestoset{min y}{\pgfpositionnodelaterminy}}%
-  \xappto\forest at smuggle{\noexpand\forestoset{max x}{\pgfpositionnodelatermaxx}}%
-  \xappto\forest at smuggle{\noexpand\forestoset{max y}{\pgfpositionnodelatermaxy}}%
+  % when shape=coordinate, pgf returns \pgfpositionnodelater... with wrong catcode of pt
+  \forest at pnn@addtosmuggle{min x}\pgfpositionnodelaterminx
+  \forest at pnn@addtosmuggle{max x}\pgfpositionnodelatermaxx
+  \forest at pnn@addtosmuggle{min y}\pgfpositionnodelaterminy
+  \forest at pnn@addtosmuggle{max y}\pgfpositionnodelatermaxy
 }
+\def\forest at pnn@addtosmuggle#1#2{%
+  {%
+    \pgfutil at tempdima=#2\relax
+    \xappto\forest at smuggle{\noexpand\forestoset{#1}{\the\pgfutil at tempdima}}%
+  }%
+}
 \def\forest at node@forest at positionnodelater@restore{%
   \ifforest at drawtree@preservenodeboxes@
     \let\forest at boxorcopy\copy
@@ -8819,7 +8826,7 @@
 %     original point; |d| is its distance to the grow line. The inner
 %     array is not sorted.
 %   \end{itemize}
-% \item A dictionary |#2|: keys are the coordinates |(x,y)| of
+% \item A ``dictionary'' |#3|: keys are the coordinates |(x,y)| of
 %   the original points; a value is the index of the original point's
 %   projection in array |#2|.\footnote{At first sight, this
 %   information could be cached ``at the source'': by
@@ -8827,10 +8834,12 @@
 %   intersecting (in breakpath), we cheat and merge very adjacent
 %   projection points, expecting that the points to project to the
 %   merged projection point.  All this depends on the given path, so a
-%   generic cache is not feasible.}
+%   generic cache is not feasible.} In v2.1.4, the ``dictionary'' was
+%   reimplemented using a toks register, to prevent using up the string
+%   pool; that's when |#3| was introduced.
 % \end{itemize}
 %    \begin{macrocode}
-\def\forest at processprojectioninfo#1#2{%
+\def\forest at processprojectioninfo#1#2#3{%
   \edef\forest at ppi@inputprefix{#1}%
 %    \end{macrocode}
 % Loop (counter |\c at pgf@counta|) through the sorted array of raw data.
@@ -8867,7 +8876,7 @@
       \csdef{#2\the\c at pgf@countb @n}{0}%
     \fi
 %    \end{macrocode}
-% If the projection is actually a projection of one a point in our path:
+% If the projection is actually a projection of one point in our path (it will not be when this macro is called from |\forest at distance@between at edge@paths|):
 %    \begin{macrocode}
     % todo: this is ugly!
     \ifdefined\forest at xo\ifx\forest at xo\relax\else
@@ -8883,12 +8892,13 @@
 % Put a new item in the dictionary: key = the original point, value =
 % the projection index.
 %    \begin{macrocode}
-        \csedef{#2(\forest at xo,\forest at yo)}{\the\c at pgf@countb}%
+        \eapptotoks#3{(\forest at xo,\forest at yo){\the\c at pgf@countb}}%
       \fi\fi
     \fi\fi
 %    \end{macrocode}
 % Clean-up the raw array item.
 %    \begin{macrocode}
+    % todo: is this really necessary? (yes: see the "ugly" thing above)
     \cslet{#1\the\c at pgf@counta xo}\relax
     \cslet{#1\the\c at pgf@counta yo}\relax
     \cslet{#1\the\c at pgf@counta xp}\relax
@@ -8898,6 +8908,7 @@
 %    \end{macrocode}
 % Clean up the raw array length.
 %    \begin{macrocode}
+  % todo: is this really necessary?
   \cslet{#1n}\relax
 %    \end{macrocode}
 % Store the length of the outer result array.
@@ -8907,7 +8918,7 @@
 }
 %    \end{macrocode}
 %    
-% Item-exchange macro for quicksorting the raw projection data. (|#1|
+% Item-exchange macro for sorting the raw projection data. (|#1|
 % is copied into |#2|.)
 %    \begin{macrocode}
 \def\forest at ppiraw@let#1#2{%
@@ -8917,7 +8928,7 @@
   \csletcs{\forest at ppi@inputprefix#1yp}{\forest at ppi@inputprefix#2yp}%
 }
 %    \end{macrocode}
-% Item comparision macro for quicksorting the raw projection data.
+% Item comparision macro for sorting the raw projection data.
 %    \begin{macrocode}
 \def\forest at ppiraw@cmp#1#2{%
   \forest at sort@cmptwodimcs
@@ -8943,7 +8954,7 @@
 % \subsection{Break path}
 %
 % The following macro computes from the given path (|#1|) a ``broken''
-% path (|#3|) that contains the same points of the plane, but has
+% path (|#4|) that contains the same points of the plane, but has
 % potentially more segments, so that, for every point from a given set
 % of points on the grow line, a line through this point perpendicular
 % to the grow line intersects the broken path only at its edge
@@ -8952,17 +8963,19 @@
 % The macro works only for \emph{simple} paths, i.e.\ paths built
 % using only move-to and line-to operations.  Furthermore,
 % |\forest at processprojectioninfo| must be called before calling
-% |\forest at breakpath|: we expect information with prefix |#2|.  The
-% macro updates the information compiled by
-% |\forest at processprojectioninfo| with information about points added
-% by path-breaking.
+% |\forest at breakpath|: we expect information in an array with prefix
+% |#2| (projections and (an inner array of) their original points)
+% and toks register |#3| (a ``dictionary'': for each original points,
+% the index of its projection in |#2|).  The macro updates array |#2|.
+% (No need to update |#3|, as it is not used anymore.)
 %    \begin{macrocode}
-\def\forest at breakpath#1#2#3{%
+\def\forest at breakpath#1#2#3#4{%
 %    \end{macrocode}
 % Store the current path in a macro and empty it, then process the
 % stored path. The processing creates a new current path.
 %    \begin{macrocode}
   \edef\forest at bp@prefix{#2}%
+  \let\forest at breakpath@toks#3%
   \forest at save@pgfsyssoftpath at tokendefs
   \let\pgfsyssoftpath at movetotoken\forest at breakpath@processfirstpoint
   \let\pgfsyssoftpath at linetotoken\forest at breakpath@processfirstpoint
@@ -8969,7 +8982,7 @@
   %\pgfusepath{}% empty the current path. ok?
   #1%
   \forest at restore@pgfsyssoftpath at tokendefs
-  \pgfsyssoftpath at getcurrentpath#3%
+  \pgfsyssoftpath at getcurrentpath#4%
 }
 %    \end{macrocode}
 % The original and the broken path start in the same way. (This code
@@ -8991,13 +9004,18 @@
   \pgfsyssoftpath at moveto{#1}{#2}%
   \def\forest at previous@x{#1}%
   \def\forest at previous@y{#2}%
-  \expandafter\let\expandafter\forest at previous@i
-    \csname\forest at bp@prefix(#1,#2)\endcsname
+  \forest at breakpath@getfromtoks\forest at breakpath@toks\forest at previous@i{#1}{#2}%
   \expandafter\let\expandafter\forest at previous@px
     \csname\forest at bp@prefix\forest at previous@i x\endcsname
   \expandafter\let\expandafter\forest at previous@py
     \csname\forest at bp@prefix\forest at previous@i y\endcsname
 }
+\def\forest at breakpath@getfromtoks#1#2#3#4{%
+  % #1=cache toks register, #2=receiving cs, (#3,#4)=point;
+  % we rely on the fact that the point we're looking up should always be present
+  \def\forest at breakpath@getfromtoks@##1(#3,#4)##2##3\forest at END{##2}%
+  \edef#2{\expandafter\forest at breakpath@getfromtoks@\the#1\forest at END}%
+}
 %    \end{macrocode}
 %    
 % This is the heart of the path-breaking procedure.
@@ -9012,8 +9030,7 @@
 % Get the index of the current point's projection and the projection
 % itself.  (The point dictionary is used here.)
 %    \begin{macrocode}
-  \expandafter\let\expandafter\forest at i
-    \csname\forest at bp@prefix(#1,#2)\endcsname
+  \forest at breakpath@getfromtoks\forest at breakpath@toks\forest at i{#1}{#2}%
   \expandafter\let\expandafter\forest at px
     \csname\forest at bp@prefix\forest at i x\endcsname
   \expandafter\let\expandafter\forest at py
@@ -9084,10 +9101,6 @@
       \forest at append@point at to@inner at array
         \forest at last@x\forest at last@y
         {\forest at bp@prefix\the\forest at temp@count @}%
-%    \end{macrocode}
-% Cache the projection of the new segment edge.
-%    \begin{macrocode}
-      \csedef{\forest at bp@prefix(\the\pgf at x,\the\pgf at y)}{\the\forest at temp@count}%
     \saferepeat
   \fi
 %    \end{macrocode}
@@ -9118,7 +9131,7 @@
 %
 % Imagine an infinitely long light source parallel to the grow line,
 % on the grow line's negative/positive side.\footnote{For the
-% definition of negative/positive side, see forest at distancetogrowline
+% definition of negative/positive side, see {\tt\string\forest at distancetogrowline}
 % in \S\ref{imp:projections}} Furthermore imagine that the path is
 % opaque. Then the negative/positive tight edge of the path is the
 % part of the path that is illuminated.
@@ -9144,6 +9157,8 @@
   }%
   \let#3\forest at gep@global at edge
 }
+\newtoks\forest at pi@toks
+\newtoks\forest at segment@toks
 \def\forest at get@one at tightedgeofpath#1#2#3{%
 %    \end{macrocode}
 % Project the path to the grow line and compile some useful information.
@@ -9150,16 +9165,16 @@
 %    \begin{macrocode}
   \forest at projectpathtogrowline#1{forest at pp@}%
   \forest at sortprojections{forest at pp@}%
-  \forest at processprojectioninfo{forest at pp@}{forest at pi@}%
+  \forest at processprojectioninfo{forest at pp@}{forest at pi@}\forest at pi@toks
 %    \end{macrocode}
 % Break the path.
 %    \begin{macrocode}
-  \forest at breakpath#1{forest at pi@}\forest at brokenpath
+  \forest at breakpath#1{forest at pi@}\forest at pi@toks\forest at brokenpath
 %    \end{macrocode}
 % Compile some more useful information.
 %    \begin{macrocode}
   \forest at sort@inner at arrays{forest at pi@}#2%
-  \forest at pathtodict\forest at brokenpath{forest at pi@}%
+  \forest at pathtodict\forest at brokenpath\forest at segment@toks
 %    \end{macrocode}
 % The auxiliary data is set up: do the work!
 %    \begin{macrocode}
@@ -9253,16 +9268,13 @@
 %    \end{macrocode}
 %    
 % Put path segments into a ``segment dictionary'': for each segment of
-% the path from $(x_1,y_1)$ to $(x_2,y_2)$ let
-% |\forest@(x1,y1)--(x2,y2)| be |\forest at inpath| (which can be
-% anything but |\relax|).
+% the pgf path (given in |#1|) from $(x_1,y_1)$ to $(x_2,y_2)$ we put 
+% |(x1,y1)--(x2,y2)| into toks |#2|.  (The ``dictionary'' was
+% reimplemented in v2.1.4. It's based on a toks register now, we search using
+% |\pgfutil at in@|.)
 %    \begin{macrocode}
-\let\forest at inpath\advance
-%    \end{macrocode}
-% This macro is just a wrapper to process the path.
-%    \begin{macrocode}
 \def\forest at pathtodict#1#2{%
-  \edef\forest at pathtodict@prefix{#2}%
+  \let\forest at pathtodict@toks#2%
   \forest at save@pgfsyssoftpath at tokendefs
   \let\pgfsyssoftpath at movetotoken\forest at pathtodict@movetoop
   \let\pgfsyssoftpath at linetotoken\forest at pathtodict@linetoop
@@ -9274,34 +9286,13 @@
 % When a move-to operation is encountered:
 %    \begin{macrocode}
 \def\forest at pathtodict@movetoop#1#2{%
-%    \end{macrocode}
-% If a subpath had just started, it was a degenerate one (a point). No
-% need to store that (i.e.\ no code would use this information).  So,
-% just remember that a new subpath has started.
-%    \begin{macrocode}
-  \def\forest at pathtodict@subpathstart{(#1,#2)-}%
+  \apptotoks\forest at pathtodict@toks{(#1,#2)}%
 }
 %    \end{macrocode}
 % When a line-to operation is encountered:
 %    \begin{macrocode}
 \def\forest at pathtodict@linetoop#1#2{%
-%    \end{macrocode}
-% If the subpath has just started, its start is also the start of the
-% current segment.
-%    \begin{macrocode}
-\if\relax\forest at pathtodict@subpathstart\relax\else
-    \let\forest at pathtodict@from\forest at pathtodict@subpathstart
-  \fi  
-%    \end{macrocode}
-% Mark the segment as existing.
-%    \begin{macrocode}
-  \expandafter\let\csname\forest at pathtodict@prefix\forest at pathtodict@from-(#1,#2)\endcsname\forest at inpath
-%    \end{macrocode}
-% Set the start of the next segment to the current point, and mark
-% that we are in the middle of a subpath.
-%    \begin{macrocode}
-  \def\forest at pathtodict@from{(#1,#2)-}%
-  \def\forest at pathtodict@subpathstart{}%
+  \apptotoks\forest at pathtodict@toks{--(#1,#2)}%
 }
 %    \end{macrocode}
 %    
@@ -9395,25 +9386,28 @@
 % write a macro computing its boundary, make sure that the computed
 % boundary path is non-self-intersecting!
 %    \begin{macrocode}
-          \forest at tempfalse
-          \expandafter\ifx\csname forest at pi@(%
-            \csname forest at pi@\the\c at pgf@counta @\the\c at pgf@countb x\endcsname,%
+          \edef\forest at temp{%
+            (\csname forest at pi@\the\c at pgf@counta @\the\c at pgf@countb x\endcsname,%
             \csname forest at pi@\the\c at pgf@counta @\the\c at pgf@countb y\endcsname)--(%
             \csname forest at pi@\forest at aplusone @\the\c at pgf@countc x\endcsname,%
             \csname forest at pi@\forest at aplusone @\the\c at pgf@countc y\endcsname)%
-            \endcsname\forest at inpath
-            \forest at temptrue
+          }%
+          \expandafter\expandafter\expandafter\pgfutil at in@\expandafter\expandafter\expandafter
+            {\expandafter\forest at temp\expandafter}\expandafter
+            {\the\forest at segment@toks}%
+          \ifpgfutil at in@
           \else
-            \expandafter\ifx\csname forest at pi@(%
-              \csname forest at pi@\forest at aplusone @\the\c at pgf@countc x\endcsname,%
+            \edef\forest at temp{%
+              (\csname forest at pi@\forest at aplusone @\the\c at pgf@countc x\endcsname,%
               \csname forest at pi@\forest at aplusone @\the\c at pgf@countc y\endcsname)--(%
               \csname forest at pi@\the\c at pgf@counta @\the\c at pgf@countb x\endcsname,%
               \csname forest at pi@\the\c at pgf@counta @\the\c at pgf@countb y\endcsname)%
-              \endcsname\forest at inpath
-              \forest at temptrue
-            \fi
+            }%
+            \expandafter\expandafter\expandafter\pgfutil at in@\expandafter\expandafter\expandafter
+              {\expandafter\forest at temp\expandafter}\expandafter
+              {\the\forest at segment@toks}%
           \fi
-          \ifforest at temp
+          \ifpgfutil at in@
 %    \end{macrocode}
 % We have found the segment with the minimal/maximal distance to the
 % grow line. So let's add it to the edge path.
@@ -9647,7 +9641,10 @@
 % Another crucial part of the package.
 %
 %    \begin{macrocode}
+\newtoks\forest at PIi@toks
+\newtoks\forest at PIii@toks
 \def\forest at distance@between at edge@paths#1#2#3{%
+  \begingroup
   % #1, #2 = (edge) paths
   %
   % project paths
@@ -9659,11 +9656,11 @@
     {forest at p1@}{forest at p2@}%
     {forest at P1@}{forest at P2@}%
   % process projections
-  \forest at processprojectioninfo{forest at P1@}{forest at PI1@}%
-  \forest at processprojectioninfo{forest at P2@}{forest at PI2@}%
+  \forest at processprojectioninfo{forest at P1@}{forest at PI1@}\forest at PIi@toks
+  \forest at processprojectioninfo{forest at P2@}{forest at PI2@}\forest at PIii@toks
   % break paths
-  \forest at breakpath#1{forest at PI1@}\forest at broken@one
-  \forest at breakpath#2{forest at PI2@}\forest at broken@two
+  \forest at breakpath#1{forest at PI1@}\forest at PIi@toks\forest at broken@one
+  \forest at breakpath#2{forest at PI2@}\forest at PIii@toks\forest at broken@two
   % sort inner arrays ---optimize: it's enough to find max and min
   \forest at sort@inner at arrays{forest at PI1@}\forest at sort@descending
   \forest at sort@inner at arrays{forest at PI2@}\forest at sort@ascending
@@ -9687,7 +9684,9 @@
     \fi
     \advance\c at pgf@countc 1
   \forest at repeat
-  \let#3\forest at distance
+  \global\let\forest at global@temp\forest at distance
+  \endgroup
+  \let#3\forest at global@temp
 }
   % merge projections: we need two projection arrays, both containing
   % projection points from both paths, but each with the original

Modified: trunk/Master/texmf-dist/tex/latex/forest/forest.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/forest/forest.sty	2017-02-03 21:33:11 UTC (rev 43128)
+++ trunk/Master/texmf-dist/tex/latex/forest/forest.sty	2017-02-04 00:23:35 UTC (rev 43129)
@@ -44,7 +44,7 @@
 %% - LICENCE
 %% To use the package, only the files marked with + need to be installed.
 %%
-\ProvidesPackage{forest}[2017/01/27 v2.1.3 Drawing (linguistic) trees]
+\ProvidesPackage{forest}[2017/02/02 v2.1.4 Drawing (linguistic) trees]
 
 \RequirePackage{tikz}[2013/12/13]
 \usetikzlibrary{shapes}
@@ -2342,8 +2342,8 @@
   \expandafter\endgroup
   \expandafter\edef\expandafter#2\expandafter{\forest at temp@message}%
 }
-\NewDocumentCommand\forestdebugtypeouttree{o m}{%
-  \forestdebug at typeouttree{#1}\forest at temp
+\NewDocumentCommand\forestdebugtypeouttree{d() O{\forest at cn}}{%
+  \forestdebug at typeouttree{#2}\forest at temp
   \typeout{\IfValueTF{#1}{#1: }{}\forest at temp}%
 }
 \def\forestdebug at typeouttree@build{%
@@ -4361,10 +4361,10 @@
   {#2}%
 }
 \def\forest at aggregate@count#1{\forest at aggregate
-  {\def\forestmathresult{1}}%
-  {\def\forestmathresult{1}}%
-  {\edef\forestmathresult{\the\numexpr\forestregister{aggregate result}+1}}%
-  {\forestrget{aggregate result}\forestmathresult}%
+  {\def\forestmathresult{0}\let\forestmathresulttype\forestmathtype at count}%
+  {\def\forestmathresult{1}\let\forestmathresulttype\forestmathtype at count}%
+  {\edef\forestmathresult{\the\numexpr\forestregister{aggregate result}+1}\let\forestmathresulttype\forestmathtype at count}%
+  {\forestrget{aggregate result}\forestmathresult\let\forestmathresulttype\forestmathtype at count}%
   {#1}%
 }
 \def\forest at aggregate@average#1#2{\forest at aggregate
@@ -6320,11 +6320,18 @@
   \forest at patch@enormouscoordinateboxbounds at minus\pgfpositionnodelatermaxx
   \forest at patch@enormouscoordinateboxbounds at minus\pgfpositionnodelatermaxy
   % end of patch
-  \xappto\forest at smuggle{\noexpand\forestoset{min x}{\pgfpositionnodelaterminx}}%
-  \xappto\forest at smuggle{\noexpand\forestoset{min y}{\pgfpositionnodelaterminy}}%
-  \xappto\forest at smuggle{\noexpand\forestoset{max x}{\pgfpositionnodelatermaxx}}%
-  \xappto\forest at smuggle{\noexpand\forestoset{max y}{\pgfpositionnodelatermaxy}}%
+  % when shape=coordinate, pgf returns \pgfpositionnodelater... with wrong catcode of pt
+  \forest at pnn@addtosmuggle{min x}\pgfpositionnodelaterminx
+  \forest at pnn@addtosmuggle{max x}\pgfpositionnodelatermaxx
+  \forest at pnn@addtosmuggle{min y}\pgfpositionnodelaterminy
+  \forest at pnn@addtosmuggle{max y}\pgfpositionnodelatermaxy
 }
+\def\forest at pnn@addtosmuggle#1#2{%
+  {%
+    \pgfutil at tempdima=#2\relax
+    \xappto\forest at smuggle{\noexpand\forestoset{#1}{\the\pgfutil at tempdima}}%
+  }%
+}
 \def\forest at node@forest at positionnodelater@restore{%
   \ifforest at drawtree@preservenodeboxes@
     \let\forest at boxorcopy\copy
@@ -7703,7 +7710,7 @@
   \advance\c at pgf@counta -1
   \forest at sort\forest at ppiraw@cmp\forest at ppiraw@let\forest at sort@ascending{0}{\the\c at pgf@counta}%
 }
-\def\forest at processprojectioninfo#1#2{%
+\def\forest at processprojectioninfo#1#2#3{%
   \edef\forest at ppi@inputprefix{#1}%
   \c at pgf@counta=0
   \c at pgf@countb=-1
@@ -7735,9 +7742,10 @@
         \forest at append@point at to@inner at array
           \forest at xo\forest at yo
           {#2\the\c at pgf@countb @}%
-        \csedef{#2(\forest at xo,\forest at yo)}{\the\c at pgf@countb}%
+        \eapptotoks#3{(\forest at xo,\forest at yo){\the\c at pgf@countb}}%
       \fi\fi
     \fi\fi
+    % todo: is this really necessary? (yes: see the "ugly" thing above)
     \cslet{#1\the\c at pgf@counta xo}\relax
     \cslet{#1\the\c at pgf@counta yo}\relax
     \cslet{#1\the\c at pgf@counta xp}\relax
@@ -7744,6 +7752,7 @@
     \cslet{#1\the\c at pgf@counta yp}\relax
     \advance\c at pgf@counta 1
   \saferepeat
+  % todo: is this really necessary?
   \cslet{#1n}\relax
   \advance\c at pgf@countb 1
   \csedef{#2n}{\the\c at pgf@countb}%
@@ -7768,8 +7777,9 @@
   \advance\c at pgf@countc 1
   \csedef{#3n}{\the\c at pgf@countc}%
 }
-\def\forest at breakpath#1#2#3{%
+\def\forest at breakpath#1#2#3#4{%
   \edef\forest at bp@prefix{#2}%
+  \let\forest at breakpath@toks#3%
   \forest at save@pgfsyssoftpath at tokendefs
   \let\pgfsyssoftpath at movetotoken\forest at breakpath@processfirstpoint
   \let\pgfsyssoftpath at linetotoken\forest at breakpath@processfirstpoint
@@ -7776,7 +7786,7 @@
   %\pgfusepath{}% empty the current path. ok?
   #1%
   \forest at restore@pgfsyssoftpath at tokendefs
-  \pgfsyssoftpath at getcurrentpath#3%
+  \pgfsyssoftpath at getcurrentpath#4%
 }
 \def\forest at breakpath@processfirstpoint#1#2{%
   \forest at breakpath@processmoveto{#1}{#2}%
@@ -7787,17 +7797,21 @@
   \pgfsyssoftpath at moveto{#1}{#2}%
   \def\forest at previous@x{#1}%
   \def\forest at previous@y{#2}%
-  \expandafter\let\expandafter\forest at previous@i
-    \csname\forest at bp@prefix(#1,#2)\endcsname
+  \forest at breakpath@getfromtoks\forest at breakpath@toks\forest at previous@i{#1}{#2}%
   \expandafter\let\expandafter\forest at previous@px
     \csname\forest at bp@prefix\forest at previous@i x\endcsname
   \expandafter\let\expandafter\forest at previous@py
     \csname\forest at bp@prefix\forest at previous@i y\endcsname
 }
+\def\forest at breakpath@getfromtoks#1#2#3#4{%
+  % #1=cache toks register, #2=receiving cs, (#3,#4)=point;
+  % we rely on the fact that the point we're looking up should always be present
+  \def\forest at breakpath@getfromtoks@##1(#3,#4)##2##3\forest at END{##2}%
+  \edef#2{\expandafter\forest at breakpath@getfromtoks@\the#1\forest at END}%
+}
 \def\forest at breakpath@processlineto#1#2{%
   \let\forest at breakpath@op\pgfsyssoftpath at lineto
-  \expandafter\let\expandafter\forest at i
-    \csname\forest at bp@prefix(#1,#2)\endcsname
+  \forest at breakpath@getfromtoks\forest at breakpath@toks\forest at i{#1}{#2}%
   \expandafter\let\expandafter\forest at px
     \csname\forest at bp@prefix\forest at i x\endcsname
   \expandafter\let\expandafter\forest at py
@@ -7838,7 +7852,6 @@
       \forest at append@point at to@inner at array
         \forest at last@x\forest at last@y
         {\forest at bp@prefix\the\forest at temp@count @}%
-      \csedef{\forest at bp@prefix(\the\pgf at x,\the\pgf at y)}{\the\forest at temp@count}%
     \saferepeat
   \fi
   \forest at breakpath@op{#1}{#2}%
@@ -7860,13 +7873,15 @@
   }%
   \let#3\forest at gep@global at edge
 }
+\newtoks\forest at pi@toks
+\newtoks\forest at segment@toks
 \def\forest at get@one at tightedgeofpath#1#2#3{%
   \forest at projectpathtogrowline#1{forest at pp@}%
   \forest at sortprojections{forest at pp@}%
-  \forest at processprojectioninfo{forest at pp@}{forest at pi@}%
-  \forest at breakpath#1{forest at pi@}\forest at brokenpath
+  \forest at processprojectioninfo{forest at pp@}{forest at pi@}\forest at pi@toks
+  \forest at breakpath#1{forest at pi@}\forest at pi@toks\forest at brokenpath
   \forest at sort@inner at arrays{forest at pi@}#2%
-  \forest at pathtodict\forest at brokenpath{forest at pi@}%
+  \forest at pathtodict\forest at brokenpath\forest at segment@toks
   \forest at gettightedgeofpath@getedge\forest at edge
   \forest at simplifypath\forest at edge#3%
 }
@@ -7916,9 +7931,8 @@
     \noexpand\forest at sort@cmpdimcs{#1##1d}{#1##2d}%
   }%
 }
-\let\forest at inpath\advance
 \def\forest at pathtodict#1#2{%
-  \edef\forest at pathtodict@prefix{#2}%
+  \let\forest at pathtodict@toks#2%
   \forest at save@pgfsyssoftpath at tokendefs
   \let\pgfsyssoftpath at movetotoken\forest at pathtodict@movetoop
   \let\pgfsyssoftpath at linetotoken\forest at pathtodict@linetoop
@@ -7927,15 +7941,10 @@
   \forest at restore@pgfsyssoftpath at tokendefs
 }
 \def\forest at pathtodict@movetoop#1#2{%
-  \def\forest at pathtodict@subpathstart{(#1,#2)-}%
+  \apptotoks\forest at pathtodict@toks{(#1,#2)}%
 }
 \def\forest at pathtodict@linetoop#1#2{%
-\if\relax\forest at pathtodict@subpathstart\relax\else
-    \let\forest at pathtodict@from\forest at pathtodict@subpathstart
-  \fi
-  \expandafter\let\csname\forest at pathtodict@prefix\forest at pathtodict@from-(#1,#2)\endcsname\forest at inpath
-  \def\forest at pathtodict@from{(#1,#2)-}%
-  \def\forest at pathtodict@subpathstart{}%
+  \apptotoks\forest at pathtodict@toks{--(#1,#2)}%
 }
 \def\forest at gettightedgeofpath@getedge#1{% cs to store the edge into
   \pgfsyssoftpath at setcurrentpath\pgfutil at empty
@@ -7975,25 +7984,28 @@
         \advance\c at pgf@counta -1
         \safeloop
         \ifnum\c at pgf@countc<\csname forest at pi@\forest at aplusone @n\endcsname\relax
-          \forest at tempfalse
-          \expandafter\ifx\csname forest at pi@(%
-            \csname forest at pi@\the\c at pgf@counta @\the\c at pgf@countb x\endcsname,%
+          \edef\forest at temp{%
+            (\csname forest at pi@\the\c at pgf@counta @\the\c at pgf@countb x\endcsname,%
             \csname forest at pi@\the\c at pgf@counta @\the\c at pgf@countb y\endcsname)--(%
             \csname forest at pi@\forest at aplusone @\the\c at pgf@countc x\endcsname,%
             \csname forest at pi@\forest at aplusone @\the\c at pgf@countc y\endcsname)%
-            \endcsname\forest at inpath
-            \forest at temptrue
+          }%
+          \expandafter\expandafter\expandafter\pgfutil at in@\expandafter\expandafter\expandafter
+            {\expandafter\forest at temp\expandafter}\expandafter
+            {\the\forest at segment@toks}%
+          \ifpgfutil at in@
           \else
-            \expandafter\ifx\csname forest at pi@(%
-              \csname forest at pi@\forest at aplusone @\the\c at pgf@countc x\endcsname,%
+            \edef\forest at temp{%
+              (\csname forest at pi@\forest at aplusone @\the\c at pgf@countc x\endcsname,%
               \csname forest at pi@\forest at aplusone @\the\c at pgf@countc y\endcsname)--(%
               \csname forest at pi@\the\c at pgf@counta @\the\c at pgf@countb x\endcsname,%
               \csname forest at pi@\the\c at pgf@counta @\the\c at pgf@countb y\endcsname)%
-              \endcsname\forest at inpath
-              \forest at temptrue
-            \fi
+            }%
+            \expandafter\expandafter\expandafter\pgfutil at in@\expandafter\expandafter\expandafter
+              {\expandafter\forest at temp\expandafter}\expandafter
+              {\the\forest at segment@toks}%
           \fi
-          \ifforest at temp
+          \ifpgfutil at in@
             \forest at gettightedgeofpath@maybemoveto{\the\c at pgf@counta}{\the\c at pgf@countb}%
             \edef\forest at last@x{%
               \csname forest at pi@\forest at aplusone @\the\c at pgf@countc x\endcsname}%
@@ -8150,7 +8162,10 @@
   }%
   \pgfsyssoftpath at getcurrentpath#3%
 }
+\newtoks\forest at PIi@toks
+\newtoks\forest at PIii@toks
 \def\forest at distance@between at edge@paths#1#2#3{%
+  \begingroup
   % #1, #2 = (edge) paths
   %
   % project paths
@@ -8162,11 +8177,11 @@
     {forest at p1@}{forest at p2@}%
     {forest at P1@}{forest at P2@}%
   % process projections
-  \forest at processprojectioninfo{forest at P1@}{forest at PI1@}%
-  \forest at processprojectioninfo{forest at P2@}{forest at PI2@}%
+  \forest at processprojectioninfo{forest at P1@}{forest at PI1@}\forest at PIi@toks
+  \forest at processprojectioninfo{forest at P2@}{forest at PI2@}\forest at PIii@toks
   % break paths
-  \forest at breakpath#1{forest at PI1@}\forest at broken@one
-  \forest at breakpath#2{forest at PI2@}\forest at broken@two
+  \forest at breakpath#1{forest at PI1@}\forest at PIi@toks\forest at broken@one
+  \forest at breakpath#2{forest at PI2@}\forest at PIii@toks\forest at broken@two
   % sort inner arrays ---optimize: it's enough to find max and min
   \forest at sort@inner at arrays{forest at PI1@}\forest at sort@descending
   \forest at sort@inner at arrays{forest at PI2@}\forest at sort@ascending
@@ -8190,7 +8205,9 @@
     \fi
     \advance\c at pgf@countc 1
   \forest at repeat
-  \let#3\forest at distance
+  \global\let\forest at global@temp\forest at distance
+  \endgroup
+  \let#3\forest at global@temp
 }
   % merge projections: we need two projection arrays, both containing
   % projection points from both paths, but each with the original

Modified: trunk/Master/tlpkg/bin/tlpkg-ctan-check
===================================================================
--- trunk/Master/tlpkg/bin/tlpkg-ctan-check	2017-02-03 21:33:11 UTC (rev 43128)
+++ trunk/Master/tlpkg/bin/tlpkg-ctan-check	2017-02-04 00:23:35 UTC (rev 43129)
@@ -766,6 +766,7 @@
   "texware",		# binary
   "texworks",		# binary
   "tie",		# binary
+  "tlaunch",		# w32 siep binary
   "ttfutils",		# binary
   "tpic2pdftex",	# ctan mirrors from us
   "updmap-map",		# autogenerated map files

Modified: trunk/Master/tlpkg/libexec/ctan2tds
===================================================================
--- trunk/Master/tlpkg/libexec/ctan2tds	2017-02-03 21:33:11 UTC (rev 43128)
+++ trunk/Master/tlpkg/libexec/ctan2tds	2017-02-04 00:23:35 UTC (rev 43129)
@@ -1103,6 +1103,7 @@
  'tkz-kiviat',  "&MAKEtkz",
  'tkz-linknodes',"&MAKEtkz",
  'tkz-tab',     "&MAKEtkz",
+ 'tlaunch',	"die 'skipping, siep installs by hand'",
  'tlg2latex',   "die 'skipping, not self-locating for default.py?'",
  'tolkienfonts',"die 'skipping, cannot easily separate free from nonfree fonts'",
  'tpcmfont',    "die 'skipping, ?'",



More information about the tex-live-commits mailing list