5

I try to typeset dependency trees:

enter image description here

Is there a package that does this? It should be compatible with xelatex, i.e. not be based on pstricks. I could not find anything with google or on CTAN. If there is no package, I would try to do it with forest, but this seems not to be straightforward. How can this be done straightforwardly?

Edit: I found (half of) a solution in forest:

\documentclass{article}

\usepackage{forest}



\forestset{
dg edges/.style={for tree={parent anchor=south, child anchor=north,align=center,base=bottom,where n children=0{tier=word,edge=dotted}{}}},
}


\begin{document}

\begin{forest}
dg edges
[V
  [N
    [D [the] ]
     [child] ]
  [reads]
  [N
    [D [a] ]
    [book] ] ]
\end{forest}


\end{document}

enter image description here

This gets the dotted lines right and also aligns the words at the baseline. However, the alignment of the nodes is not right. If I could have N exactly on top of book and V above reads and do this in the style definition, this would be the preferred solution. Is there a way to do this in forest?

5

This is an attempt where tikz tree is used. To align the text at the bottom a dfont style is defined.

enter image description here

Code

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes,trees,calc}
\begin{document}
\tikzset{ 
treenode/.style = {inner sep=0pt, outer sep=2pt, font=\sffamily},
edge from parent/.style={draw, edge from parent path=
    {(\tikzparentnode.south) -- (\tikzchildnode.north)}},
dfont/.style={dashed,font=\vphantom{Ag},anchor=north}  % to align the text at the bottom
}

\begin{tikzpicture}
 [
% Children and edges style
    level distance=1cm,
    level 1/.style={sibling distance=2cm},
    level 2/.style={sibling distance=2cm},
    level 3/.style={sibling distance=3.5cm},
    level 4/.style={sibling distance=6cm},
    level 5/.style={sibling distance=3cm}
    ]
%% Draw events and edges
 \node (g) [treenode] {are}
            child {node[treenode] (a) {We}}    % left
            child {node[treenode] (b) {trying} % right  
                     child[missing]
            child {node[treenode] (c) {to}
                     child[missing]
            child {node[treenode](d) {understand}
                     child[missing]
            child {node[treenode] (e) {difference}    
                   child {node[treenode](f){the}}
                   child[missing]}
}
}
};  
\node (a1) at ($(a)+(0,-6)$){};
\draw[dfont] (a) -- (a|-a1)node[]{We};
\draw[dfont] (g) -- (g|-a1)node[]{are};
\draw[dfont] (b) -- (b|-a1)node[]{trying};
\draw[dfont] (c) -- (c|-a1)node[]{to};
\draw[dfont] (d) -- (d|-a1)node[]{understand};
\draw[dfont] (f) -- (f|-a1)node[]{the};
\draw[dfont] (e) -- (e|-a1)node[]{difference.};
\end{tikzpicture}
\end{document}
  • maybe add anchor=north to style of nodes at the bottom? – Bordaigorl Sep 27 '14 at 14:50
3

A bit kludgy, but shows how to specify a custom growth function and a sneaky way of duplicating the words at the bottom. I pinched a couple of styles from from Jesse's answer:

\documentclass[tikz, border=5]{standalone}
% An (incomplete) growth function
\makeatletter
\def\tikz@grow@tree{%
  \tikzset{shift=(270:\tikzleveldistance)}%
  \ifcase\tikznumberofchildren%
  \or     
  \or
     \tikzset{shift=(0:{(\tikznumberofcurrentchild-1)*\tikzsiblingdistance})}
  \else%
     \tikzset{shift=(0:{(\tikznumberofcurrentchild-1-\tikznumberofchildren+2)*\tikzsiblingdistance})}
  \fi
}

\tikzset{%
  dependency tree/.code={\let\tikz@grow=\tikz@grow@tree},
  leaf level/.store in=\tikzleaflevel,
  tree node/.style={inner sep=0pt, outer sep=2pt, font=\sffamily},
     edge from parent/.style={draw, edge from parent path={(\tikzparentnode.south) -- (\tikzchildnode.north)}},
  leaf/.style={level distance=(\tikzleaflevel-\the\tikztreelevel)*1cm,
    edge from parent/.append style={dashed}, execute at begin node=\strut}
}
\def\wordnode#1{ node [tree node] {#1} child [leaf] { node {#1} } }

\begin{document}
\begin{tikzpicture}[level distance=1cm,dependency tree, leaf level=8]

 \node [tree node] 
   {are}
   child { \wordnode{We} }    
   child [leaf] { node {are} }
   child { \wordnode {trying} 
     child { \wordnode {to} 
       child  { \wordnode{understand} 
         child [sibling distance=3cm] { \wordnode{difference}           
           child [xscale=-1, sibling distance=1.5cm] { \wordnode{the}
    }}}}};  

\end{tikzpicture}
\end{document}

enter image description here

1

The calign with current edge option did the trick:

\documentclass{article}

\usepackage{forest}


\forestset{
dg edges/.style={for tree={parent anchor=south, child anchor=north,align=center,base=bottom,where n children=0{tier=word,edge=dotted,calign with current edge}{}}},
}


\begin{document}

\begin{forest}
dg edges
[V
  [N
    [D [the] ]
     [child] ]
  [reads]
  [N
    [D [a] ]
    [book] ] ]
\end{forest}


\end{document}

enter image description here

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.