summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/tikz-qtree
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2009-12-24 18:43:43 +0000
committerKarl Berry <karl@freefriends.org>2009-12-24 18:43:43 +0000
commitfe52c4d4865ceba78cbad065cc6595ffd0423800 (patch)
tree0123274db309eb900bfce0dbeeb66c406740c6bf /Master/texmf-dist/tex/latex/tikz-qtree
parent6a8a6fa9af6af314e192d593ec496d112f909ff8 (diff)
new package tikz-qtree (23dec09)
git-svn-id: svn://tug.org/texlive/trunk@16498 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/tikz-qtree')
-rw-r--r--Master/texmf-dist/tex/latex/tikz-qtree/pgfsubpic.sty4
-rw-r--r--Master/texmf-dist/tex/latex/tikz-qtree/pgfsubpic.tex110
-rw-r--r--Master/texmf-dist/tex/latex/tikz-qtree/pgftree.sty6
-rw-r--r--Master/texmf-dist/tex/latex/tikz-qtree/pgftree.tex119
-rw-r--r--Master/texmf-dist/tex/latex/tikz-qtree/tikz-qtree.sty4
-rw-r--r--Master/texmf-dist/tex/latex/tikz-qtree/tikz-qtree.tex170
6 files changed, 413 insertions, 0 deletions
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}}}
+