summaryrefslogtreecommitdiff
path: root/macros/xetex/latex/langsci/langsci-forest-setup.sty
blob: 7a9f3e4ef6f0386c3797a5febba25c9ca2a6678e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%      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}

\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}}


% does not work with forest v1.05 did not check later versions
\usepackage[linguistics]{forest}
%\usepackage[external,linguistics]{forest}
%\tikzset{external/up to date check=simple}
% for texlive: -shell-escape, for miktex -enable-write18
% All externalized graphics go go the \externaldirectory
%\tikzexternalize[prefix=external-figures/,shell escape=-shell-escape]
%\tikzset{external/system call={xelatex \tikzexternalcheckshellescape -halt-on-error -interaction=batchmode -jobname "\image" "\texsource"}}
%\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},
% 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},
%
%
%
typehierarchy/.style={for tree={parent anchor=south, child
    anchor=north,align=center,base=top,font=\itshape,fit=rectangle}},
% if there are instances as leaves in the hiarchy
instance/.style={edge=dotted},
%
% 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}}{}}
     }
}