diff options
Diffstat (limited to 'macros/latex/contrib/LingTrees/lingtrees.sty')
-rw-r--r-- | macros/latex/contrib/LingTrees/lingtrees.sty | 366 |
1 files changed, 366 insertions, 0 deletions
diff --git a/macros/latex/contrib/LingTrees/lingtrees.sty b/macros/latex/contrib/LingTrees/lingtrees.sty new file mode 100644 index 0000000000..80d9b827f2 --- /dev/null +++ b/macros/latex/contrib/LingTrees/lingtrees.sty @@ -0,0 +1,366 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Version: 28 Dec 2005 +%% changelog at end +%% +%% Primitive Linguistics Tree Formatter +%% +%% Copyright (c) 1991, 2005, 2006 Avery DeLano Andrews 3rd +%% These macros can be redistributed and/or modified under the terms +%% of the LaTeX Project Public License Distributed from CTAN +%% archives in directory macros/latex/base/lppl.txt. +%% +%% Parameter-list handling technique cribbed from gloss.sty +%% by Marcel R. van der Goot (1990). +%% Advice and some edits by Christopher D Manning +%% +%% License: LaTeX Project Public License +%% +%% Usage: \tree{...} prints out a formatted tree. +%% \treenode{...} puts formatted tree into \treebox reg. +%% either leaves \treewidth reg = width of tree +%% \treecenter reg. = `center' of tree +%% +%% {...} above is a `tree list', of the form: +%% {{<terminal>}} +%% {<mother>, <d1>, <dn>}, where each di is a treelist. +%% +%% e.g. {S, {NP, {Det, {{the}}, {N, {{dog}}}}, {VP, {{barked}}}} +%% +%% The double braces around terminals are annoying, but I haven't +%% been clever enough to avoid them. <terminal> & <mother> +%% can be any well-balanced material, (feature-structures, +%% stacks of nodes & annotations ... +%% +%% Parameters: +%% \sisterskip (dimen) default spacing between sisters +%% \daughterskip (dimen) default vert. mother-daughter spacing +%% +%% Fiddles: +%% \daughtergap{<dimen>} in a mother node sets mother-daughter +%% spacing to <dimen> for daughters of that node. +%% \sistergap{<dimen>} in a node spaces it <dimen> horizontally +%% from its *preceeding* sister +%% +%% LFG Specials: +%% To make life easier for LFG people, there are two commands for +%% doing annotated nodes, \tnode for terminals, \ntnode for nonterminals. +%% Both are defined in terms of \node from Emma Pease's tree.sty, so they +%% take two braced arguments, the node tag and the node specification. +%% +%% The node tag is as in tree.sty, but the node specification is a +%% series of levels separated by `/' (if you want to combine levels +%% with GPSG slash notation, groupany level containing a slash in +%% braces). With \ntnode, the upper levels are set in math mode +%% and the bottommost in restricted horizontal; with \tnode, the +%% upper levels are set in math mode and the bottommost in restricted +%% horizontal with italic font. +%% +%% Annotation are now by default in the current mode (usually text). +%% If you want to switch on automatic math mode for annotations, you +%% can do it by redefining the \nodeannotation command as follows: +%% +%% \def\nodeannotation#1{$#1$} +%% +%% If you want to terminals to be, say slanted rather than italics, you can +%% do it by redefining \tstyle as follows: +%% +%% \def\tstyle{\sl} +%% +%% If you want to use the stacking, etc., facilities, but not the +%% line-drawing (which depends on tree.sty), you can redefine \node +%% to effectively do nothing: +%% +%% \def\node#1#2{#2} +%% +%% +%% General Remarks: +%% +%% Coded for reader's comfort, not computer's speed, according +%% to my rather inexperienced lights. +%% +%% Processes nodes on a left-corner schedule, first packing +%% daughters into an hbox, then mother into another hbox, +%% then both into a vtop (vbox with alignment along the top). +%% +%% Improvements & Suggestions welcome. Please notify to: +%% +%% Avery D Andrews +%% School of Language Studies +%% Faculty of Arts +%% The Australian national University +%% Acton ACT 2600 +%% +%% email: Avery.Andrews@anu.edu.au +%% +%% Changelog: +%% 27 Dec 2005: \nodeannotation bugfixed +%% \sistergap bug fixed +%% +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\csname LingTreesLoaded\endcsname +\let\LingTreesLoaded\endinput + +\ifx\LingTreesWithoutPSTricks\relax\input tree-dvips.sty\else +\ifx\PSTTreeDvipsEmuLoaded\endinput\else\input pst-tree-dvips-emu.sty\fi\relax\fi\relax + +\def\CR{ +} +{ +\catcode`\_=11 % sets underbar to letter +\catcode` =9 % causes spaces to be ignored +\catcode`\^^M=9 % causes <CR> to be ignored + +\newbox\treebox % box register for returned tree +\newbox\mother_box % " for mother +\newbox\daughter_box % " for local accumulation of daughters +\newbox\daughterr_box % " for upward comm. of dtrs +\newbox\stack_box % for calculating widths for centering annotations + +\newskip\sisterskip % default space between sisters +\newskip\sister_skip % space before current sister +\newdimen\daughterskip % default mother-daughter space (vert) +\newdimen\daughter_skip % current " +\newdimen\stack_width % for calculating widths for centering annotations +\newskip\annoteskip % default space between annotations + +\global\sisterskip=2em +\global\daughterskip=2ex +\global\annoteskip=0ex + +\newdimen\treewidth +\newdimen\treecenter +\newdimen\mother_offset +\newdimen\first_center +\newdimen\last_center +\newdimen\daughter_center +\newdimen\raise_daughter + + +\newdimen\daughter_spread +\newcount\daughter_count +\newcount\treerationum +\newcount\treeratiodenom +\global\treerationum=0 +\global\treeratiodenom=0 +\gdef\treeslantratio#1{\@treeslantratio[#1]} +\gdef\@treeslantratio[#1/#2]{% +\treerationum=#1 +\treeratiodenom=#2 +} + +\newdimen\treedotwidth +\global\treedotwidth=0.6pt + +\newdimen\nodewidth +\newdimen\node_width +\global\nodewidth=0em +\gdef\@nwbox#1{\hbox{\makebox[\node_width][c]{#1}}} +\gdef\@ifnodewidthzero#1#2{\ifdim\node_width=0em #1\else #2\fi} +\gdef\@fwbox#1{\@ifnodewidthzero{\hbox{#1}}{\@nwbox{#1}}} + +\gdef\setnodewidth#1{\global\node_width=#1} + +\gdef\daughtergap#1{\global\daughter_skip=#1} % chris: should remove global? +\gdef\sistergap#1{\global\sister_skip=#1} % avery: no, doesn't work. wish I could + % remember how it was supposed to! + +% was: \gdef\tree#1{\tree_node#1,.\leavevmode\box\treebox} +\gdef\tree#1{\tree_node#1,.\ifvmode\leavevmode\fi\hbox{\box\treebox}} + % formats tree & prints it out. + % sets treewidth & treecenter + +\gdef\treenode#1{\tree_node#1,.} % formats tree & puts it in treebox + % sets treewidth & treecenter + +\gdef\treeann#1{\node_ann{#1}} % annotation stack + +% for centered tree in math mode. cdm Mar 1996 +\gdef\treecent#1{\tree_node#1,.\ifvmode\leavevmode\fi\vcenter{\box\treebox}} + +\gdef\tree_node#1,#2.{ + \def\daughters{#2} + \ifx\daughters\empty % if terminal +% \message{terminal\CR} + \global\setbox\treebox=\@fwbox{#1} +% \message{got_term} + \global\treewidth=\wd\treebox + \global\treecenter=.5\treewidth + \else +% \message{get daughters} + \global\node_width=\nodewidth%\message{RestoreA\CR} + \get_daughters#2. +% \message{got daughters} + \global\node_width=\nodewidth%\message{RestoreB\CR} + \ifnum\treeratiodenom=0 + \daughtergap{\daughterskip} + \else + \ifnum\daughter_count=1 + \daughtergap{\daughterskip} + \else + \daughter_spread=\last_center + \advance \daughter_spread by -\first_center + \multiply \daughter_spread by \treerationum + \divide\daughter_spread by \treeratiodenom + \daughtergap{\daughter_spread} + \fi + \fi + \setbox\mother_box=\@fwbox{#1} +% \message{got mother\CR} + \ifdim\ht\mother_box=0em + \advance\daughter_skip by -2\nodemargin + \fi + \mother_offset=\daughter_center + \advance\mother_offset by -.5\wd\mother_box % width to center of mother + \ifdim\mother_offset>0pt + \global\setbox\treebox=\vtop{ + \hbox{\hskip\mother_offset\unhbox\mother_box} + \vskip\daughter_skip + \box\daughterr_box} + \else + \global\setbox\treebox=\vtop{ + \box\mother_box + \vskip\daughter_skip + \hbox{\hskip-\mother_offset\unhbox\daughterr_box}} + \fi + \@ifnodewidthzero + {\global\treewidth=\wd\treebox} + {\global\treewidth=\node_width} + \global\treecenter=\daughter_center + \ifdim\mother_offset<0pt + \global\advance\treecenter by -\mother_offset + \fi +% \global\node_width=\nodewidth\message{Restore\CR} + \fi +} + +\gdef\d@mmy.{} % We call this when we are at the end. A no-op, but you + % get better performance if you use no-ops! [cdm] + +\gdef\d@@mmy.{}{} % two-argument version. + +\gdef\get_daughters#1,#2.{ +% \global\node_width=\nodewidth\message{PreRestore\noexpand\node_width\CR} + {\treenode#1} % process first daughter +% \message{got first daughter\CR} + \first_center=\treecenter + \last_center=\treewidth + \daughter_count=1 + \setbox\daughter_box=\hbox{\raise\raise_daughter\box\treebox} + \def\more{#2} + \ifx\more\empty + \global\daughter_center=\first_center + \global\setbox\daughterr_box=\box\daughter_box + \let\more=\d@mmy + \else + \let\more=\more_daughters + \fi + \more#2. + \@ifnodewidthzero{} + {\global\setbox\daughterr_box=\@fwbox{\box\daughterr_box} + \global\daughter_center=.5\node_width + } +} + +\gdef\more_daughters#1,#2.{ + \sistergap{\sisterskip} + \node_width=\nodewidth + {\treenode#1} + \advance\daughter_count by 1 + \@ifnodewidthzero % leave out sisterskip for fixed width + {\setbox\daughter_box=\hbox{ + \unhbox\daughter_box\hskip\sister_skip\raise\raise_daughter\box\treebox}} + {\setbox\daughter_box=\hbox{ + \unhbox\daughter_box\raise\raise_daughter\box\treebox}} + \def\more{#2} + \ifx\more\empty + \advance\last_center by \treecenter + \@ifnodewidthzero + {\advance\last_center by \sister_skip} + {} + \advance\last_center by \first_center + \divide\last_center by 2 + \global\daughter_center=\last_center + \global\setbox\daughterr_box=\box\daughter_box + \let\more=\d@mmy + \else + \advance\last_center by \treewidth + \@ifnodewidthzero + {\advance\last_center by \sister_skip} + {} + \let\more=\more_daughters + \fi + \more#2. + \sistergap{\sisterskip} +} + + +\gdef\ntnode#1#2{ + \def\t_style{\ntstyle} + \node{#1}{\node_ann{#2}} +} + +\global\let\tstyle=\it +\global\let\ntstyle=\rm + +\gdef\tnode#1#2{ + \def\t_style{\tstyle} + \node{#1}{\node_ann{#2}} +} + +\gdef\node_ann#1{ + \global\stack_width=0pt + \get_widths#1/. + \vtop{\stack_ann#1/.} +} + +\gdef\stack_ann#1/#2.{ + \def\more{#2} + \ifx\more\empty + \ifdim\stack_width=0em + \hbox to\stack_width{\vbox to 0em{}} + \global\raise_daughter=\ht\strutbox + \else + \hbox to \stack_width{\strut\hss\t_style {\nodeannotation{#1}}\hss} + \global\raise_daughter=0ex + \fi + \let\more=\d@mmy + \else + \hbox to \stack_width{\hss {\nodeannotation{#1}}\hss}\vskip\annoteskip + \let\more=\stack_ann + \fi + \more#2. + } + +% Default used to be math, (for f-descriptions?) but this was a pain! +% \gdef\nodeannotation#1{$#1$} +\gdef\nodeannotation#1{#1} + +\gdef\get_widths#1/#2.{ + \def\more{#2} + \ifx\more\empty + \setbox\stack_box=\hbox{\t_style \nodeannotation{#1}} + \let\more=\d@mmy + \else + \setbox\stack_box=\hbox{\nodeannotation{#1}} + \let\more=\get_widths + \fi + \ifdim\stack_width<\wd\stack_box + \global\stack_width=\wd\stack_box + \fi + \more#2. +} + +} % end group & restore standard catcodes + +%% Changelog +%% +%% 26 Feb 2006 +%% get vertical spacing with no-label nodes to work +%% \setnodewidth command and ancilliaries working +%% +%% 28 Dec 2005 +%% fix bugs with \nodeannotation and \sistergap +%% +%% 21 Sep 1997 + |