From fe52c4d4865ceba78cbad065cc6595ffd0423800 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Thu, 24 Dec 2009 18:43:43 +0000 Subject: new package tikz-qtree (23dec09) git-svn-id: svn://tug.org/texlive/trunk@16498 c570f23f-e606-0410-a88d-b1316a301751 --- .../texmf-dist/tex/latex/tikz-qtree/pgfsubpic.sty | 4 + .../texmf-dist/tex/latex/tikz-qtree/pgfsubpic.tex | 110 +++++++++++++ Master/texmf-dist/tex/latex/tikz-qtree/pgftree.sty | 6 + Master/texmf-dist/tex/latex/tikz-qtree/pgftree.tex | 119 +++++++++++++++ .../texmf-dist/tex/latex/tikz-qtree/tikz-qtree.sty | 4 + .../texmf-dist/tex/latex/tikz-qtree/tikz-qtree.tex | 170 +++++++++++++++++++++ 6 files changed, 413 insertions(+) create mode 100644 Master/texmf-dist/tex/latex/tikz-qtree/pgfsubpic.sty create mode 100644 Master/texmf-dist/tex/latex/tikz-qtree/pgfsubpic.tex create mode 100644 Master/texmf-dist/tex/latex/tikz-qtree/pgftree.sty create mode 100644 Master/texmf-dist/tex/latex/tikz-qtree/pgftree.tex create mode 100644 Master/texmf-dist/tex/latex/tikz-qtree/tikz-qtree.sty create mode 100644 Master/texmf-dist/tex/latex/tikz-qtree/tikz-qtree.tex (limited to 'Master/texmf-dist/tex/latex/tikz-qtree') diff --git a/Master/texmf-dist/tex/latex/tikz-qtree/pgfsubpic.sty b/Master/texmf-dist/tex/latex/tikz-qtree/pgfsubpic.sty new file mode 100644 index 00000000000..500470afc4c --- /dev/null +++ b/Master/texmf-dist/tex/latex/tikz-qtree/pgfsubpic.sty @@ -0,0 +1,4 @@ +\RequirePackage{pgf} + +\input{pgfsubpic.tex} +\endinput diff --git a/Master/texmf-dist/tex/latex/tikz-qtree/pgfsubpic.tex b/Master/texmf-dist/tex/latex/tikz-qtree/pgfsubpic.tex new file mode 100644 index 00000000000..928ae336e95 --- /dev/null +++ b/Master/texmf-dist/tex/latex/tikz-qtree/pgfsubpic.tex @@ -0,0 +1,110 @@ +% pgfsubpic.tex +% Version 1, 22 Dec 2009 + +% Copyright 2009 by David Chiang + +% This program is free software; you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation; either version 2 of the License, or +% (at your option) any later version. + +% This program is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. + +% You should have received a copy of the GNU General Public License along +% with this program; if not, write to the Free Software Foundation, Inc., +% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +\newdimen\pgf@subpicminx +\newdimen\pgf@subpicminy +\newdimen\pgf@subpicmaxx +\newdimen\pgf@subpicmaxy + +% Special virtual node for current subpicture's bounding box +\expandafter\def\csname pgf@sh@ns@current subpicture\endcsname{rectangle} +\expandafter\def\csname pgf@sh@np@current subpicture\endcsname{% + \def\southwest{\pgfqpoint{\pgf@subpicminx}{\pgf@subpicminy}}% + \def\northeast{\pgfqpoint{\pgf@subpicmaxx}{\pgf@subpicmaxy}}% +} +\expandafter\def\csname pgf@sh@nt@current subpicture\endcsname{{1}{0}{0}{1}{0pt}{0pt}} +\expandafter\def\csname pgf@sh@pi@current subpicture\endcsname{\pgfpictureid} + +% Create a pgfpicture inside an hbox for delayed placement +\def\pgfsubpicture{% +\global\setbox\pgf@hbox=\hbox\bgroup +\pgfinterruptpicture% +\pgfpicture% +} + +\def\endpgfsubpicture{ +\global\pgf@subpicminx=\pgf@picminx +\global\pgf@subpicminy=\pgf@picminy +\global\pgf@subpicmaxx=\pgf@picmaxx +\global\pgf@subpicmaxy=\pgf@picmaxy +\global\edef\subpictureid{\pgfpictureid}% +\pgfsetbaseline{\pgf@picminy}% +\endpgfpicture% +\endpgfinterruptpicture% +\egroup +} + +% Place a previously-created subpicture, lining up its origin with the current origin +\def\pgfplacesubpicture{ +\pgfscope +% expand current bounding box to accommodate subpicture +\pgfpathmoveto{\pgfpoint{\the\pgf@subpicminx}{\the\pgf@subpicminy}}% +\pgfpathlineto{\pgfpoint{\the\pgf@subpicmaxx}{\the\pgf@subpicmaxy}}% +\pgfusepath{use as bounding box}% +% save relative position of subpicture inside containing picture +\pgfpointorigin +\pgf@pos@transform{\pgf@x}{\pgf@y}% +\expandafter\xdef\csname pgf@subpic@\subpictureid @x\endcsname{\the\pgf@x}% +\expandafter\xdef\csname pgf@subpic@\subpictureid @y\endcsname{\the\pgf@y}% +\expandafter\xdef\csname pgf@subpic@\subpictureid @p\endcsname{\pgfpictureid}% +% align origin of subpicture with origin +\pgftransformshift{\pgfpoint{\the\pgf@subpicminx}{\the\pgf@subpicminy}}% +\pgfqboxsynced{\pgf@hbox}% +\endpgfscope +} + +% Hook onto existing macro \pgf@shape@interpictureshift. +% This is called whenever we look up an anchor of a node. +% This hook recursively checks to see if the node's picture +% is a subpicture of another, and if so, adjusts its position accordingly. +\let\orig@pgf@shape@interpictureshift\pgf@shape@interpictureshift +\def\unwind@subpic#1{% +% is #1 the current picture? +\edef\subpicid{#1}% +\ifx\subpicid\pgfpictureid +% yes, we're done +\else +% does #1 have a parent picture? +\expandafter\ifx\csname pgf@subpic@#1@p\endcsname\relax +% no, the original node was not inside the current picture +\fallback +\else +% yes, apply shift and move up to parent picture +\global\advance\pgf@x by \csname pgf@subpic@#1@x\endcsname +\global\advance\pgf@y by \csname pgf@subpic@#1@y\endcsname +\unwind@subpic{\csname pgf@subpic@#1@p\endcsname}% +\fi +\fi +} +\def\pgf@shape@interpictureshift#1{% +\edef\fallback{\pgf@x=\the\pgf@x\pgf@y=\the\pgf@y\noexpand\orig@pgf@shape@interpictureshift{#1}}% +\unwind@subpic{\csname pgf@sh@pi@#1\endcsname}% +} + +\def\pgfnodedelete#1{% +\expandafter\global\expandafter\let\csname pgf@sh@ns@#1\endcsname\relax +\expandafter\global\expandafter\let\csname pgf@sh@np@#1\endcsname\relax +\expandafter\global\expandafter\let\csname pgf@sh@nt@#1\endcsname\relax +\expandafter\global\expandafter\let\csname pgf@sh@pi@#1\endcsname\relax +\expandafter\global\expandafter\let\csname pgf@sh@ma@#1\endcsname\relax +} + +\def\pgfnodeifexists#1#2#3{% +\expandafter\ifx\csname pgf@sh@ns@#1\endcsname\relax#3\else#2\fi +} diff --git a/Master/texmf-dist/tex/latex/tikz-qtree/pgftree.sty b/Master/texmf-dist/tex/latex/tikz-qtree/pgftree.sty new file mode 100644 index 00000000000..1c30ea4f8c5 --- /dev/null +++ b/Master/texmf-dist/tex/latex/tikz-qtree/pgftree.sty @@ -0,0 +1,6 @@ +\RequirePackage{pgf} +\RequirePackage{pgffor} +\RequirePackage{pgfsubpic} + +\input{pgftree.tex} +\endinput diff --git a/Master/texmf-dist/tex/latex/tikz-qtree/pgftree.tex b/Master/texmf-dist/tex/latex/tikz-qtree/pgftree.tex new file mode 100644 index 00000000000..4cdaad16433 --- /dev/null +++ b/Master/texmf-dist/tex/latex/tikz-qtree/pgftree.tex @@ -0,0 +1,119 @@ +% pgftree.tex +% Version 1, 22 Dec 2009 + +% Copyright 2009 by David Chiang + +% This program is free software; you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation; either version 2 of the License, or +% (at your option) any later version. + +% This program is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. + +% You should have received a copy of the GNU General Public License along +% with this program; if not, write to the Free Software Foundation, Inc., +% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +% to do: +% if \nodename does not exist as desired, wrap inside a rectangle node +% don't use pgfsubpic internals, use anchors instead + +\newdimen\levelsep \levelsep=30pt +\newdimen\subtreesep \subtreesep=2pt +\newif\ifrighttoleft +\newif\ifupsidedown +\def\drawnode#1{\pgfnode{rectangle}{base}{#1}{\nodename}{\pgfusepath{discard}}} +\def\drawedge{% +\pgfpathmoveto{\pgfpointanchor{\parentnodename}{\ifupsidedown north\else south\fi}}% +\pgfpathlineto{\pgfpointanchor{\nodename}{\ifupsidedown south\else north\fi}}% +\pgfusepath{stroke}} + +% local variables that we need to assign to inside a \pgfforeach +\newdimen\pgftree@childx +\newdimen\pgftree@savechildx +\newcount\pgftree@childi +\newcount\pgftree@savechildi + +\def\nodename{r} + +%%% \pgftree{root}{subtrees} + +% The first argument draws the root node using PGF/TikZ commands. +% The node must be named \nodename. + +% The second argument is an even-length sequence of tokens. +% Token 2n-1 in the sequence draws the nth edge. It should draw an edge from \parentnodename to \nodename. +% Token 2n in the sequence draws the nth subtree. Its root must be named \nodename. + +\def\pgftree#1#2{% +\pgfscope +% create root node +#1 +\let\parentnodename\nodename +\ifupsidedown +\pgftransformshift{\pgfpoint{0}{\levelsep}}% +\else +\pgftransformshift{\pgfpoint{0}{-\levelsep}}% +\fi +\pgftree@savechildx=\pgftree@childx +\pgftree@savechildi=\pgftree@childi +\pgfsubpicture +\pgftree@childx=0pt% +\pgftree@childi=0% +{\process@children #2}% +\endpgfsubpicture +\ifnum\pgftree@childi>0% +% Center children so that parent is midway between origins of first and last children +\pgftransformshift{\pgfpointscale{-0.5}{\pgfpoint{\the\pgftree@childx}{0}}}% +\pgfplacesubpicture +% Draw the edges +\pgftree@childi=0% +{\process@edges #2}% +\fi +\global\pgftree@childi=\pgftree@savechildi +\global\pgftree@childx=\pgftree@savechildx +\endpgfscope +} + +\def\process@children{% +\pgfutil@ifnextchar\egroup +{% Step back to origin of last child +\advance\pgftree@childx by \ifrighttoleft-\pgf@subpicminx\else-\pgf@subpicmaxx\fi +\global\pgftree@childx=\pgftree@childx +\global\pgftree@childi=\pgftree@childi +}% +{\@process@children}% +} +\def\@process@children#1#2{% +\edef\nodename{\parentnodename-\the\pgftree@childi}% +\def\child{#2}% +\pgfsubpicture +#2% +\endpgfsubpicture +\ifnum\pgftree@childi>0% +\advance\pgftree@childx by \ifrighttoleft-\pgf@subpicmaxx\else-\pgf@subpicminx\fi +\advance\pgftree@childx by \ifrighttoleft-\subtreesep\else\subtreesep\fi +\fi +\pgfscope +\pgftransformshift{\pgfpoint{\the\pgftree@childx}{0}}% +\pgfplacesubpicture +\endpgfscope +\advance\pgftree@childx by \ifrighttoleft\pgf@subpicminx\else\pgf@subpicmaxx\fi +\advance\pgftree@childi by 1% +\process@children +} + +\def\process@edges{% +\pgfutil@ifnextchar\egroup +{}% +{\@process@edges}% +} +\def\@process@edges#1#2{% +\edef\nodename{\parentnodename-\the\pgftree@childi}% +#1% +\advance\pgftree@childi by 1% +\process@edges +} diff --git a/Master/texmf-dist/tex/latex/tikz-qtree/tikz-qtree.sty b/Master/texmf-dist/tex/latex/tikz-qtree/tikz-qtree.sty new file mode 100644 index 00000000000..8f572cdb8ee --- /dev/null +++ b/Master/texmf-dist/tex/latex/tikz-qtree/tikz-qtree.sty @@ -0,0 +1,4 @@ +\RequirePackage{tikz} +\RequirePackage{pgftree} +\input{tikz-qtree.tex} +\endinput diff --git a/Master/texmf-dist/tex/latex/tikz-qtree/tikz-qtree.tex b/Master/texmf-dist/tex/latex/tikz-qtree/tikz-qtree.tex new file mode 100644 index 00000000000..6114da8468b --- /dev/null +++ b/Master/texmf-dist/tex/latex/tikz-qtree/tikz-qtree.tex @@ -0,0 +1,170 @@ +% tikztree.tex +% Version 1, 22 Dec 2009 + +% Copyright (C) 2002, 2009 by David Chiang + +% This program is free software; you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation; either version 2 of the License, or +% (at your option) any later version. + +% This program is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. + +% You should have received a copy of the GNU General Public License along +% with this program; if not, write to the Free Software Foundation, Inc., +% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +%% These macros facilitate building up an object recursively before +%% putting it into the input stream. + +\newtoks\@result +\def\@call#1#2{\let\@cont=#2\bgroup\@result={}#1} +\def\@return{\global\@result=\@result\egroup\@cont} + +\def\@ifequal#1#2{\edef\testa{#1}\edef\testb{#2}\ifx\testa\testb} + +%% scan a tree: this just scans a subtree and then puts it onto the +%% input stream + +\def\Tree{\@call\@subtree\@Tree} +\def\@Tree{% +%\showthe\@result %debug +\ifpgfpicture\the\@result\else\tikzpicture\the\@result\endtikzpicture\fi % is there a test for tikzpicture? +} + +%% scan a subtree +\newtoks\child@list +\newtoks\root@node + +\def\@subtree[{% +\root@node={}% +\pgfutil@ifnextchar.{\@call\@interior\@@subtree}{\@@@subtree}} +\def\@@subtree{% +\root@node=\@result +\@@@subtree +} +\def\@@@subtree{% +\@call\@children\@@@@subtree +} +\def\@@@@subtree]{% +\child@list=\@result +\pgfutil@ifnextchar.{\@call\@interior\@@@@@subtree}{\@@@@@@subtree}} +\def\@@@@@subtree{% +%%% Check for mismatch. +\@ifequal{\the\root@node}{\pgfutil@empty}% + \root@node=\@result +\fi +\@ifequal{\the\root@node}{\the\@result}\else + \message{Warning: mismatched labels, \the\root@node{} and \the\@result.}% +\fi +\@@@@@@subtree +} +\def\@@@@@@subtree{% +\@ifequal{\the\root@node}{\pgfutil@empty} +\edef\act{\noexpand\@result={\noexpand\pgftree{\noexpand\path coordinate (\noexpand\nodename);}{\the\child@list}}}% +\else +\edef\act{\noexpand\@result={\noexpand\pgftree{\the\root@node}{\the\child@list}}}% +\fi +\act +\@return} + +%% scan a sequence of subtrees or leaves + +\newif\ifscanned@edge + +\def\@children{% +\scanned@edgefalse +\child@list{}% +\@@children} +\def\@@children{% +\pgfutil@ifnextchar]{\@result\child@list\@return}{% end of children +\pgfutil@ifnextchar\edge{% explicit edge +\ifscanned@edge +\message{Warning: more than one edge given for a single child}\let\next\@@children % ignore +\else +\scanned@edgetrue\let\next\@@@children +\fi +\@call\@edge\next}{% +% else, a real node is next +\ifscanned@edge\else % no explicit edge, supply default +\expandafter\child@list\expandafter{\the\child@list{\edge@adapter{}}}% +\fi +\scanned@edgefalse +\pgfutil@ifnextchar[{\@call\@subtree\@@@children}% subtree +{\@call\@leaf\@@@children} % leaf +}}} +\def\@@@children{% +% wrap child inside curly braces +\expandafter\@result\expandafter{\expandafter{\the\@result}} +\edef\act{\noexpand\child@list{\the\child@list \the\@result}}\act +\@@children +} + +\def\@interior.{\@result{\node[alias=\nodename][every tree node,every internal node]}\@label} + +\def\@leaf{\@result{\node[alias=\nodename][every tree node,every leaf node]}\@label} + +\def\@edge\edge #1;{% +\@result{\edge@adapter{#1}}% +\@return} +\def\edge@adapter#1{% +\let\tikzparentnode\parentnodename +\let\tikzchildnode\nodename +\path edge from parent #1;% +} + +% a label is either text or PGF/TikZ code starting with \node +\def\@label{\pgfutil@ifnextchar\node{\@litlabel}{\@@label}} +\def\@@label#1 {% +\expandafter\@result\expandafter{\the\@result{#1};}% +\@return} + +% try to copy \node command into \@result without stripping braces +\def\@litlabel\node{\@@litlabel} +\def\@@litlabel{\pgfutil@ifnextchar\bgroup{\@@@litlabel}{\@@@@litlabel}} +\def\@@@litlabel#1{\expandafter\@result\expandafter{\the\@result {#1}}\@@litlabel} +\def\@@@@litlabel#1;{\expandafter\@result\expandafter{\the\@result #1;}\@return} + +% predefined edges + +\def\tree@edge#1#2{% +\ifupsidedown +(#1.north) -- (#2.south) +\else +(#1.south) -- (#2.north) +\fi +} + +\def\roof@edge#1#2{ +\ifupsidedown +(#1.north) -- (#2.south west) -- (#2.south east) -- cycle +\else +(#1.south) -- (#2.north west) -- (#2.north east) -- cycle +\fi +} + +%%% Options + +\tikzoption{level distance}{\pgfmathsetlength\levelsep{#1}} +\tikzoption{sibling distance}{\pgfmathsetlength\subtreesep{#1}} % different semantics + +% I don't really like this scheme +\tikzoption{grow}{\csname grow@#1\endcsname} +\tikzoption{grow'}{\csname growprime@#1\endcsname} +\def\grow@up{\upsidedowntrue\righttolefttrue} +\def\grow@down{\upsidedownfalse\righttoleftfalse} +\def\growprime@up{\upsidedowntrue\righttoleftfalse} +\def\growprime@down{\upsidedownfalse\righttolefttrue} + +% defaults appropriate for linguistic trees +\tikzset{every tree node/.style={anchor=base}} +\tikzset{every leaf node/.style={}} +\tikzset{every internal node/.style={}} +\def\tikz@edge@to@parent@path{\tree@edge{\tikzparentnode}{\tikzchildnode}} + +% predefined roof style +\tikzset{roof/.style={edge from parent path=\roof@edge{\tikzparentnode}{\tikzchildnode}}} + -- cgit v1.2.3