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
|
#let sender-block(sender) = if type(sender) == dictionary {
text(weight: "medium", tracking: 0.03em)[#smallcaps(sender.name)]
if sender.at("address", default: none) != none {
v(0.35em)
text(size: 0.85em, fill: luma(30%))[#sender.address]
}
} else {
sender
}
#let recipient-block(recipient) = if type(recipient) == dictionary {
recipient.name
if recipient.at("address", default: none) != none {
linebreak()
text(size: 0.9em, fill: luma(30%))[#recipient.address]
}
} else {
recipient
}
#let letter(
sender: none,
recipient: none,
place: none,
date: none,
subject: none,
opening: [Madame, Monsieur,],
closing: [Veuillez agréer, Madame, Monsieur, l'expression de mes salutations distinguées.],
signature: none,
lang: "fr",
region: "FR",
font: "EB Garamond",
size: 11pt,
doc,
) = {
set page(paper: "a4", margin: (x: 26mm, top: 30mm, bottom: 26mm), numbering: none)
set par(justify: true, leading: 0.72em, spacing: 1.3em)
set text(font: font, size: size, lang: lang, region: region, number-type: "old-style")
let dateline = if place != none and date != none {
[#place, le #date]
} else if date != none {
[le #date]
} else {
place
}
let sign = if signature != none {
signature
} else if type(sender) == dictionary {
sender.name
} else {
none
}
grid(
columns: (1fr, 1fr),
align: (left + top, right + top),
sender-block(sender),
{
recipient-block(recipient)
if dateline != none {
if recipient != none { v(1.4em) }
dateline
}
},
)
v(1.9em)
line(length: 100%, stroke: 0.4pt)
v(1.9em)
if subject != none {
[#text(weight: "bold")[Objet :] #subject]
v(1.4em)
}
opening
v(0.6em)
doc
v(1.6em)
closing
if sign != none {
v(3.2em)
align(right, smallcaps(sign))
}
}
|