diff options
author | Karl Berry <karl@freefriends.org> | 2010-12-30 23:50:06 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2010-12-30 23:50:06 +0000 |
commit | 58679cc130f6f05e33c54456b379a2b878211c29 (patch) | |
tree | 8e69c516776b653ec6d28fe8559b630a5422862f /Master/texmf-dist/tex/generic/pst-jtree | |
parent | 93125edaad6060997d02d972a15f2543b145e676 (diff) |
pst-jtree
git-svn-id: svn://tug.org/texlive/trunk@20894 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/generic/pst-jtree')
-rw-r--r-- | Master/texmf-dist/tex/generic/pst-jtree/pst-jtree.tex | 432 |
1 files changed, 282 insertions, 150 deletions
diff --git a/Master/texmf-dist/tex/generic/pst-jtree/pst-jtree.tex b/Master/texmf-dist/tex/generic/pst-jtree/pst-jtree.tex index 0bbd8d0ea1e..898a84f50cc 100644 --- a/Master/texmf-dist/tex/generic/pst-jtree/pst-jtree.tex +++ b/Master/texmf-dist/tex/generic/pst-jtree/pst-jtree.tex @@ -1,21 +1,58 @@ +% Author: John Frampton, j.frampton@neu.edu +% % Users should feel free to modify this file in any way they % see fit. If these modification go beyond your personal % use, please send me a careful description of the % modifications that have been made and the reasons that % they were made. -\def\fileversion{2.5} -\def\filedate{2010/02/22} -\message{ v\fileversion, \filedate} - +% +% Please NOTIFY ME about bugs and incompatibilities. +% +\def\fileversion{2.6} +\def\filedate{2010/12/17} +\message{`PST-jTree' v\fileversion\space\space <\filedate> (jf)} +% \csname JTreeLoaded\endcsname \let\JTreeLoaded\endinput \ifx\PSTricksLoaded\endinput \else \input pstricks \fi\relax \ifx\PSTnodesLoaded\endinput \else \input pst-node \fi\relax \ifx\PSTXKeyLoaded\endinput \else \input pst-xkey \fi\relax -\edef\TheAtCode{\the\catcode`\@} - -\catcode`@=12 \let\OtherAt=@ +% +% commands for manipulating character codes +\begingroup \catcode`@=11 +\gdef\jStoreCat#1{% + \expandafter\edef\csname @OldCat\string#1\endcsname + {\noexpand\catcode\noexpand`\noexpand#1=\the\catcode`#1}% +} +\gdef\jRestoreCat#1{\edef\tempa{@OldCat\string#1}% + \expandafter\csname\tempa\endcsname \ignorespaces} +\catcode`@=12 +\global\let\OtherAt=@ +\endgroup +\def\jTempChangeCat#1#2{\jStoreCat#1\catcode`#1=#2\ignorespaces} +\jTempChangeCat @{11} +\def\j@StoreCats#1{% + \XKV@for@n{#1}\@char{\expandafter\jStoreCat\@char}% +} +\def\j@ChangeCat#1#2{\catcode`#1=#2} +\def\j@MakeAllOther#1{% + \XKV@for@n{#1}\@char{\expandafter\j@ChangeCat\@char{12}}% +} +\def\j@TempMakeAllOther#1{% + \XKV@for@n{#1}\@char{\expandafter\jTempChangeCat\@char{12}}% + \ignorespaces +} +\def\j@RestoreCats#1{% + \XKV@for@n{#1}\@char{\expandafter\jRestoreCat\@char}% + \ignorespaces +} +\def\tempjtree@cats{\jTempChangeCat ^{7}\j@TempMakeAllOther{",>,<}} +\def\jtree@cats{\catcode`^=7 \j@MakeAllOther{",>,<}} +\def\unjtree@cats{\j@RestoreCats{^,",>,<}} +\tempjtree@cats +% +% register resources \newdimen\@xpos \newdimen\@ypos \newdimen\@@xpos @@ -33,9 +70,44 @@ \newtoks\jtEverytree \newtoks\jteverytree \newtoks\jteverylabel -\newif\if@omit \newcount\@CurrState -%%% +% +\newif\if@omit +% +% from eplain - \@futurenonspacelet, \@getoptionalarg +\def\@futurenonspacelet#1{\def\cs{#1}% + \afterassignment\@stepone\let\@nexttoken= +} +\begingroup +\def\\{\global\let\@stoken= }% +\\ % +\endgroup +\def\@stepone{\expandafter\futurelet\cs\@steptwo}% +\def\@steptwo{\expandafter\ifx\cs\@stoken\let\@@next=\@stepthree + \else\let\@@next=\@nexttoken\fi \@@next}% +\def\@stepthree{\afterassignment\@stepone\let\@@next= }% +\def\@getoptionalarg#1{% + \let\@optionaltemp = #1% + \let\@optionalnext = \relax + \@futurenonspacelet\@optionalnext\@bracketcheck +} +\def\@bracketcheck{% + \ifx [\@optionalnext + \expandafter\@@getoptionalarg + \else + \let\@optionalarg = \empty + \expandafter\@optionaltemp + \fi +} +\def\@@getoptionalarg[#1]{% + \def\@optionalarg{#1}% + \@optionaltemp +} +% end eplain utilities +\def\psset@optionalarg{% + \ifx\@optionalarg\empty \else + \expandafter\psset\expandafter{\@optionalarg}\fi +} \def\jt@xovery#1#2{% \jt@ytox@a#1//\@nil#2\ignorespaces} \def\jt@ytox@a#1/#2/#3\@nil#4{% @@ -44,18 +116,9 @@ \pst@dimc=\@denom pt \pst@dimd=#1pt \pst@dimd=-\pst@dimd \pst@divide\pst@dimc\pst@dimd#4} %%% -\def\Expandafter#1#2{\expandafter\expandafter\expandafter#1#2} +\def\expandaftertwice{\expandafter\expandafter\expandafter} \def\@empty{} \def\@nullbox{\omit} -\begingroup -\def\:{\jf@gobblespace} \expandafter\gdef\: {} -\endgroup -%%% this is also in @lingbasics -\def\ling@getpars#1{% - \def\k@@p{#1}\@ifnextchar[\ling@getparsA\ling@getparsB} -\def\ling@getparsA[#1]{\def\pst@pars{#1}\k@@p} -\def\ling@getparsB{\let\pst@pars\@empty \k@@p} -%%% \def\psinterpolate(#1)(#2)#3#4{{\SpecialCoor \pst@getcoor{#1}\pst@tempa% \pst@getcoor{#2}\pst@tempb% @@ -68,7 +131,6 @@ /dy YB YA sub def dx #3\space mul XA add dy #3\space mul YA add){#4} }\ignorespaces} - %% PSTricks parameters %% % labelgap,labelgapt,labelgapb,everytree,everylabel,branch,triratio @@ -80,29 +142,23 @@ \else \pssetlength\pst@dima{#2#3}\fi } \pst@addfams{jtree} -\define@key[psset]{jtree}{labelgapt}% - {\jtreevalue{labelgapt}#1\@nil - \edef\jt@labelgapt{\the\pst@dima}} -\define@key[psset]{jtree}{labelgapb} - {\jtreevalue{labelgapb}#1\@nil - \edef\jt@labelgapb{\the\pst@dima}} +\def\define@inckey#1{% incremental key + \define@key[psset]{jtree}{#1}% + {\jtreevalue{#1}##1\@nil + \expandafter\edef\csname jt@#1\endcsname{\the\pst@dima}}% +} +\def\defin@inckeys#1{\XKV@for@n{#1}\@parname{% + \expandafter\define@inckey\expandafter{\@parname}% +}} +\defin@inckeys{labelgapt,labelgapb,labeloffset,% + labelstrutt,labelstrutb,baretopadjust} \define@key[psset]{jtree}{labelgap} {\psset{labelgapt=#1,labelgapb=#1}} -\define@key[psset]{jtree}{labeloffset}{% - \jtreevalue{labeloffset}#1\@nil - \edef\jt@labeloffset{\the\pst@dima}} -\define@key[psset]{jtree}{labelstrutt}{% - \jtreevalue{labelstrutt}#1\@nil - \edef\jt@labelstrutt{\the\pst@dima}} -\define@key[psset]{jtree}{labelstrutb}{% - \jtreevalue{labelstrutb}#1\@nil - \edef\jt@labelstrutb{\the\pst@dima}} \define@key[psset]{jtree}{everylabel}{\jteverylabel={#1}} \define@key[psset]{jtree}{everytree}{\jteverytree={#1}} +% 12/29/09 parameter eval added +\define@key[psset]{jtree}{eval}{#1} \define@key[psset]{jtree}{triratio}{\edef\jt@triratio{#1}} -\define@key[psset]{jtree}{baretopadjust}{% - \jtreevalue{baretopadjust}#1\@nil - \edef\jt@baretopadjust{\the\pst@dima}} \define@key[psset]{jtree}{treevshift}{% \jtreevalue{labelgapt}#1\@nil \edef\jt@treevshift{\the\pst@dima}} @@ -131,7 +187,7 @@ % syntax: \psset{dirA=(1:1)} (note :) sets angleA to point in % the (1,1) direction % end new parameter - +% \def\jt@maxafter{\xdef\jt@@maxafter{% \noexpand\max@left=\the\max@left \noexpand\max@right=\the\max@right @@ -145,17 +201,22 @@ \noexpand\@@xpos=\the\@@xpos \noexpand\@@ypos=\the\@@ypos}% \aftergroup\vartri@@after} -%%%%%%%%%%%%%%%%%%%%%% -%%%%% leaf definitions -\def\defbranch{\ling@getpars\defbranch@a} +% +% leaf definitions +\def\defenter{\j@TempMakeAllOther{>,<}\@getoptionalarg} +\def\defreturn{\j@RestoreCats{>,<}} +% +\def\defbranch{\defenter\defbranch@a} \def\defbranch@a<#1>#2(#3)#4(#5){% \jt@xovery{#5}\temp - \Expandafter\edef\@nameuse{leaf@#1}% + \expandaftertwice\edef\@nameuse{leaf@#1}% {\noexpand\def\noexpand\@leaf{% - \noexpand\@@branch{\pst@pars}{#3}{\temp}}% - }\ignorespaces} + \noexpand\@@branch{\@optionalarg}{#3}{\temp}}}% + \defreturn + \ignorespaces +} \def\@@branch#1#2#3{\@@xpos=\@xpos \@@ypos=\@ypos - {\psset{#1}\expandafter\psset\expandafter{\pst@pars}% + {\psset{#1}\psset@optionalarg \pssetylength\pst@dimd{#2} \pst@dimc=#3\pst@dimd \pst@divide\psxunit\psyunit\temp @@ -171,16 +232,18 @@ \ifdim\@ypos < \max@down \max@down=\@ypos \fi \jt@maxafter}% } -\def\deftriangle{\ling@getpars\deftriangle@a} +\def\deftriangle{\defenter\deftriangle@a} \def\deftriangle@a#1<#2>#3(#4)#5(#6)#7(#8){% \jt@xovery{#6}\tempA \jt@xovery{#8}\tempB - \Expandafter\edef\@nameuse{leaf@#2}% + \expandaftertwice\edef\@nameuse{leaf@#2}% {\noexpand\def\noexpand\@leaf{% - \noexpand\@@triangle{\pst@pars}{#4}{\tempA}{\tempB}}}% + \noexpand\@@triangle{\@optionalarg}{#4}{\tempA}{\tempB}}}% + \defreturn + \ignorespaces } \def\@@triangle#1#2#3#4{\@@xpos=\@xpos \@@ypos=\@ypos - {\psset{#1}\expandafter\psset\expandafter{\pst@pars} + {\psset{#1}\psset@optionalarg \jt@dima=\@xpos \jt@dimb=\@ypos \pssetylength\jt@dimc{#2} \jt@dimd=#3\jt@dimc @@ -206,17 +269,19 @@ \jt@positionafter}% \edef\triwd{\temp}% } -\def\defvartriangle{\ling@getpars\defvartriangle@a} +\def\defvartriangle{\defenter\defvartriangle@a} \def\defvartriangle@a#1<#2>#3(#4){% - \Expandafter\edef\@nameuse{leaf@#2}% + \expandaftertwice\edef\@nameuse{leaf@#2}% {\noexpand\@CurrState=\State@vartri \noexpand\def\noexpand\@leaf{% - \noexpand\@@vartriangle{\pst@pars}{#4}}}% + \noexpand\@@vartriangle{\@optionalarg}{#4}}}% + \defreturn + \ignorespaces } \def\@@vartriangle#1#2{\@@xpos=\@xpos \@@ypos=\@ypos {\expandafter\psset\expandafter{\jf@@pars}% \edef\@vartriratio{\jt@triratio}% - \psset{#1}\expandafter\psset\expandafter{\pst@pars}% + \psset{#1}\psset@optionalarg \pssetylength\jt@dimc{#2} \jt@dimc=\jt@scaleyby\jt@dimc \advance\@ypos by -\jt@dimc @@ -276,22 +341,14 @@ \def\@ifCurrState#1{\ifnum\@CurrState=#1} \def\start{\xdef\@topadjust{\jt@baretopadjust}\@CurrState=\State@root \jtp@parse } -% 23 June 05 removed \expandafter - - -%%% utility used extensive by the parser -%%% removes following space token and expands the token -%%% which follows -\def\@preparenext#1{\def\@@hold{#1}\@pn@} -\def\@pn@{\futurelet\temp\@pn@a} -\def\@pn@a{\ifx\temp\@sptoken \let\next\@pn@b - \else \let\next\@pn@c \fi \next} -\def\@pn@b{\expandafter\@pn@c\jf@gobblespace} -\def\@pn@c{\futurelet\temp\@pn@d} -\def\@pn@d{\ifcat\noexpand\temp\noexpand\relax - \let\next\@pn@e \else \let\next\@@hold \fi \next} -\def\@pn@e{\expandafter\@@hold} -%%% main parser +% +% \@preparenext is used extensive by the parser. It removes a +% following space token and expands the token which follows. +\def\@preparenext#1{% + \def\@@hold{\expandafter #1}% + \@futurenonspacelet\temp\@@hold % \temp is a dummy +} +%%%% main parser \def\jtp@parse{\@preparenext\jtp@parseA} \def\jtp@parseA{\futurelet\temp\jtp@parseD} \def\jtp@parseD{% @@ -301,7 +358,6 @@ \ifx\temp:\let\next\jtp@colon \else \ifx\temp!\let\next\jtp@insertlabel \else \ifx\temp\OtherAt \let\next\jtp@insertlabel \else -% \ifx\temp;\let\next\jtp@semicolon \else \ifx\temp(\let\next\jtp@lparen \else \ifx\temp)\let\next\jtp@rparen \else \ifx\temp.\let\next\jtp@exit \else @@ -316,19 +372,22 @@ \def\jtp@TestForOmitA{\global\@omittrue \ifx\temp\omit \let\next\@gobble \else \ifx\temp\pnode \let\next\relax - \else \global\@omitfalse - \def\next{\the\jteverylabel}\fi\fi \next + \else \ifx\temp\elc \let\next\relax + \else \global\@omitfalse + \def\next{\the\jteverylabel}\fi\fi\fi \next } %% -\def\jtp@label#1{\def\@stuff{#1}\@preparenext\jtp@labelA} -\def\jtp@labelA{\expandafter\ling@getpars\expandafter\jtp@labelB} +\def\jtp@label{\unjtree@cats\jtp@label@} +\def\jtp@label@#1{\def\@stuff{#1}\jtree@cats\@preparenext\jtp@labelA} +%\def\jtp@label#1{\def\@stuff{#1}\@preparenext\jtp@labelA} +\def\jtp@labelA{\expandafter\@getoptionalarg\expandafter\jtp@labelB} \def\jtp@labelB{\@preparenext\jtp@labelC} \def\jtp@labelC{\@ifnextchar \OtherAt \jtp@labelD{\def\@explabel{}\jtp@labelE}} \def\testlabel#1.#2\@nil{\def\temp{#2}\ifx\temp\@empty \else \jtp@err{SPACE MUST FOLLOW @TAG OR !TAG}\fi} \def\jtp@labelD#1#2 {\def\@explabel{#2}\testlabel#2.\@nil\jtp@labelE} -\def\jtp@labelE{\bgroup\expandafter\psset\expandafter{\pst@pars}% +\def\jtp@labelE{\bgroup\psset@optionalarg \setbox\@nodebox\hbox{\expandafter\jtp@TestForOmit\@stuff}% \@ifCurrState\State@vartri \@leaf \fi \jt@setnode\vartri@after\jt@positionafter\egroup @@ -336,13 +395,11 @@ \@ifnextchar !\jtp@labelF\jtp@labelG} \def\jtp@labelF #1 {% \testlabel#1.\@nil - \Expandafter\xdef\@nameuse{coords@#1}{% + \expandaftertwice\xdef\@nameuse{coords@#1}{% \noexpand\@xpos=\the\@xpos\noexpand\@ypos=\the\@ypos}% \jtp@labelH } \def\jtp@labelG{\@ifnextchar (\jtp@lparen\jtp@labelH} -%\def\jtp@labelH{% -% \@ifnextchar;{\expandafter\jtp@labelHa\@gobble}\jtp@labelHa} \def\jtp@labelH{% \@ifCurrState\State@colonB \jt@maxafter\egroup \@CurrState=\State@normal @@ -355,36 +412,70 @@ %%%% branches \def\colon@error{\jtp@err{(pars) + target should follow : operator}} \def\jtp@branch<#1>{% - \ifnum\@CurrState=\State@root \@CurrState=\State@normal - \else\ifnum\@CurrState=\State@colonA \@CurrState=\State@colonB - \else\ifnum\@CurrState=\State@colonB \colon@error \fi\fi\fi - \Expandafter\ifx\@nameuse{leaf@#1}\relax - \jtp@err{unknown branch, <#1>}\fi - \@nameuse{leaf@#1}\@preparenext\jtp@branchA} -\def\jtp@branchA{\expandafter\ling@getpars\expandafter\jtp@branchB} + \ifnum\@CurrState=\State@root + \@CurrState=\State@normal + \else + \ifnum\@CurrState=\State@colonA + \@CurrState=\State@colonB + \else + \ifnum\@CurrState=\State@colonB + \colon@error + \fi + \fi + \fi + \expandaftertwice\ifx\@nameuse{leaf@#1}\relax + \jtp@err{unknown branch, <#1>}% + \fi + \@nameuse{leaf@#1}% + \@preparenext + \jtp@branchA +} +\def\jtp@branchA{\expandafter\@getoptionalarg\expandafter\jtp@branchB} \def\jtp@branchB{% - \@ifCurrState\State@vartri \edef\jf@@pars{\pst@pars}% - \let\next\jtp@varbranch\else - \let\next\jtp@mkbranch\fi \next} + \@ifCurrState\State@vartri + \edef\jf@@pars{\@optionalarg}% + \let\next\jtp@varbranch + \else + \let\next\jtp@mkbranch + \fi + \next +} \def\jtp@mkbranch{\@leaf\jtp@parse} \def\jtp@varbranch{\@preparenext\jtp@varbranchA} \def\jtp@varbranchA{\@ifnextchar\bgroup \jtp@label {\jtp@err{vartriangle (pars) should be followed by a label}% \fi \next}} %%% the rest -\def\jtp@colon#1{\ifnum\@CurrState<\State@colonB +\def\jtp@colon#1{% + \ifnum\@CurrState<\State@colonB \else \colon@error \fi - \bgroup \@CurrState=\State@colonA - \jtp@parse <colonA>} -%\def\jtp@semicolon#1{\jtp@parse ()} -\def\jtp@lparen#1{\@ifCurrState\State@root - \global\@CurrState=\State@normal \gdef\@topadjust{0pt}% - \fi \bgroup \@CurrState=\State@normal \jtp@parse} -\def\jtp@rparen#1{\jt@maxafter\egroup + \bgroup + \@CurrState=\State@colonA + \jtp@parse <colonA>% +} +\def\jtp@lparen#1{% + \@ifCurrState\State@root + \global\@CurrState=\State@normal + \gdef\@topadjust{0pt}% + \fi + \bgroup + \@CurrState=\State@normal + \jtp@parse +} +\def\jtp@rparen#1{% + \jt@maxafter\egroup \@ifCurrState\State@colonB - \def\next{\jt@maxafter\egroup\@CurrState=\State@normal - \jtp@parse <colonB>}\else - \def\next{\jtp@parse}\fi \next } + \def\next{% + \jt@maxafter + \egroup + \@CurrState=\State@normal + \jtp@parse <colonB>% + }% + \else + \def\next{\jtp@parse}% + \fi + \next +} \def\jtp@exit#1{\ignorespaces} \def\jtp@insertlabel{\jtp@parse{\omit}} \def\jtp@HatOp#1{\@ifCurrState\State@normal \else @@ -393,97 +484,138 @@ \def\jtp@evalnext#1#2{\ifnum\@CurrState>1 \jtp@err{misplaced " evaluation}\fi #2\jtp@parse} %%% end of parser - -\def\adjoin at #1 {\Expandafter\ifx\@nameuse{coords@#1}\relax - \writeln{* * coords@#1 unknown * *}\let\next\more@gobble\else - \@nameuse{coords@#1}\let\next\jtp@parse \fi \next} +% +\def\adjoin at #1 {% + \expandaftertwice\ifx\@nameuse{coords@#1}\relax + \writeln{* * coords@#1 unknown * *}% + \let\next\more@gobble + \else + \@nameuse{coords@#1}% + \let\next\jtp@parse + \fi + \next +} \def\more@gobble#1.{\ignorespaces} -\def\adjoinop#1 ={\@ifCurrState\State@root - \xdef\@topadjust{\jt@baretopadjust}\fi - \adjoin at !#1 } - -\def\jtree{\ling@getpars\jtree@a} +\def\adjoinop#1 ={% + \@ifCurrState\State@root + \xdef\@topadjust{\jt@baretopadjust}\fi + \adjoin at !#1 +} +\def\jtree{\@getoptionalarg\jtree@a} \def\jtree@a{\leavevmode \setbox\tree@box\hbox\bgroup - \Expandafter\def\@nameuse{coords@!}{\@xpos=0pt \@ypos=0pt}% + \tempjtree@cats + \expandaftertwice\def\@nameuse{coords@!}{\@xpos=0pt \@ypos=0pt}% \ifjt@normallabelstrut \NormalLabelStrut \fi \the\jtEverytree \the\jteverytree - \expandafter\psset\expandafter{\pst@pars}% + \psset@optionalarg \@CurrState=\State@root \def\@topadjust{\jt@baretopadjust}% \@xpos=0pt \@ypos=0pt \max@left=\maxdimen \max@right=-\maxdimen \max@down=0pt \ignorespaces } -\def\jt@topadjustafter{\pssetlength\jt@dime\@topadjust +\define@key[psset]{jtree}{bbadjust}{\@bbadjust#1 \@nil} +\def\@bbadjust{\futurelet\temp\@@bbadjust} +\def\@@bbadjust{\ifx\temp\@nil \let\next\@gobble + \else \let\next\@@@bbadjust \fi \next} +\def\@@@bbadjust #1 #2 {% + \expandafter\def\csname jt@bb#1adjust\endcsname{#2}% + \@bbadjust +} +\psset{bbadjust=height 0pt depth 0pt left 0pt right 0pt} +\def\jt@afterpic{% + \pssetlength\jt@dime\@topadjust \psaddtolength\jt@dime\jt@treevshift - \xdef\jt@@topadjustafter - {\noexpand\def\noexpand\@topadjust{\the\jt@dime}}% - \aftergroup\jt@@topadjustafter + \xdef\jt@@afterpic + {% + \noexpand\def\noexpand\@topadjust{\the\jt@dime}% + \noexpand\edef\noexpand\@extraht{\jt@bbheightadjust}% + \noexpand\edef\noexpand\@extraleft{\jt@bbleftadjust}% + \noexpand\edef\noexpand\@extraright{\jt@bbrightadjust}% + }% + \aftergroup\jt@@afterpic } -\def\endjtree{\jt@maxafter\jt@topadjustafter\egroup +\def\endjtree{% + \advance\max@down by -\jt@bbdepthadjust + \jt@afterpic\jt@maxafter\egroup + \advance\max@left by -\@extraleft + \advance\max@right by \@extraright \dp\tree@box=-\max@down - \kern-\max@left - \raise\@topadjust - \box\tree@box\kern\max@right + \vbox{% + \kern\@extraht + \hbox{\kern-\max@left + \raise\@topadjust \box\tree@box + \kern\max@right}% + }% } - -%%%% -%% alternates to \psline for drawing branches +% alternates to \psline for drawing branches \let\branch@type=\psline \def\blank(#1)(#2){\ignorespaces} % branch with centered elision -\def\brokenbranch(#1,#2)(#3,#4){{\psline(#1,#2)(#3,#4) - \dimpuba=#1\dimpubb=#2\dimpubc=#3\dimpubd=#4% - \dimpuba=.5\dimpuba \advance\dimpuba by .5\dimpubc - \dimpubb=.5\dimpubb \advance\dimpubb by .5\dimpubd - \rput(\dimpuba,\dimpubb){\pscirclebox*{\vrule - height3pt width0pt\dots}}}\ignorespaces +\def\brokenbranch(#1,#2)(#3,#4){% + {\psline(#1,#2)(#3,#4) + \jt@dima=#1\jt@dimb=#2\jt@dimc=#3\jt@dimd=#4% + \jt@dima=.5\jt@dima \advance\jt@dima by .5\jt@dimc + \jt@dimb=.5\jt@dimb \advance\jt@dimb by .5\jt@dimd + \rput(\jt@dima,\jt@dimb){\pscirclebox*{\vrule + height3pt width0pt\dots}}}% + \ignorespaces } % \etc branches (trail off into ...) \def\psset@etcratio#1{\edef\jt@etcratio{#1}} % determines the proportion of the branch devoted to ... \newpsstyle{etc}{nodesepB=0,nodesepA=1pt,linestyle=dotted, linewidth=1.2pt,dotsep=2pt} -\def\etcbranch(#1,#2)(#3,#4){{\dimpuba=#1\dimpubb=#3% - \dimpubc=\dimpubb - \advance\dimpubc by \jt@etcratio\dimpuba - \advance\dimpubc by -\jt@etcratio\dimpubb - \dimpuba=#2\dimpubb=#4% - \dimpubd=\dimpubb - \advance\dimpubd by \jt@etcratio\dimpuba - \advance\dimpubd by -\jt@etcratio\dimpubb - \psline[arrows=-cc](#1,#2)(\dimpubc,\dimpubd) - \pcline[style=etc](\dimpubc,\dimpubd)(#3,#4)}% +\def\etcbranch(#1,#2)(#3,#4){{\jt@dima=#1\jt@dimb=#3% + \jt@dimc=\jt@dimb + \advance\jt@dimc by \jt@etcratio\jt@dima + \advance\jt@dimc by -\jt@etcratio\jt@dimb + \jt@dima=#2\jt@dimb=#4% + \jt@dimd=\jt@dimb + \advance\jt@dimd by \jt@etcratio\jt@dima + \advance\jt@dimd by -\jt@etcratio\jt@dimb + \psline[arrows=-cc](#1,#2)(\jt@dimc,\jt@dimd) + \pcline[style=etc](\jt@dimc,\jt@dimd)(#3,#4)}% \ignorespaces } \def\etc{[branch=\etcbranch,scaleby=.7]} % the default is that \etc is 70% the length of \rb and 75% of % it is dots % Incremental tree building -\def\stuff{\ling@getpars\stuff@A} -\def\stuff@A{\ifx\pst@pars\@empty no def\else - \Expandafter\ifx\@nameuse{stuff@@\pst@pars}\relax - {\tt [}\expandafter\tt\pst@pars]\else - \@nameuse{stuff@@\pst@pars}\fi\fi +\def\stuff{\@getoptionalarg\stuff@A} +\def\stuff@A{\ifx\@optionalarg\@empty no def\else + \expandaftertwice\ifx\@nameuse{stuff@@\@optionalarg}\relax + {\tt [}\expandafter\tt\@optionalarg]\else + \@nameuse{stuff@@\@optionalarg}\fi\fi } \def\defstuff[#1]#2{% - \Expandafter\def\@nameuse{stuff@@#1}{#2}\ignorespaces} + \expandaftertwice\def\@nameuse{stuff@@#1}{#2}\ignorespaces} % support for multiline labels \def\multiline{\setbox0=\hbox{\strut}\vrule height\ht0 width0pt \xdef\@temp@{\the\dp0}% \vtop\bgroup\let\\=\cr\halign\bgroup \hfil##\hfil\cr} \def\endmultiline{\vrule depth\@temp@ width0pt \crcr\egroup\egroup} - +% \def\triline#1{\hbox to\triwd{#1}} -\catcode`\@=\TheAtCode\relax - +% empty label comment +\defin@inckeys{elcxoffset,elcyoffset} +\define@key[psset]{jtree}{elcref} + {\edef\jt@elcref{#1}} +\psset{elcxoffset=.8ex,elcyoffset=0,elcref=bl} +\def\elc{\@getoptionalarg\@elc} +\def\@elc#1{\psset@optionalarg + \rput[\jt@elcref]% + (\jt@elcxoffset,\jt@elcyoffset){#1}} +% +\unjtree@cats +\jRestoreCat @ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% the lines below can be commented out and replaced by -%% personalized settings - +% the lines below can be commented out and replaced by +% personalized settings +% \defbranch<left>(1)(1) \defbranch<4left>(1)(2) \defbranch<bigleft>(2)(1) |