add typst resumé (without profile picture)
This commit is contained in:
140
resumé/main.typ
Normal file
140
resumé/main.typ
Normal file
@@ -0,0 +1,140 @@
|
||||
#import "localize.typ": localize
|
||||
|
||||
#let languages = ("fr", "en")
|
||||
|
||||
#set page(
|
||||
paper: "a4",
|
||||
columns: 2,
|
||||
margin: 10mm,
|
||||
)
|
||||
|
||||
#languages.map(language => [
|
||||
|
||||
#set text(lang: language)
|
||||
#let accent-color = rgb(0x06, 0x92, 0xaa, 255)
|
||||
|
||||
#let load-section(path) = localize(language, yaml(path))
|
||||
|
||||
#let education = load-section("_data/sections/education.yml")
|
||||
#let experiences = load-section("_data/sections/experiences.yml")
|
||||
#let hobbies = load-section("_data/sections/hobbies.yml")
|
||||
#let languages = load-section("_data/sections/languages.yml")
|
||||
#let skills = load-section("_data/sections/skills.yml")
|
||||
#let introduction = load-section("_data/introduction.yml")
|
||||
|
||||
#let data = yaml("data.yml")
|
||||
#let words = localize(language, yaml("_data/words.yml"))
|
||||
|
||||
#let tr(key) = key.split(".").fold(words, (d, k) => d.at(k)).at(language)
|
||||
|
||||
#let date-range(date) = [ #date.begin --- #date.end ]
|
||||
|
||||
#let dotted-line = line(length: 100%, stroke: (paint: black, thickness: 1pt, dash: "loosely-dotted"))
|
||||
|
||||
#set text(font: "Atkinson Hyperlegible Next", size: 10pt)
|
||||
|
||||
#show heading.where(level: 1): it => block(width: 100%, text(32pt, it.body))
|
||||
|
||||
#show heading.where(level: 2): it => text(
|
||||
14pt,
|
||||
fill: accent-color,
|
||||
it.body,
|
||||
)
|
||||
#show heading.where(level: 3): it => text(
|
||||
12pt,
|
||||
it.body,
|
||||
)
|
||||
|
||||
#let contact-section = [
|
||||
== Contact \
|
||||
1 Rue Auguste Renoir \
|
||||
38400 Saint-Martin-d'Hères \
|
||||
(+33) 06 58 92 15 86 \
|
||||
#for email in data.emails [
|
||||
#link("mailto:" + email) \
|
||||
]
|
||||
#link("https://rpqt.fr")
|
||||
]
|
||||
|
||||
#place(
|
||||
top + left,
|
||||
float: true,
|
||||
scope: "parent",
|
||||
grid(
|
||||
columns: (1.3fr, 5fr, 3fr),
|
||||
align(horizon, image("profile-circle.png", width: 100%)),
|
||||
align(center + horizon, [
|
||||
= Romain Paquet
|
||||
]),
|
||||
align(
|
||||
right,
|
||||
contact-section,
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
#place(
|
||||
top + left,
|
||||
float: true,
|
||||
scope: "parent",
|
||||
[
|
||||
#line(length: 100%)
|
||||
#introduction
|
||||
#line(length: 100%)
|
||||
]
|
||||
)
|
||||
|
||||
== #experiences.title
|
||||
|
||||
#experiences.items.map(experience => [
|
||||
=== #experience.organisation.name --- _#(experience.position)_ \
|
||||
#date-range(experience.date), #experience.city
|
||||
|
||||
*#words.context*: #eval(experience.description.context, mode: "markup")
|
||||
|
||||
*#words.tasks*:
|
||||
#experience.description.tasks.map(t => [ - #t ]).join()
|
||||
|
||||
*#words.themes*: #experience.themes.join(", ")
|
||||
|
||||
*#words.stack*: #experience.stack.join(", ")
|
||||
|
||||
]).join(dotted-line);
|
||||
|
||||
== #skills.title
|
||||
|
||||
#eval(skills.content, mode: "markup")
|
||||
|
||||
#colbreak()
|
||||
|
||||
== #education.title
|
||||
|
||||
#education.items.map(ed => [
|
||||
|
||||
=== #ed.school \
|
||||
#date-range(ed.date)
|
||||
|
||||
#eval(ed.description, mode: "markup")
|
||||
]).join(dotted-line)
|
||||
|
||||
== #languages.title
|
||||
|
||||
#languages.items.filter(
|
||||
lang => not lang.keys().contains("_needed")
|
||||
).map(lang => [
|
||||
#lang.flag #lang.name #if lang.keys().contains("level") [ (#lang.level) ]
|
||||
]).join([ --- ])
|
||||
|
||||
== #hobbies.title
|
||||
|
||||
#for hobby in hobbies.items [
|
||||
#if hobby.keys().contains("items") [
|
||||
*#hobby.name*
|
||||
#hobby.items.map(i => [ - #i]).join()
|
||||
] else [
|
||||
*#hobby.name* -- #hobby.at("content")
|
||||
]
|
||||
|
||||
]
|
||||
|
||||
]).join()
|
||||
Reference in New Issue
Block a user