# Typesetting Dependency Grammar trees

I try to typeset dependency trees:

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] ]
[N
[D [a] ]
[book] ] ]
\end{forest}

\end{document}


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?

• After 5 minutes on google, I found this http://en.wikibooks.org/wiki/LaTeX/Linguistics#Syntactic_trees. – Václav Pavlík Sep 27 '14 at 11:28
• pstricks is quite compatible with XeLaTeX (and even with pdfLaTeX, provided you compile with the option --shell-escape or --enable-write18 and load pstricks with the pdf option). – Bernard Sep 27 '14 at 11:54
• Don't know if this question is related (i.e., an alternate way of showing similar information): tex.stackexchange.com/questions/183032/sentence-diagramming – Steven B. Segletes Sep 27 '14 at 11:56
• – cfr Sep 28 '14 at 1:33
• Thanks for all these hints. I knew most of the packages (I did typeset a text book about grammatical theory), but they do not do what I want. As for pstricks, the problem is: If you do a 500 page book, it takes ages to compile the stuff with the shell escapes. I want to get rid of this. I used to use dvips-tree, but this is not compatible with xelatex, so I converted everything to pstricks, but as I said, it slows down things. – Stefan Müller Sep 28 '14 at 6:35

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

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

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}


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] ]