% pst-qtree.tex % Copyright (C) 2002 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. \psset{nodesep=2pt,levelsep=36pt,treesep=24pt} %\def\psedge{\ncdiag[arm=0,angleA=-90,angleB=90]} \def\psnode#1{\TR{#1}} \edef\TheAtCode{\the\catcode`\@} \catcode`\@=11 \newtoks\result %% These macros facilitate building up an object recursively before %% putting it into the input stream. \def\call#1#2{\let\@cont=#2\bgroup\result={}#1} \def\return{% \global\result=\result \egroup\@cont } \def\ifeq#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{% \ifeq{\psk@treemode}{0}% \def\psedge{\ncdiag[arm=0,angleA=-90,angleB=90]} \fi \ifeq{\psk@treemode}{2}% if \psset{treemode=U} \def\psedge{\ncdiag[arm=0,angleA=90,angleB=-90]} \fi \ifeq{\psk@treemode}{1}% if \psset{treemode=R} \def\psedge{\ncdiag[arm=0,angleA=0,angleB=180]} \fi \ifeq{\psk@treemode}{3}% if \psset{treemode=L} \def\psedge{\ncdiag[arm=0,angleA=180,angleB=0]} \fi \call\@subtree\@Tree} \def\@Tree{\the\result} %% scan a subtree \def\@subtree[{% \toks0={\@nil}% \@ifnextchar.{\call\@dotlabel\@@subtree}{\@@@subtree}} \def\@@subtree{% \toks0=\result \@@@subtree } \def\@@@subtree{% \call\@children\@@@@subtree } \def\@@@@subtree]{% \toks2=\result \@ifnextchar.{\call\@dotlabel\@@@@@subtree}{\@@@@@@subtree}} \def\@@@@@subtree{% %%% Check for mismatch. \ifeq{\the\toks0}{\noexpand\@nil}% \toks0=\result \fi \ifeq{\the\toks0}{\the\result}\else \message{Warning: mismatched labels, \the\toks0{} and \the\result.}% \fi \@@@@@@subtree } \def\@@@@@@subtree{% \ifeq{\the\toks0}{\noexpand\@nil}% \edef\act{\noexpand\result={\noexpand\pstree{\noexpand\psnode{}}{\the\toks2}}}% \else \edef\act{\noexpand\result={\noexpand\pstree{\the\toks0}{\the\toks2}}}% \fi \act \return} %% scan a sequence of subtrees or leaves \def\@children{% \@ifnextchar]{\return}{% \@ifnextchar[{\call\@subtree\@@children}{\call\@label\@@children}}} \def\@@children{% \toks0=\result \call\@children\@@@children } \def\@@@children{% \ifeq{\the\toks0}{}% \else \toks2=\result \edef\act{\noexpand\result={\the\toks0 \the\toks2}}% \act \fi \return } %% scan an interior label \def\@dotlabel.{% \@label } %% scan a leaf node \def\@label{% \@ifnextchar!{\@litlabel}{\@@label}} \def\@@label#1 {% \result={\psnode{\hbox{\begin{tabular}{c} #1 \end{tabular}}}}% \return } \def\@litlabel!#1 {% \result={#1}% \return } \def\roofedge#1#2{% \ncdiag[arm=0pt,angleA=-90,angleB=90]{#1}{#2l} \ncdiag[arm=0pt,angleA=-90,angleB=90]{#1}{#2r} \ncdiag[arm=0pt,angleA=90,angleB=90]{#2l}{#2r}} \def\Troof#1{% \TR[edge=\roofedge]{% \Rnode[href=-1]{\pspred-\the\psnodecnt l} {\Rnode[href=1]{\pspred-\the\psnodecnt r}{#1}}}% } \catcode`\@=\TheAtCode\relax \endinput