%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% File: langsci-forest-setup.sty %% Author: Language Science Press (http://langsci-press.org) %% Date: 2016-01-16 16:47:43 UTC %% Purpose: This file contains optional styles and settings for the %% forest package. This version is for 2.0. %% Language: LaTeX %% Licence: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % texlive 2015 is broken (in comparison to texlive 2013) % a workaround is to use a different pgf driver. % See email from Akira Kakuto to Stefan Müller 15.01.2016 % Do we need this for 2017? % We seem to be better off without it 31.10.2017 %deceive the driver %\def\pdftexversion{140} %use the old driver for dvipdfm %\def\pgfsysdriver{pgfsys-dvipdfm.def} % http://en.wikibooks.org/wiki/LaTeX/Linguistics#Syntactic_trees \usepackage{tikz-dependency} % dangerous, use at own risk %\usetikzlibrary{tikzmark} % saves positions in tikz pictures, allows to connect arbitrary text % http://tex.stackexchange.com/questions/256280/drawing-complex-dependency-diagrams-with-tikz-forest \usetikzlibrary{arrows.meta} \tikzset{deparrow/.style={-Latex}}%,blue}} % externalization works with package memoize \usepackage[linguistics]{forest} %\usepackage{morewrites} % specification for all trees, "default preamble" appends to existing specification. % The version with apostrophe replaces it. \forestset{default preamble'={ for tree={align=center,parent anchor=south, child anchor=north,anchor=north,base=bottom}, % anchor=north was introduced to get alignments of AVMs right. % used to be anchor=north but this fails on trees in \ea \z examples, St. Mü. 02.05.2020 or may be not % % This would align trees to the baseline. We do not want this for TAG % where several trees have to be aligned with respect to their center. % before drawing tree={ % sort by=y, % for min={tree}{baseline} % } }} \forestset{ declare dimen={child anchor yshift}{0pt}, adjust childrens child anchors/.style={ if n children>=2{ before packing={ tempdima/.max={max_y}{children}, for children={ child anchor yshift=tempdima()-max_y() }, } }{} }, default preamble={ for tree={ edge path'={(!u.parent anchor)--([yshift=\forestoption{child anchor yshift}].child anchor)}, adjust childrens child anchors } }, } % http://www.texample.net/tikz/examples/borrowers-and-lenders/ \usetikzlibrary{arrows} %,positioning} \tikzset{ %Define standard arrow tip >=stealth'} %% \forestset{ %% sn edges/.style={for tree={parent anchor=south, child anchor=north,align=center,base=bottom,where n children=0{tier=word}{}}}, %% background tree/.style={for tree={text opacity=0.2,draw opacity=0.2,edge={draw opacity=0.2}}} %% } % The following code fixes the size of triangles for examples with translations. The specification % ",delay=with translation" at the leaves is important to make this work. % http://tex.stackexchange.com/questions/167978/smaller-roofs-for-forest/205311#205311 \forestset{ with translation/.style={ l sep=0,inner xsep=0, append translation/.expanded/.wrap pgfmath arg={\gettranslation{##1}}{content}, content/.expanded/.wrap pgfmath arg={\gettext{##1}}{content}, }, append translation/.style={ if={strequal("#1","")}{}{ append={[#1,no edge,inner xsep=0,inner ysep=0,outer ysep=0, tier=gloss, % does not work for TAG trees since the words are not aligned at the baseline l=\baselineskip + 0.2ex, ]} } } } \forestset{ with unaligned translation/.style={ l sep=0,inner xsep=0, append unaligned translation/.expanded/.wrap pgfmath arg={\gettranslation{##1}}{content}, content/.expanded/.wrap pgfmath arg={\gettext{##1}}{content}, }, append unaligned translation/.style={ if={strequal("#1","")}{}{ append={[#1,no edge,inner xsep=0,inner ysep=0,outer ysep=0, %tier=gloss, % does not work for TAG trees since the words are not aligned at the baseline l=\baselineskip + 0.2ex, ]} } } } \def\gettext#1{\gettextA#1;;\endget} \def\gettextA#1;#2;{\removesep#1;} \def\gettranslation#1{\gettranslationA#1;;\endget} \def\gettranslationA#1;#2;{\removesep#2;} \def\removesep#1;#2\endget{#1} % copy of the above for TAG \forestset{ with translation TAG/.style={ l sep=0,inner xsep=0, append translation TAG/.expanded/.wrap pgfmath arg={\gettranslation{##1}}{content}, content/.expanded/.wrap pgfmath arg={\gettext{##1}}{content}, }, append translation TAG/.style={ if={strequal("#1","")}{}{ append={[#1,no edge,inner xsep=0,inner ysep=0,outer ysep=0, %tier=gloss, % does not work for TAG trees since the words are not aligned at the baseline l=\baselineskip + 0.2ex, ]} } } } % a specific style that specifies the word tier: all nodes that do not have any children % to do: make this style default and change all other figures explicitely as is described here: % http://tex.stackexchange.com/questions/167983/getting-rid-of-a-default-where-specification \forestset{ sm edges/.style={for tree={parent anchor=south, child anchor=north,base=top}, % changed base=bottom % to top since we have NP and AVM nodes and the NP has to start % right away at the same hight as the AVM St. Mü. 18.10.2017 where n children=0{tier=word,delay=with translation}{} %,delay=with translation }, sm edges without translation/.style={for tree={parent anchor=south, child anchor=north,base=bottom}, where n children=0{tier=word}{} }, word tier/.style={where n children=0{tier=word}{} }, % % dependency grammar trees, projective trees only, I guess. St. Mü. 29.09.2014 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,delay=with translation}{} }, % % Adjunct edges as suggested by Engels, 1977 % http://tex.stackexchange.com/questions/204770/defining-a-special-edge-style-for-connecting-nodes-in-forest/204819#204819 dg adjunct/.style={edge path={\noexpand\path[\forestoption{edge}] (!u.parent anchor)--(.child anchor)-- +(0,#1)\forestoption{edge label};}}, % dg adjunct/.default=6pt, % % for Tesniere-style translations dg transfer/.style={edge path={\noexpand\path[\forestoption{edge}, rounded corners=3pt] % the line downwards (!u.parent anchor)-- +($(0,-l)-(0,4pt)$)-- +($(12pt,-l)-(0,4pt)$) % the horizontal line ($(!p.north west)+(0,l)-(0,20pt)$)--($(.north east)+(0,l)-(0,20pt)$)\forestoption{edge label};},!p.edge'={}}, % for Tesniere-style junctions dg junction/.style={no edge, tikz+={\draw (!p.east)--(!.west) (.east)--(!n.west);} }, % % % % http://tex.stackexchange.com/questions/256280/drawing-complex-dependency-diagrams-with-tikz-forest/256300#256300 % in the tree draw the highest nodes of the inheritance network. For lower nodes insert empty nodes % "[]". These will be filled by the same word and the numbers will be provided with bars according % to remoteness from the word level. % % So cool! Thanks Sašo Živanović % % modified to cope with multiple occurances of the same word (the, the1, the2) % wg/.style={ for tree={ no edge, draw, outer ysep=1pt, }, delay={ copy label, for tree={nameN/.option=content}, }, for tree={content format={\strut\forestoption{content}}}, where n children={0}{ tier=word, }{}, }, copy label/.style={ for children={ if content={}{ % content/.pgfmath={content("!u")}, content/.option=!u.content, % faster calign with current, edge={draw,{-Triangle[open,reversed]}}, copy label, % !u.content/.pgfmath={content}, !u.content/.option=content, % faster !u.content+=', }{ copy label, } } }, % 1. This is not effective if there's many clashes. % 2. Register tempcounta must be free to use. nameN/.style={ if nodewalk valid={name=#1}{ tempcounta=2, @nameN=#1, }{ name=#1, }, }, @nameN/.style={ while nodewalk valid={name/.process=Rw1{tempcounta}{#1##1}}{ tempcounta+=1, }, name/.process=Rw1{tempcounta}{#1##1}, }, % % % TAG % http://tex.stackexchange.com/questions/207459/getting-old-school-trees-with-forest % fit -> fit=band causes all nodes to have nothing below them tag/.style={for tree={parent anchor=south, child anchor=north,align=center,base=top,fit=rectangle}, where n children=0{delay=with translation TAG}{}, % the following breaks the alignments in sets begin draw/.code={\begin{tikzpicture}[baseline=(current bounding box.center)]} }, % % like the tag style, but without fit rectangle no word baseline/.style={for tree={parent anchor=south, child anchor=north,align=center,base=top}, where n children=0{delay=with translation}{}}, % % a style that creates an arrow pointing to the substitution node from a tree top node encoded as daughter substitution/.style={edge={<-,dashed},l+=\baselineskip}, % % % auxiliary nodes without node label %empty nodes/.style={ % delay={where content={}{shape=coordinate,for parent={for children={anchor=north}}}{}}} } % Manual page 52 %% \forestset{ %% nice empty nodes/.style={ %% for tree={calign=fixed edge angles}, %% delay={where content={}{shape=coordinate,for parent={for children={anchor=north}}}{}} %% }} % forest 2.0 \forestset{ empty nodes/.style={ delay={where content={}{shape=coordinate,for siblings={anchor=north}}{}} } } \forestset{ % Easy extra edges edge to'/.style 2 args={ tikz+={\path[#2](#1.parent anchor)--(.child anchor);} }, edge to/.style={ edge to'/.expanded={\unexpanded{#1}}{\forestoption{edge}}, }, edge from'/.style 2 args={ tikz+={\path[#2](.parent anchor)--(#1.child anchor);} }, edge from/.style={ edge from'/.process=_O{#1}{#1.edge}, }, % Identify two (adjacent, vertically aligned) nodes forget@node@boundary/.code={% \forestolet{positive@edge@#1}\relax \forestolet{negative@edge@#1}\relax }, identify/.style={ phantom, temptoksa/.option=#1.name, before typesetting nodes/.process=Rw1{temptoksa}{ content/.option=##1.content, content format/.option=##1.content format, node format/.option=##1.node format, }, for parent/.process=Ow1{n}{ after packing node={ for ##1={ ignore,ignore edge,forget@node@boundary/.option=grow, }, }, }, for nodewalk/.process=Rw1Ow1{temptoksa}{name=##1}{!u.name}{edge to={##1}}, }, % Uniformly spread any sequence of nodes spread/.style n args=4{ % #1 = coordinate (x,y,s,l) % #2 = nodewalk to spread % #3 = relative node name of the node with the final coordinate % #4 = final coordinate shift for nodewalk={ tempcounta'=-1, #2, tempdima/.pgfmath={(#1("#3")+#4-#1(""))/tempcounta()} }{tempcounta'+=1}, tempdimb'=0pt, for nodewalk={#2}{ #1'+/.register=tempdimb, tempdimb'+/.register=tempdima, }, }, } % The old type hierarchy style \forestset{ typehierarchy/.style={for tree={parent anchor=south, child % old version: % anchor=north,align=center,base=top,font=\itshape,fit=rectangle}}, % to get parallel lines: anchor=north,align=center,base=top,font=\itshape,calign=fixed angles}}, % if there are instances as leaves in the hiarchy instance/.style={edge=dotted} } % Type hierarchy (Saso 2020) \forestset{ type hierarchy/.style={ for tree={ anchor=base, %anchor=north, content format={\noexpand\type{\unexpanded{#1}\forestoption{content}}}, }, }, partition/.style={ content format={\noexpand\textsc{\forestoption{content}}}, draw, }, instance/.style={ gray,edge={gray,dashed} }, % if all leaves in the hierarchy are instances, we can declare this as follows: % nodes which do not have children (n children=0) are drawn in gray and edges leading to them are dashed instances/.style={ for tree={ s sep=0, if n children=0{ gray, edge={dashed,gray}, }{}, }}, } % AVM helper \forestset{ avm/.style={ content format={% \noexpand\avmoptions{#1}% \noexpand\begin{avm}% \forestoption{content}% \noexpand\end{avm}% }, }, }