Initial commit
This commit is contained in:
commit
5cd99ebd59
6
justfile
Normal file
6
justfile
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
default:
|
||||||
|
just --list
|
||||||
|
|
||||||
|
|
||||||
|
build-example:
|
||||||
|
typst leipzig-gloss-examples.typ
|
138
leipzig-gloss-examples.typ
Normal file
138
leipzig-gloss-examples.typ
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
#import "leipzig-gloss.typ": gloss, numbered_gloss
|
||||||
|
#import "linguistic-abbreviations.typ": *
|
||||||
|
|
||||||
|
= Leipzig Glossing Examples
|
||||||
|
|
||||||
|
This is the classic example of the inflected Georgian verb with an 8-segment consonant cluster:
|
||||||
|
|
||||||
|
#gloss(
|
||||||
|
source_text: ([გვ-ფრცქვნ-ი],),
|
||||||
|
source_text_style: none,
|
||||||
|
transliteration: ([gv-prtskvn-i],),
|
||||||
|
morphemes: ([1pl.#obj\-peel-#fmnt],),
|
||||||
|
translation: "You peeled us",
|
||||||
|
)
|
||||||
|
|
||||||
|
Some more Georgian:
|
||||||
|
|
||||||
|
#gloss(
|
||||||
|
header_text: [from "Georgian and the Unaccusative Hypothesis", Harris, 1982],
|
||||||
|
source_text: ([ბავშვ-ი], [ატირდა]),
|
||||||
|
source_text_style: (item) => text(fill: red)[#item],
|
||||||
|
transliteration: ([bavšv-i], [aṭirda]),
|
||||||
|
morphemes: ([child-#smallcaps[nom]], [3S/cry/#smallcaps[incho]/II]),
|
||||||
|
translation: [The child burst out crying],
|
||||||
|
)
|
||||||
|
|
||||||
|
```typst
|
||||||
|
|
||||||
|
#gloss(
|
||||||
|
header_text: [from "Georgian and the Unaccusative Hypothesis", Harris, 1982],
|
||||||
|
source_text: ([ბავშვ-ი], [ატირდა]),
|
||||||
|
source_text_style: (item) => text(fill: red)[#item],
|
||||||
|
transliteration: ([bavšv-i], [aṭirda]),
|
||||||
|
morphemes: ([child-#smallcaps[nom]], [3S/cry/#smallcaps[incho]/II]),
|
||||||
|
translation: [The child burst out crying],
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
And how about an example in English:
|
||||||
|
|
||||||
|
#gloss(
|
||||||
|
source_text: ([I'm], [eat-ing], [your], [head]),
|
||||||
|
morphemes: ([1#sg.#sbj\=to.be], [eat-#prog], [2#sg.#pos], [head]),
|
||||||
|
morphemes_style: text.with(fill: blue),
|
||||||
|
translation: text(weight: "semibold")[I'm eating your head!],
|
||||||
|
)
|
||||||
|
|
||||||
|
```typst
|
||||||
|
#gloss(
|
||||||
|
source_text: ([I'm], [eat-ing], [your], [head]),
|
||||||
|
morphemes: ([1#sg.#subj\=to.be], [eat-#prog], [2#sg.#pos], [head]),
|
||||||
|
morphemes_style: text.with(fill: blue),
|
||||||
|
translation: text(weight: "semibold")[I'm eating your head!],
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
== Leipzig Glossing Rules PDF examples
|
||||||
|
|
||||||
|
See https://www.eva.mpg.de/lingua/pdf/Glossing-Rules.pdf
|
||||||
|
|
||||||
|
|
||||||
|
#numbered_gloss(
|
||||||
|
header_text: [Indonesian (Sneddon 1996:237)],
|
||||||
|
source_text: ([Mereka], [di], [Jakarta], [sekarang.]),
|
||||||
|
morphemes: ([they], [in], [Jakarta], [now]),
|
||||||
|
translation: "They are in Jakarta now",
|
||||||
|
)
|
||||||
|
|
||||||
|
#numbered_gloss(
|
||||||
|
header_text: [Lezgian (Haspelmath 1993:207)],
|
||||||
|
source_text: ([Gila], [abur-u-n], [ferma], [hamišaluǧ], [güǧüna], [amuq’-da-č.]),
|
||||||
|
morphemes: ([now], [they-#obl\-#gen], [farm], [forever], [behind], [stay-#fut\-#neg]),
|
||||||
|
translation: "Now their farm will not stay behind forever.",
|
||||||
|
)
|
||||||
|
|
||||||
|
#numbered_gloss(
|
||||||
|
header_text: [West Greenlandic (Fortescue 1984:127)],
|
||||||
|
source_text: ([palasi=lu], [niuirtur=lu]),
|
||||||
|
morphemes: ([priest=and], [shopkeeper=and]),
|
||||||
|
translation: "both the priest and the shopkeeper",
|
||||||
|
)
|
||||||
|
|
||||||
|
#numbered_gloss(
|
||||||
|
header_text: [Hakha Lai],
|
||||||
|
source_text: ([a-nii -láay],),
|
||||||
|
morphemes: ([3#sg\-laugh-#fut],),
|
||||||
|
translation: [s/he will laugh],
|
||||||
|
)
|
||||||
|
|
||||||
|
#numbered_gloss(
|
||||||
|
header_text: [Russian],
|
||||||
|
source_text: ([My], [s], [Marko], [poexa-l-i], [avtobus-om], [v], [Peredelkino]),
|
||||||
|
morphemes: ([1#pl], [#com], [Marko], [go-#pst\-#pl], [bus-#ins], [#all], [Peredelkino]),
|
||||||
|
additional_gloss_lines: (([we], [with], [Marko], [go-#pst\-#pl], [bus-by], [to], [Peredelkino]),),
|
||||||
|
translation: "Marko and I went to Perdelkino by bus",
|
||||||
|
)
|
||||||
|
|
||||||
|
#numbered_gloss(
|
||||||
|
header_text: [Turkish],
|
||||||
|
source_text: ([çık-mak],),
|
||||||
|
morphemes: ([come.out-#inf],),
|
||||||
|
translation: "to come out",
|
||||||
|
)
|
||||||
|
|
||||||
|
#numbered_gloss(
|
||||||
|
header_text: [Latin],
|
||||||
|
source_text: ([insul-arum],),
|
||||||
|
morphemes: ([island-#gen\-#pl],),
|
||||||
|
translation: "of the islands",
|
||||||
|
)
|
||||||
|
|
||||||
|
#numbered_gloss(
|
||||||
|
header_text: [French],
|
||||||
|
source_text: ([aux], [chevaux]),
|
||||||
|
morphemes: ([to-#art\-#pl],[horse.#pl]),
|
||||||
|
translation: "to the horses",
|
||||||
|
)
|
||||||
|
|
||||||
|
#numbered_gloss(
|
||||||
|
header_text: [German],
|
||||||
|
source_text: ([unser-n], [Väter-n]),
|
||||||
|
morphemes: ([our-#dat\-#pl],[father.#pl\-#dat.#pl]),
|
||||||
|
translation: "to our fathers",
|
||||||
|
)
|
||||||
|
|
||||||
|
#numbered_gloss(
|
||||||
|
header_text: [Hittite (Lehmann 1982:211)],
|
||||||
|
source_text: ([n=an], [apedani], [mehuni],[essandu.]),
|
||||||
|
morphemes: ([#smallcaps[conn]=him], [that.#dat.#sg], [time.#dat.#sg], [eat.they.shall]),
|
||||||
|
translation: "They shall celebrate him on that date",
|
||||||
|
)
|
||||||
|
|
||||||
|
#numbered_gloss(
|
||||||
|
header_text: [Jaminjung (Schultze-Berndt 2000:92)],
|
||||||
|
source_text: ([nanggayan], [guny-bi-yarluga?]),
|
||||||
|
morphemes: ([who], [2#du.#A.3#sg.#P\-#fut\-poke]),
|
||||||
|
translation: "Who do you two want to spear?",
|
||||||
|
)
|
104
leipzig-gloss.typ
Normal file
104
leipzig-gloss.typ
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
#let gloss_count = counter("gloss_count")
|
||||||
|
|
||||||
|
#let gloss_lines(spacing_between_items, formatters, gloss_line_lists) = {
|
||||||
|
assert(gloss_line_lists.len() > 0, message: "Gloss line lists cannot be empty")
|
||||||
|
|
||||||
|
let len = gloss_line_lists.at(0).len()
|
||||||
|
|
||||||
|
for line in gloss_line_lists {
|
||||||
|
assert(line.len() == len)
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(formatters.len() == gloss_line_lists.len(), message: "The number of formatters and the number of gloss line lists should be equal")
|
||||||
|
|
||||||
|
let make_item_box(..args) = {
|
||||||
|
box(stack(dir: ttb, spacing: 0.5em, ..args))
|
||||||
|
}
|
||||||
|
|
||||||
|
for item_index in range(0, len) {
|
||||||
|
let args = ()
|
||||||
|
for line_idx, formatter in formatters {
|
||||||
|
let formatter_fn = if formatter == none {
|
||||||
|
(x) => x
|
||||||
|
} else {
|
||||||
|
formatter
|
||||||
|
}
|
||||||
|
|
||||||
|
let item = gloss_line_lists.at(line_idx).at(item_index)
|
||||||
|
args.push(formatter_fn(item))
|
||||||
|
}
|
||||||
|
make_item_box(..args)
|
||||||
|
h(spacing_between_items)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#let gloss(
|
||||||
|
header_text: none,
|
||||||
|
source_text: (),
|
||||||
|
source_text_style: emph,
|
||||||
|
transliteration: none,
|
||||||
|
transliteration_style: none,
|
||||||
|
morphemes: (),
|
||||||
|
morphemes_style: none,
|
||||||
|
additional_gloss_lines: (), //List of list of content
|
||||||
|
translation: none,
|
||||||
|
spacing_between_items: 1em,
|
||||||
|
numbering: false,
|
||||||
|
) = {
|
||||||
|
|
||||||
|
assert(type(source_text) == "array", message: "source_text needs to be an array; perhaps you forgot to type `(` and `)`, or a trailing comma?")
|
||||||
|
assert(type(morphemes) == "array", message: "morphemes needs to be an array; perhaps you forgot to type `(` and `)`, or a trailing comma?")
|
||||||
|
|
||||||
|
assert(source_text.len() == morphemes.len(), message: "source_text and morphemes have different lengths")
|
||||||
|
|
||||||
|
if transliteration != none {
|
||||||
|
assert(transliteration.len() == source_text.len(), message: "source_text and transliteration have different lengths")
|
||||||
|
}
|
||||||
|
|
||||||
|
let gloss_items = {
|
||||||
|
|
||||||
|
if header_text != none {
|
||||||
|
header_text
|
||||||
|
linebreak()
|
||||||
|
}
|
||||||
|
|
||||||
|
let formatters = (source_text_style,)
|
||||||
|
let gloss_line_lists = (source_text,)
|
||||||
|
|
||||||
|
if transliteration != none {
|
||||||
|
formatters.push(transliteration_style)
|
||||||
|
gloss_line_lists.push(transliteration)
|
||||||
|
}
|
||||||
|
|
||||||
|
formatters.push(morphemes_style)
|
||||||
|
gloss_line_lists.push(morphemes)
|
||||||
|
|
||||||
|
for additional in additional_gloss_lines {
|
||||||
|
formatters.push(none) //TODO fix this
|
||||||
|
gloss_line_lists.push(additional)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
gloss_lines(spacing_between_items, formatters, gloss_line_lists)
|
||||||
|
|
||||||
|
if translation != none {
|
||||||
|
linebreak()
|
||||||
|
["#translation"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let gloss_number = if numbering {
|
||||||
|
[(#gloss_count.display())]
|
||||||
|
} else {
|
||||||
|
none
|
||||||
|
}
|
||||||
|
|
||||||
|
[#gloss_number #pad(left: 1em)[#gloss_items]]
|
||||||
|
|
||||||
|
if numbering {
|
||||||
|
gloss_count.step()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#let numbered_gloss = gloss.with(numbering: true)
|
128
linguistic-abbreviations.typ
Normal file
128
linguistic-abbreviations.typ
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
#let fmnt = smallcaps([fmnt])
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Appendix: List of Standard Abbreviations
|
||||||
|
|
||||||
|
1 first person
|
||||||
|
2 second person
|
||||||
|
3 third person
|
||||||
|
A agent-like argument of canonical transitive verb
|
||||||
|
ABL ablative
|
||||||
|
ABS absolutive
|
||||||
|
ACC accusative
|
||||||
|
ADJ adjective
|
||||||
|
ADV adverb(ial)
|
||||||
|
AGR agreement
|
||||||
|
ALL allative
|
||||||
|
ANTIP antipassive
|
||||||
|
APPL applicative
|
||||||
|
ART article
|
||||||
|
AUX auxiliary
|
||||||
|
BEN benefactive
|
||||||
|
*/
|
||||||
|
#let A = smallcaps([a])
|
||||||
|
#let all = smallcaps([all])
|
||||||
|
#let art = smallcaps([art])
|
||||||
|
|
||||||
|
/*
|
||||||
|
CAUS causative
|
||||||
|
CLF classifier
|
||||||
|
COM comitative
|
||||||
|
COMP complementizer
|
||||||
|
COMPL completive
|
||||||
|
COND conditional
|
||||||
|
COP copula
|
||||||
|
CVB converb
|
||||||
|
DAT dative
|
||||||
|
DECL declarative
|
||||||
|
DEF definite
|
||||||
|
DEM demonstrative
|
||||||
|
DET determiner
|
||||||
|
DIST distal
|
||||||
|
*/
|
||||||
|
#let com = smallcaps([com])
|
||||||
|
#let dat = smallcaps([dat])
|
||||||
|
|
||||||
|
/*
|
||||||
|
DISTR distributive
|
||||||
|
DU dual
|
||||||
|
DUR durative
|
||||||
|
ERG ergative
|
||||||
|
EXCL exclusive
|
||||||
|
F feminine
|
||||||
|
FOC focus
|
||||||
|
FUT future
|
||||||
|
GEN genitive
|
||||||
|
IMP imperative
|
||||||
|
INCL inclusive
|
||||||
|
IND indicative
|
||||||
|
INDF indefinite
|
||||||
|
INF infinitive
|
||||||
|
INS instrumental
|
||||||
|
INTR intransitive
|
||||||
|
IPFV imperfective
|
||||||
|
*/
|
||||||
|
|
||||||
|
#let du = smallcaps([du])
|
||||||
|
#let fut = smallcaps([fut])
|
||||||
|
#let gen = smallcaps([gen])
|
||||||
|
#let inf = smallcaps([inf])
|
||||||
|
#let ins = smallcaps([ins])
|
||||||
|
|
||||||
|
/*
|
||||||
|
IRR irrealis
|
||||||
|
LOC locative
|
||||||
|
M masculine
|
||||||
|
N neuter
|
||||||
|
N- non- (e.g. NSG nonsingular, NPST nonpast)
|
||||||
|
NEG negation, negative
|
||||||
|
NMLZ nominalizer/nominalization
|
||||||
|
NOM nominative
|
||||||
|
OBJ object
|
||||||
|
OBL oblique
|
||||||
|
P patient-like argument of canonical transitive verb
|
||||||
|
PASS passive
|
||||||
|
PFV perfective
|
||||||
|
PL plural
|
||||||
|
*/
|
||||||
|
|
||||||
|
#let obl = smallcaps([obl])
|
||||||
|
#let neg = smallcaps([neg])
|
||||||
|
#let obj = smallcaps([obj])
|
||||||
|
#let pl = smallcaps([pl])
|
||||||
|
/*
|
||||||
|
POSS possessive
|
||||||
|
PRED predicative
|
||||||
|
PRF perfect
|
||||||
|
PRS present
|
||||||
|
PROG progressive
|
||||||
|
PROH prohibitive
|
||||||
|
PROX proximal/proximate
|
||||||
|
PST past
|
||||||
|
PTCP participle
|
||||||
|
PURP purposive
|
||||||
|
Q question particle/marker
|
||||||
|
QUOT quotative
|
||||||
|
RECP reciprocal
|
||||||
|
REFL reflexive
|
||||||
|
*/
|
||||||
|
#let P = smallcaps([p])
|
||||||
|
#let pos = smallcaps([pos])
|
||||||
|
#let prog = smallcaps([prog])
|
||||||
|
#let pst = smallcaps([pst])
|
||||||
|
|
||||||
|
/*
|
||||||
|
REL relative
|
||||||
|
RES resultative
|
||||||
|
S single argument of canonical intransitive verb
|
||||||
|
SBJ subject
|
||||||
|
SBJV subjunctive
|
||||||
|
SG singular
|
||||||
|
TOP topic
|
||||||
|
TR transitive
|
||||||
|
VOC vocative
|
||||||
|
*/
|
||||||
|
|
||||||
|
#let sg = smallcaps([sg])
|
||||||
|
#let sbj = smallcaps([sbj])
|
Loading…
Reference in New Issue
Block a user