20 Commits

Author SHA1 Message Date
Paul Tsouchlos
71ccbf8cb9 chore: update manual generation lib 2025-01-23 08:18:56 -05:00
Paul Tsouchlos
60aa2447c4 chore: update version to 0.8.0 2025-01-20 10:15:50 -05:00
Paul T
74bf3d63c8 Merge pull request #96 from DeveloperPaul123/fix/missing-translation 2025-01-20 10:12:36 -05:00
Paul Tsouchlos
461c954df9 feat: make "job application for" text translatable
Fixes #92
2025-01-20 10:11:31 -05:00
Paul T
7d9927bc19 Merge pull request #95 from DeveloperPaul123/feature/set-page-paper-size 2025-01-20 09:56:09 -05:00
Paul Tsouchlos
7a99a1bd54 feat: add ability to set page size
Fixes #93
2025-01-20 09:55:03 -05:00
Paul T
24fbc19d51 Merge pull request #94 from ThomasFeher/fix_german_salutation 2025-01-20 07:50:51 -05:00
Thomas Feher
a7165fa47e Fix German salutation 2025-01-19 17:40:43 +01:00
Paul T
abe80fa24d Merge pull request #90 from chxp/newa
fix: allow font awesome icon in heading
2025-01-13 23:08:12 -05:00
chenxp
cee8db8535 fix: allow font awesome icon in heading 2025-01-11 13:54:38 +08:00
Paul T
7eb7122e68 Merge pull request #87 from clement-troesch/add-profile-picture-in-resume 2025-01-01 09:57:08 -05:00
Paul T
a98b5e9fd8 Merge pull request #88 from matcap/main
Use provided font for header name
2024-12-12 17:28:15 -05:00
matcap
815a0efb8f add header-font argument 2024-12-12 20:04:20 +01:00
matcap
1c5a10df91 use provided font for header name 2024-12-11 23:54:49 +01:00
Clément Troesch
8c404d93cf Add the ability to set a profile picture in resume 2024-12-08 21:48:20 +01:00
Christoph Groß
423a64618f Fix bad alignment of the contacts 2024-11-27 11:11:48 -05:00
Paul T
883bc73af8 Merge pull request #78 from DeveloperPaul123/fix/minor-tweaks
chore: minor tweaks and fixes
2024-11-01 10:25:08 -06:00
Paul Tsouchlos
83a0c0888b fix: remove homepage entry from toml
Per the package check for typst universe, don't use homepage if there is no dedicated website.
2024-11-01 12:20:17 -04:00
Paul Tsouchlos
493439bd47 chore: ignore Justfile for typstignore 2024-11-01 12:19:47 -04:00
Paul T
0620285a78 Merge pull request #75 from DeveloperPaul123/release/0.7.0 2024-11-01 10:16:16 -06:00
11 changed files with 115 additions and 65 deletions

View File

@@ -6,3 +6,4 @@ template/*.pdf
.issuetracker .issuetracker
tests/* tests/*
docs/* docs/*
Justfile

View File

@@ -38,7 +38,7 @@ See `typst fonts --help` for more information on configuring fonts for `typst` t
Below is a basic example for a simple resume: Below is a basic example for a simple resume:
```typst ```typst
#import "@preview/modern-cv:0.7.0": * #import "@preview/modern-cv:0.8.0": *
#show: resume.with( #show: resume.with(
author: ( author: (
@@ -54,7 +54,9 @@ Below is a basic example for a simple resume:
"Software Architect" "Software Architect"
) )
), ),
date: datetime.today().display() profile-picture: none,
date: datetime.today().display(),
page-size: "us-letter"
) )
= Education = Education
@@ -97,7 +99,7 @@ To build and test the project locally, you will need to install the `typst` CLI.
With typst installed you can make changes to `lib.typ` and then `just install` or `just install-preview` to install the package locally. Change the import statements in the template files to point to the local package (if needed): With typst installed you can make changes to `lib.typ` and then `just install` or `just install-preview` to install the package locally. Change the import statements in the template files to point to the local package (if needed):
```typst ```typst
#import "@local/modern-cv:0.6.0": * #import "@local/modern-cv:0.8.0": *
```` ````
If you use `just install-preview` you will only need to update the version number to match `typst.toml`. If you use `just install-preview` you will only need to update the version number to match `typst.toml`.

View File

@@ -1,9 +1,9 @@
#import "../lib.typ" #import "../lib.typ"
#import "@preview/tidy:0.3.0" #import "@preview/tidy:0.4.1"
#let docs = tidy.parse-module( #let docs = tidy.parse-module(
read("../lib.typ"), read("../lib.typ"),
name: "Modern CV", name: "Modern CV",
scope: (resume: lib), scope: (resume: lib),
) )
#tidy.show-module(docs) #tidy.show-module(docs, style: tidy.styles.minimal)

View File

@@ -8,6 +8,7 @@ cover-letter = "Cover Letter"
attached = "Attached" attached = "Attached"
curriculum-vitae = "Curriculum Vitae" curriculum-vitae = "Curriculum Vitae"
sincerely = "Sincerely" sincerely = "Sincerely"
letter-position-pretext = "Job Application for"
[lang.de] [lang.de]
resume = "Lebenslauf" resume = "Lebenslauf"
@@ -15,7 +16,8 @@ dear = "Sehr geehrte"
cover-letter = "Anschreiben" cover-letter = "Anschreiben"
attached = "Angehängt" attached = "Angehängt"
curriculum-vitae = "Lebenslauf" curriculum-vitae = "Lebenslauf"
sincerely = "Aufrichtig" sincerely = "Mit freundlichen Grüßen"
letter-position-pretext = "Bewerbung für"
[lang.gr] [lang.gr]
resume = "Βιογραφικό" resume = "Βιογραφικό"
@@ -24,6 +26,7 @@ cover-letter = "Συνοδευτική Επιστολή"
attached = "Συνημμένο" attached = "Συνημμένο"
curriculum-vitae = "Βιογραφικό" curriculum-vitae = "Βιογραφικό"
sincerely = "Με εκτίμηση" sincerely = "Με εκτίμηση"
letter-position-pretext = "Αίτηση εργασίας για"
[lang.pt] [lang.pt]
resume = "Currículo" resume = "Currículo"
@@ -32,6 +35,7 @@ cover-letter = "Carta de Apresentação"
attached = "Em anexo" attached = "Em anexo"
curriculum-vitae = "Currículo" curriculum-vitae = "Currículo"
sincerely = "Atenciosamente" sincerely = "Atenciosamente"
letter-position-pretext = "Candidatura a emprego para"
[lang.sp] [lang.sp]
resume = "Currículum" resume = "Currículum"
@@ -40,6 +44,7 @@ cover-letter = "Carta de Presentación"
attached = "Adjunto" attached = "Adjunto"
curriculum-vitae = "Currículum" curriculum-vitae = "Currículum"
sincerely = "Sinceramente" sincerely = "Sinceramente"
letter-position-pretext = "Solicitud de empleo para"
[lang.fr] [lang.fr]
resume = "Curriculum Vitae" resume = "Curriculum Vitae"
@@ -48,6 +53,7 @@ cover-letter = "Lettre de motivation"
attached = "Ci-joint" attached = "Ci-joint"
curriculum-vitae = "Curriculum Vitae" curriculum-vitae = "Curriculum Vitae"
sincerely = "Sincèrement" sincerely = "Sincèrement"
letter-position-pretext = "Demande d'emploi pour"
[lang.ru] [lang.ru]
resume = "Резюме" resume = "Резюме"
@@ -56,6 +62,7 @@ cover-letter = "Сопроводительное письмо"
attached = "Прилагается" attached = "Прилагается"
curriculum-vitae = "Биографическая справка" curriculum-vitae = "Биографическая справка"
sincerely = "Искренне" sincerely = "Искренне"
letter-position-pretext = "Заявление о приеме на работу"
[lang.zh] [lang.zh]
resume = "简历" resume = "简历"
@@ -64,6 +71,7 @@ cover-letter = "求职信"
attached = "附件" attached = "附件"
curriculum-vitae = "简历" curriculum-vitae = "简历"
sincerely = "真诚的" sincerely = "真诚的"
letter-position-pretext = "職位申請"
[lang.it] [lang.it]
resume = "Curriculum" resume = "Curriculum"
@@ -72,3 +80,4 @@ cover-letter = "Lettera di presentazione"
attached = "Allegato" attached = "Allegato"
curriculum-vitae = "Curriculum Vitae" curriculum-vitae = "Curriculum Vitae"
sincerely = "Cordiali saluti" sincerely = "Cordiali saluti"
letter-position-pretext = "Domanda di lavoro per"

126
lib.typ
View File

@@ -184,6 +184,7 @@
/// The original template: https://github.com/posquit0/Awesome-CV /// The original template: https://github.com/posquit0/Awesome-CV
/// ///
/// - author (content): Structure that takes in all the author's information /// - author (content): Structure that takes in all the author's information
/// - profile-picture (image): The profile picture of the author. This will be cropped to a circle and should be square in nature.
/// - date (string): The date the resume was created /// - date (string): The date the resume was created
/// - accent-color (color): The accent color of the resume /// - accent-color (color): The accent color of the resume
/// - colored-headers (boolean): Whether the headers should be colored or not /// - colored-headers (boolean): Whether the headers should be colored or not
@@ -192,12 +193,15 @@
/// -> none /// -> none
#let resume( #let resume(
author: (:), author: (:),
profile-picture: image,
date: datetime.today().display("[month repr:long] [day], [year]"), date: datetime.today().display("[month repr:long] [day], [year]"),
accent-color: default-accent-color, accent-color: default-accent-color,
colored-headers: true, colored-headers: true,
show-footer: true, show-footer: true,
language: "en", language: "en",
font: ("Source Sans Pro", "Source Sans 3"), font: ("Source Sans Pro", "Source Sans 3"),
header-font: ("Roboto"),
paper-size: "a4",
body, body,
) = { ) = {
if type(accent-color) == "string" { if type(accent-color) == "string" {
@@ -223,7 +227,7 @@
) )
set page( set page(
paper: "a4", paper: paper-size,
margin: (left: 15mm, right: 15mm, top: 10mm, bottom: 10mm), margin: (left: 15mm, right: 15mm, top: 10mm, bottom: 10mm),
footer: if show-footer [#__resume_footer( footer: if show-footer [#__resume_footer(
author, author,
@@ -257,7 +261,7 @@
} else { } else {
color-darkgray color-darkgray
} }
#text[#strong[#text(color)[#it.body.text]]] #text[#strong[#text(color)[#it.body]]]
#box(width: 1fr, line(length: 100%)) #box(width: 1fr, line(length: 100%))
] ]
@@ -286,7 +290,7 @@
#set text( #set text(
size: 32pt, size: 32pt,
style: "normal", style: "normal",
font: ("Roboto"), font: header-font,
) )
#if language == "zh" or language == "ja" [ #if language == "zh" or language == "ja" [
#text( #text(
@@ -399,11 +403,37 @@
] ]
} }
if profile-picture != none {
grid(
columns: (100% - 4cm, 4cm),
rows: (100pt),
gutter: 10pt,
[
#name
#positions
#address
#contacts
],
align(left + horizon)[
#block(
clip: true,
stroke: 0pt,
radius: 2cm,
width: 4cm,
height: 4cm,
profile-picture,
)
],
)
} else {
name name
positions positions
address address
contacts contacts
}
body body
} }
/// The base item for resume entries. /// The base item for resume entries.
@@ -540,6 +570,7 @@
font: ("Source Sans Pro", "Source Sans 3"), font: ("Source Sans Pro", "Source Sans 3"),
show-footer: true, show-footer: true,
closing: none, closing: none,
paper-size: "a4",
body, body,
) = { ) = {
if type(accent-color) == "string" { if type(accent-color) == "string" {
@@ -570,7 +601,7 @@
) )
set page( set page(
paper: "a4", paper: paper-size,
margin: (left: 15mm, right: 15mm, top: 10mm, bottom: 10mm), margin: (left: 15mm, right: 15mm, top: 10mm, bottom: 10mm),
footer: if show-footer [#__coverletter_footer( footer: if show-footer [#__coverletter_footer(
author, author,
@@ -603,7 +634,7 @@
) )
#align(left)[ #align(left)[
#text[#strong[#text(accent-color)[#it.body.text]]] #text[#strong[#text(accent-color)[#it.body]]]
#box(width: 1fr, line(length: 100%)) #box(width: 1fr, line(length: 100%))
] ]
] ]
@@ -664,6 +695,47 @@
set box(height: 9pt) set box(height: 9pt)
let separator = [ #box(sym.bar.v) ] let separator = [ #box(sym.bar.v) ]
let author_list = ()
if ("phone" in author) {
author_list.push[
#phone-icon
#box[#text(author.phone)]
]
}
if ("email" in author) {
author_list.push[
#email-icon
#box[#link("mailto:" + author.email)[#author.email]]
]
}
if ("github" in author) {
author_list.push[
#github-icon
#box[#link("https://github.com/" + author.github)[#author.github]]
]
}
if ("linkedin" in author) {
author_list.push[
#linkedin-icon
#box[
#link("https://www.linkedin.com/in/" + author.linkedin)[#author.firstname #author.lastname]
]
]
}
if ("orcid" in author) {
author_list.push[
#orcid-icon
#box[#link("https://orcid.org/" + author.orcid)[#author.orcid]]
]
}
if ("website" in author) {
author_list.push[
#website-icon
#box[#link(author.website)[#author.website]]
]
}
align(right)[ align(right)[
#set text( #set text(
@@ -671,45 +743,7 @@
weight: "light", weight: "light",
style: "normal", style: "normal",
) )
#block[ #author_list.join(separator)
#align(horizon)[
#stack(
dir: ltr,
spacing: 0.5em,
if ("phone" in author) [
#phone-icon
#box[#text(author.phone)]
#separator
],
if ("email" in author) [
#email-icon
#box[#link("mailto:" + author.email)[#author.email]]
],
if ("github" in author) [
#separator
#github-icon
#box[#link("https://github.com/" + author.github)[#author.github]]
],
if ("linkedin" in author) [
#separator
#linkedin-icon
#box[
#link("https://www.linkedin.com/in/" + author.linkedin)[#author.firstname #author.lastname]
]
],
if ("orcid" in author) [
#separator
#orcid-icon
#box[#link("https://orcid.org/" + author.orcid)[#author.orcid]]
],
if ("website" in author) [
#separator
#website-icon
#box[#link(author.website)[#author.website]]
],
)
]
]
] ]
} }
@@ -742,7 +776,7 @@
#text(weight: "light")[#linguify( #text(weight: "light")[#linguify(
"sincerely", "sincerely",
from: lang_data, from: lang_data,
)#sym.comma] \ )#if language != "de" [#sym.comma]] \
#text(weight: "bold")[#author.firstname #author.lastname] \ \ #text(weight: "bold")[#author.firstname #author.lastname] \ \
] ]
] ]
@@ -790,7 +824,7 @@
// TODO: Make this adaptable to content // TODO: Make this adaptable to content
underline(evade: false, stroke: 0.5pt, offset: 0.3em)[ underline(evade: false, stroke: 0.5pt, offset: 0.3em)[
#text(weight: "bold", size: 12pt)[Job Application for #job-position] #text(weight: "bold", size: 12pt)[#linguify("letter-position-pretext", from: lang_data) #job-position]
] ]
pad(top: 1em, bottom: 1em)[ pad(top: 1em, bottom: 1em)[
#text(weight: "light", fill: color-gray)[ #text(weight: "light", fill: color-gray)[

View File

@@ -1,4 +1,4 @@
#import "@preview/modern-cv:0.7.0": * #import "@preview/modern-cv:0.8.0": *
#show: coverletter.with( #show: coverletter.with(
author: ( author: (
@@ -17,6 +17,7 @@
), ),
), ),
profile-picture: image("./profile.png"), profile-picture: image("./profile.png"),
// change this to match the language available in 'lang.toml'
language: "en", language: "en",
font: "Times New Roman", font: "Times New Roman",
// Remove the following line to show the footer // Remove the following line to show the footer
@@ -24,6 +25,8 @@
show-footer: false, show-footer: false,
// set this to `none` to show the default or remove it completely // set this to `none` to show the default or remove it completely
closing: [], closing: [],
// see typst "page" documentation for more options
paper-size: "us-gov-legal"
) )
#hiring-entity-info(entity-info: ( #hiring-entity-info(entity-info: (

View File

@@ -1,4 +1,4 @@
#import "@preview/modern-cv:0.7.0": * #import "@preview/modern-cv:0.8.0": *
#show: coverletter.with( #show: coverletter.with(
author: ( author: (

View File

@@ -1,4 +1,4 @@
#import "@preview/modern-cv:0.7.0": * #import "@preview/modern-cv:0.8.0": *
#show: resume.with( #show: resume.with(
author: ( author: (
@@ -20,10 +20,12 @@
"Developer", "Developer",
), ),
), ),
profile-picture: none,
date: datetime.today().display(), date: datetime.today().display(),
language: "en", language: "en",
colored-headers: true, colored-headers: true,
show-footer: false, show-footer: false,
paper-size: "us-letter",
) )
= Experience = Experience

View File

@@ -1,4 +1,4 @@
#import "@local/modern-cv:0.7.0": * #import "@local/modern-cv:0.8.0": *
// setup the document like we do for the resume // setup the document like we do for the resume
#let font = ("Source Sans Pro", "Source Sans 3") #let font = ("Source Sans Pro", "Source Sans 3")

View File

@@ -1,4 +1,4 @@
#import "@local/modern-cv:0.7.0": * #import "@local/modern-cv:0.8.0": *
// setup the document like we do for the resume // setup the document like we do for the resume
#let font = ("Source Sans Pro", "Source Sans 3") #let font = ("Source Sans Pro", "Source Sans 3")

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "modern-cv" name = "modern-cv"
version = "0.7.0" version = "0.8.0"
compiler = "0.12.0" compiler = "0.12.0"
entrypoint = "lib.typ" entrypoint = "lib.typ"
authors = ["Paul Tsouchlos <https://github.com/DeveloperPaul123>"] authors = ["Paul Tsouchlos <https://github.com/DeveloperPaul123>"]
@@ -10,7 +10,6 @@ keywords = ["CV", "Curriculum Vitae", "Resume", "Minimalistic", "Professional",
categories = ["cv"] categories = ["cv"]
disciplines = [] disciplines = []
exclude = ["resume-documentation*", "scripts*", "assets/images/*"] exclude = ["resume-documentation*", "scripts*", "assets/images/*"]
homepage = "https://github.com/DeveloperPaul123/modern-cv"
repository = "https://github.com/DeveloperPaul123/modern-cv" repository = "https://github.com/DeveloperPaul123/modern-cv"
[template] [template]