# Forest for linguistics - proportional alignment like in qtree

I'm new to forest. Is there a style (or a modification of what's below) which produces the alignment of empty terminal nodes F3 and F4 in Tree A just like in Tree B?

\documentclass{standalone}
\usepackage{forest}
%\forestset{nice nodes/.style={for tree={inner sep=0pt,s sep=.2in,align=center, anchor=north}},default preamble=nice nodes, }
\useforestlibrary{linguistics}
\forestapplylibrarydefaults{linguistics}
\begin{document}

Tree A:

\begin{forest}
[
[DP, name=target[a labelled\\ subtree, roof]]
[F$_4$P[F$_4$]
[F$_3$P[F$_3$]
[F$_2$P[F$_2$][\hspace{10pt}F$_1$P $\Rightarrow$ something,
name=t[is there a way\\to move this label\\to the right?, roof]]]]]]]
\end{forest}

Tree B:

\begin{forest}
[
[DP, name=target[a labelled\\ subtree, roof]]
[F$_4$P[F$_4$[$\emptyset$]]
[F$_3$P[F$_3$[]]
[F$_2$P[F$_2$][\hspace{10pt}F$_1$P $\Rightarrow$ something,
name=t[I miss qtree, roof]]]]]]]
\end{forest}
\end{document}


A separate issue is the problem of moving a node label (F4P in the trees) to the right, so that it is not centered wrt to the node. Here is what I get:

PS. The skeleton I'm using tolerates qtree and tikz-qtree but does not want to tolerate arrows in neither qtree nor tikz-qtree in XeLaTeX, so I'll need to stick to forest, I guess. That's why I'm trying to have a nice proportional tree in forest rather than using simply qtree.

• You don't have any labels in your tree. Really confused.
– cfr
Mar 30, 2017 at 1:20
• @cfr -- I've edited the post. It should be clear now. "Labels" are the names of the nodes in the linguistic trees. The top-most node is the only one which I left unlabelled. Other labels in these two tree diarams are DP, F4P, F4, F3P, F3, F2P, F2, F1P=>something. Thanks. Mar 30, 2017 at 11:01
• Thanks. It is a bit confusing because, in Forest's terms, nodes can have labels, though yours do not :-).
– cfr
Mar 30, 2017 at 12:14

I think for your main question, you probably just want to add fit=band to the tree.

Note that anchor=center is default for linguistics.

\documentclass[border=10pt,multi,tikz]{standalone}
\usepackage[linguistics]{forest}
\forestset{
nice nodes/.style={
for tree={
inner sep=0pt,
fit=band,
},
},
default preamble=nice nodes,
}
\begin{document}
\begin{forest}
[
[DP, name=target
[nodes F$_3$ and F$_4$ do\\
align appropriately\\
(I think)\\
wrt F$_2$, roof
]
]
[F$_4$P
[F$_4$]
[F$_3$P
[F$_3$]
[F$_2$P
[F$_2$]
[\hspace{10pt}F$_1$P$\Rightarrow$something, name=t
[is there a way\\to move this label\\to the right?, roof
]
]
]
]
]
]
\end{forest}
\end{document}


I'm not quite sure what you want to shift where. What you are calling the node label is actually not a label, but the node content. Nodes can have labels and contents, so this may be a source of confusion.

You can shift the node at the bottom right right (or left). However, I'm not sure if that is really what you mean.

            [is there a way\\to move this label\\to the right?, roof, xshift=10pt
]


To avoid a lopsided roof, we can redefine the edge path.

            [is there a way\\to move this label\\to the right?, xshift=10pt, edge path'={(!u.parent anchor) ++(5pt,0) -- (.north east) -- (.north west) -- cycle}
]


If you need this a lot, a style would be convenient.

  shift with roof/.style={
xshift=#1,
edge path'={(!u.parent anchor) ++(#1/2,0) -- (.north east) -- (.north west) -- cycle}
},


Then we can write just

            [is there a way\\to move this label\\to the right?, shift with roof=10pt
]


to produce the same output as above.

You can make the top less 'pointy' by increasing the distance between the root's children. Possibly a bit extreme:

  [, s sep'+=20pt


A bit less extreme may be better.

\documentclass[border=10pt,multi,tikz]{standalone}
\usepackage[linguistics]{forest}
\forestset{
nice nodes/.style={
for tree={
inner sep=0pt,
fit=band,
},
},
default preamble=nice nodes,
shift with roof/.style={
xshift=#1,
edge path'={(!u.parent anchor) ++(#1/2,0) -- (.north east) -- (.north west) -- cycle}
},
}
\begin{document}
\begin{forest}
[, s sep'+=10pt
[DP, name=target
[nodes F$_3$ and F$_4$ do\\
align appropriately\\
(I think)\\
wrt F$_2$, roof
]
]
[F$_4$P
[F$_4$]
[F$_3$P
[F$_3$]
[F$_2$P
[F$_2$]
[\hspace{10pt}F$_1$P$\Rightarrow$something, name=t
[is there a way\\to move this label\\to the right?, shift with roof=10pt
]
]
]
]
]
]
\end{forest}
\end{document}

• Excellent, thanks! This works! Btw, I did manage to add an annotation to the left of the node label (="content" in forest termiology) by using node[right] in the \draw command -- the solution taken directly from the last page of this: (ling.auf.net/lingbuzz/003391), as shown in my answer below. Thanks! Mar 30, 2017 at 21:39
• @oliver Wouldn't label=right:annotation be easier?
– cfr
Mar 30, 2017 at 21:46
• I don't know. Can you please modify my code below with this? I'll see how it works. Thanks. Mar 30, 2017 at 21:52
• @oliver Just add label=right:annotation as an option to the node you want annotated. It will just get passed to TikZ's label when the node is constructed.
– cfr
Mar 30, 2017 at 21:54
• Excellent! It works. Indeed, a more comfortable option. Thanks. Mar 30, 2017 at 22:00
\documentclass{standalone}
\usepackage{forest}
\forestset{
nice nodes/.style={
for tree={
inner sep=1pt, s sep=12pt,
fit=band,
},
},
default preamble=nice nodes,
}
\useforestlibrary{linguistics}
\forestapplylibrarydefaults{linguistics}
\begin{document}

\begin{forest}
[
[DP, name=target[nodes F$_3$ and F$_4$ do\\ not align vertically\\ wrt           F$_2$, roof]]
[F$_4$P[F$_4$]    [F$_3$P[F$_3$]
[F$_2$P[F$_2$]    [F$_1$P, name=t[I miss qtree, roof]]
{ \draw (.east) node[right]{$\Rightarrow$ \textit{adjective}}; } ]]]]]
%\draw[->] (t) to[out=south west,in=south] (target);
\end{forest}
\end{document}


Which give me this: