diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..757fee3 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/.idea \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..b52f72c --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ +# SimpleCV +SimpleCV is simple and elegant CV template written in [Typst](https://typst.app/) +aimed at (but not limited to!) people with an engineering background. The template was +inspired by two Latex CV templates([[1]](https://www.overleaf.com/latex/templates/autocv/scfvqfpxncwb), +[[2]](https://www.overleaf.com/latex/templates/faangpath-simple-template/npsfpdqnxmbc)). +Feel free to create open an issue if you have any questions or notice some error. + +# Usage +Create a new Typst project and copy the whole content of the `source` directory +into the project. Change the contents of the `main.typ` file according to your own needs. This should be it. +You can find an example of what the CV looks like in `example.pdf`. + +# License +The project itself is available under the MIT license. The icons are +from FontAwesome and subject their [their license agreement](https://github.com/FortAwesome/Font-Awesome/blob/6.x/LICENSE.txt). \ No newline at end of file diff --git a/example.pdf b/example.pdf new file mode 100644 index 0000000..487578f Binary files /dev/null and b/example.pdf differ diff --git a/source/email.svg b/source/email.svg new file mode 100644 index 0000000..e564cad --- /dev/null +++ b/source/email.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/source/github.svg b/source/github.svg new file mode 100644 index 0000000..81b1073 --- /dev/null +++ b/source/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/source/linkedin.svg b/source/linkedin.svg new file mode 100644 index 0000000..dc1e36d --- /dev/null +++ b/source/linkedin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/source/main.typ b/source/main.typ new file mode 100644 index 0000000..5ccb214 --- /dev/null +++ b/source/main.typ @@ -0,0 +1,109 @@ +#import template, education_entry, work_entry, skill_entry from "simplecv.typ" + +// Change the margins of the cv. +#set page(margin: (x: 1.5cm, y: 0.5cm)) + +// Change the overall text size of the cv. Might be useful if you want to add/remove content so that everything still stays on one page. +#set text(12pt) + +// Change the font of the cv. +#set text("Linux Libertine") + +// Change the theme color of the cv. +#let color = blue + +// Change to your name. +#let name = "John Doe" + +// Change the shown contact data. You can also change the order of the elements so that they will show up in a different order. Currently, only these five elements are available with icons, but you can add new ones by editing the template. +#let contact_data = ( + ( + "service": "linkedin", + "display": "John Doe", + "link": "https://www.linkedin.com/in/JohnDoe" + ), + ( + "service": "email", + "display": "john@johndoe.com", + "link": "mailto://john@johndoe.com" + ), + ( + "service": "phone", + "display": "+1 123 456 789", + "link": "tel:+1 123 456 789" + ), + ( + "service": "github", + "display": "JohnDoe", + "link": "https://github.com/JohnDoe" + ), + ( + "service": "website", + "display": "mywebsite.com", + "link": "https://mywebsite.com" + ) +) + +// Leave this unchanged. This puts the name and contact data in the right spot. +#show doc => template(name, contact_data, color, doc) + +// Starting from here, you can add as much content as you want. This represents the main content of the cv. += Education +#education_entry("Computer Science", "ETH Zürich", +degree_title: "MSc.", start_date: "Sep 2016", end_date: "Jul 2018", +description: lorem(9), location: "Munich, Germany") + +#education_entry("Computer Science", "Stanford University", +degree_title: "BSc.", start_date: "Sep 2012", end_date: "Jul 2016", +description: lorem(12), location: "California, USA") + += Experience +#work_entry("Senior Software Engineer", "Microsoft", start_date: "Since Nov 2021", tasks: ( + lorem(7), + lorem(13), + lorem(9) +), +location: "Seattle, USA") + +#work_entry("Senior Software Engineer", "Apple", start_date: "Jan 2020", end_date: "Oct 2021", tasks: ( + lorem(4), + lorem(6), + lorem(14) + ), +location: "California, USA") + +#work_entry("Junior Software Engineer", "Google", start_date: "Oct 2018", end_date: "Nov 2019", tasks: ( + lorem(8), + lorem(12), + lorem(3) + ), +location: "Zurich, Switzerland") + += Projects +*Project 1*. #lorem(40) + +*Project 2*. #lorem(32) + +*Project 3*. #lorem(40) + += Skills +// Ratings won't be displayed in this template. +#skill_entry("Technologies", + ( + ("name": "Git", "rating": 3), + ("name": "C++", "rating": 2), + ("name": "Python", "rating": 5), + ("name": "Typst", "rating": 3), + ("name": "JavaScript", "rating": 4), + ("name": "Vue.js", "rating": 4), + ) +) + +#skill_entry("Languages", + ( + ("name": "English", "rating": 5), + ("name": "German", "rating": 5), + ("name": "Spanish", "rating": 3), + ("name": "Japanese", "rating": 2), + ) +) \ No newline at end of file diff --git a/source/phone.svg b/source/phone.svg new file mode 100644 index 0000000..95e90c3 --- /dev/null +++ b/source/phone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/source/simplecv.typ b/source/simplecv.typ new file mode 100644 index 0000000..af87203 --- /dev/null +++ b/source/simplecv.typ @@ -0,0 +1,138 @@ +// Based on https://www.overleaf.com/latex/templates/autocv/scfvqfpxncwb and https://www.overleaf.com/latex/templates/faangpath-simple-template/npsfpdqnxmbc + +#set list(indent: 1em) +// Reduce space between paragraphs. +#let par_space = 0.5em +// Reduce space between headings and descriptions. +#let sep_space = par_space + 0.2em + +// Format start and end dates. +#let format_date(start_date: none, end_date: none) = { + let date = { + if end_date == none { + start_date + } else if start_date == none { + end_date + } else { + start_date + " - " + end_date + } + } + + [*#date*] +} + +// Format locations. +#let format_location(location) = { + [_#block(above: sep_space, location)_] +} + +// General entry that is split into a left and right half (for experience and education). +#let cv_entry(left_content: none, right_content: none) = { + grid( + columns: (11fr, 6fr), + column-gutter: 1cm, + { + set align(left) + left_content + }, + { + set align(right) + right_content + } + ) +} + +// Entry for education. +#let education_entry(degree, university, degree_title: none, description: none, start_date: none, end_date: none, location: none) = { + cv_entry( + left_content: { + if degree_title != none { + [*#degree_title*] + " " + } + [*#degree*] + [ (#university)] + block(above: sep_space, par[#description]) + }, + right_content: { + format_date(start_date: start_date, end_date: end_date) + + if location != none { + "\n" + format_location(location) + } + } + ) +} + +// Entry for work. +#let work_entry(role, company, tasks: none, start_date: none, end_date: none, location: none) = { + cv_entry( + left_content: { + [*#role*] + "\n" + block(above: sep_space, text[#company]) + + if tasks != none { + let tasks_list = [] + + for task in tasks { + tasks_list += [- #task] + } + + tasks_list + } + }, + right_content: { + format_date(start_date: start_date, end_date: end_date) + + if location != none { + "\n" + format_location(location) + } + } + ) +} + +// Entry for skills +#let skill_entry(category, skills) = { + [== #category] + + let cell = rect.with(radius: 5pt, inset: 4pt) + let boxes = for skill in skills {(cell(skill.name),)} + + {boxes.join(" ")} +} + +// Set name and contact data and format headings +#let template(name, contact_data, color, doc) = { + set par(justify: true, leading: par_space) + align(center)[ + #smallcaps(text(size: 2.5em, fill: color)[#name]) \ + + { + if contact_data != none and contact_data.len() > 0 { + let elements = for el in contact_data { + (link(el.link)[{box(image(height: 0.7em, el.service + ".svg")) + " " + el.display}],) + } + elements.join(" | ") + } + } + ] + + show heading.where(level: 1): i => { + set align(left) + let title = smallcaps(i.title) + + set block(above: 1em) + set text(weight: "light", size: 1.2em, fill: color) + stack( + dir: ttb, + spacing: 2mm, + [{title}], + line(length: 100%, stroke: color) + ) + } + + show heading.where(level: 2): i => { + set align(left) + let title = smallcaps(i.title) + set block(above: 0.8em) + set text(weight: "light", size: 1.1em, fill: color) + [{i.title}] + } + + doc +} diff --git a/source/website.svg b/source/website.svg new file mode 100644 index 0000000..06aa71e --- /dev/null +++ b/source/website.svg @@ -0,0 +1 @@ + \ No newline at end of file