1
0
Fork 0

Compare commits

...

2 Commits

Author SHA1 Message Date
Ethan Reece 2dd6e8aaa3
Separate into components 2024-08-03 17:52:19 -05:00
Ethan Reece c90ef8fa72
Update education and improve accessibility 2024-08-03 14:46:08 -05:00
15 changed files with 505 additions and 383 deletions

View File

@ -0,0 +1,8 @@
#let base_page(body) = page(
paper: "us-letter",
margin: (
x: 0.5in,
y: 0.3in,
),
body
)

View File

@ -0,0 +1,6 @@
#let base_text(body) = text(
font: "Inter",
size: 10pt,
weight: "regular",
body
)

View File

@ -1,5 +1,5 @@
#{ #{
import "resume_page.typ": resume_page import "page_resume.typ": page_resume
let config = ( let config = (
identity: ( identity: (
@ -28,7 +28,7 @@
"Java", "Java",
"C", "C",
"C++", "C++",
"Guile", "Guile/Scheme",
), ),
), ),
( (
@ -49,8 +49,12 @@
title: "The University of Texas at Dallas", title: "The University of Texas at Dallas",
degree: "Bachelor of Science in Computer Science", degree: "Bachelor of Science in Computer Science",
graduation: "May 2026", graduation: "May 2026",
gpa: "Current GPA: 3.764", gpa: "Current GPA: 3.749",
coursework: ( coursework: (
completed: (
"Programming Language Paradigms",
"Digital Logic & Computer Design",
"Operating Systems Concepts",
"Probability and Statistics for CS", "Probability and Statistics for CS",
"Data Structures and Algorithms", "Data Structures and Algorithms",
"Software Engineering", "Software Engineering",
@ -58,6 +62,11 @@
"Computer Architecture", "Computer Architecture",
"Discrete Mathematics II", "Discrete Mathematics II",
), ),
current: (
"Database Systems",
"Advanced Algorithm Design & Analysis",
),
),
highlights: ( highlights: (
"Collegium V Honors Program", "Collegium V Honors Program",
), ),
@ -140,5 +149,5 @@
date: none, date: none,
) )
resume_page(..config) page_resume(..config)
} }

111
src/page_resume.typ 100644
View File

@ -0,0 +1,111 @@
#let page_resume(
identity: (
name: "",
email: "",
phone: "",
location: "",
website: "",
),
skills: (
(
title: "",
items: (""),
),
),
education: (
(
title: "",
degree: "",
graduation: "",
gpa: "",
coursework: (""),
highlights: (""),
),
),
work_experience: (
(
title: "",
location: "",
timeframe: "",
role: "",
skills: (""),
highlights: (""),
),
),
professional_development: (
(
title: "",
timeframe: "",
role: "",
skills: (""),
highlights: (""),
),
),
) = {
import "base/text.typ": base_text
import "base/page.typ": base_page
import "section/identity.typ": section_identity
import "section/skills.typ": section_skills
import "section/education.typ": section_education
import "section/work_experience.typ": section_work_experience
import "section/professional_development.typ": section_professional_development
let resume_content(
skills: (
(
title: "",
items: (""),
),
),
education: (
(
title: "",
degree: "",
graduation: "",
gpa: "",
coursework: (""),
highlights: (""),
),
),
work_experience: (
(
title: "",
location: "",
timeframe: "",
role: "",
skills: (""),
highlights: (""),
),
),
professional_development: (
(
title: "",
timeframe: "",
role: "",
skills: (""),
highlights: (""),
),
),
) = grid(
gutter: 2.4em,
section_skills(skills: skills),
section_education(education: education),
section_work_experience(work_experience: work_experience),
section_professional_development(professional_development: professional_development),
)
base_page(
base_text(
grid(
gutter: 2.75em,
section_identity(identity: identity),
resume_content(
skills: skills,
education: education,
work_experience: work_experience,
professional_development: professional_development,
)
)
)
)
}

View File

@ -1,373 +0,0 @@
#let resume_page(
identity: (
name: "",
email: "",
phone: "",
location: "",
website: "",
),
skills: (
(
title: "",
items: (""),
),
),
education: (
(
title: "",
degree: "",
graduation: "",
gpa: "",
coursework: (""),
highlights: (""),
),
),
work_experience: (
(
title: "",
location: "",
timeframe: "",
role: "",
skills: (""),
highlights: (""),
),
),
professional_development: (
(
title: "",
timeframe: "",
role: "",
skills: (""),
highlights: (""),
),
),
) = {
let _block(
below: 0em,
width: 100%,
padding: (
top: 0em,
right: 0em,
bottom: 0em,
left: 0em,
),
body
) = block(
below: below,
width: width,
align(
top + left,
pad(
..padding,
body
)
)
)
let _text(
font: "Inter",
size: 10pt,
weight: "regular",
block: (
below: 0em,
width: 100%,
padding: (
top: 0em,
right: 0em,
bottom: 0em,
left: 0em,
),
),
body
) = text(
font: font,
size: size,
weight: weight,
_block(
..block,
body
)
)
let _heading(title: "") = _text(
size: 13pt,
block: (below: .95em),
heading(
_text(
size: 13pt,
weight: "bold",
title
)
)
)
let section_base(
title: "",
body
) = _text(
block: (below: 2.5em),
{
_heading(title: title)
_text(
block: (
padding: (left: 1em),
),
body
)
}
)
let section_item(
title: "",
subtitle: "",
role: "",
timeframe: "",
skills: (""),
highlights: (""),
) = _text(
block: (below: 1.5em),
{
_text(
block: (below: 0.95em),
grid(
columns: (40%, 60%),
rows: 2,
gutter: 0.75em,
align: (
left,
right,
),
grid(
columns: 2,
gutter: 1.5em,
align: bottom,
text(
weight: "semibold",
title
),
text(
size: 9pt,
weight: "extralight",
subtitle
)
),
text(
weight: "regular",
timeframe
),
text(
weight: "light",
size: 9.5pt,
role
),
text(
weight: "light",
size: 9.5pt,
skills.join(", "),
),
)
)
_text(
block: (
padding: (left: 2em),
),
for highlight in highlights {
_text(
block: (below: 1em),
par(
justify: true,
highlight
)
)
}
)
}
)
let section(
title: "",
items: (
(
title: "",
subtitle: "",
role: "",
timeframe: "",
skills: (""),
highlights: (""),
),
),
) = section_base(
title: title,
for item in items {
section_item(..item)
}
)
let title_block(title: "") = _text(
size: 28pt,
block: (below: 0.60em),
weight: "extrabold",
align(
center,
title
)
)
let contact_info_block(
email: "",
phone: "",
location: "",
website: "",
) = _text(
size: 10.5pt,
block: (below: 2.75em),
weight: "medium",
align(
center,
grid(
columns: 4,
rows: 1,
gutter: 4em,
email,
phone,
location,
website,
)
)
)
let skills_block(
skills: (
(
title: "",
items: (""),
),
),
) = section_base(
title: "Skills",
_text(
grid(
columns: (33%, 67%),
gutter: 1em,
..for skill in skills {
(
_text(
weight: "semibold",
skill.title
),
skill.items.join(", "),
)
}
)
)
)
let education_block(
education: (
(
title: "",
degree: "",
graduation: "",
gpa: "",
coursework: (""),
highlights: (""),
),
),
) = section(
title: "Education",
items: education.map(school => (
title: school.title,
role: school.degree,
timeframe: school.graduation,
skills: (
school.gpa,
),
highlights: (
..school.highlights,
{
_text(
weight: "medium",
block: (
below: 0.75em,
),
"Relevant Coursework"
)
_text(
size: 9.5pt,
block: (
padding: (
left: 2em,
),
),
school.coursework.join(", ")
)
}
),
))
)
let work_experience_block(
work_experience: (
(
title: "",
location: "",
timeframe: "",
role: "",
skills: (""),
highlights: (""),
),
),
) = section(
title: "Work Experience",
items: work_experience.map(company => (
title: company.title,
subtitle: company.location,
timeframe: company.timeframe,
role: company.role,
skills: company.skills,
highlights: company.highlights,
)),
)
let professional_development_block(
professional_development: (
(
title: "",
timeframe: "",
role: "",
skills: (""),
highlights: (""),
),
),
) = section(
title: "Professional Development",
items: professional_development.map(item => (
title: item.title,
timeframe: item.timeframe,
role: item.role,
skills: item.skills,
highlights: item.highlights,
)),
)
page(
paper: "us-letter",
margin: (
x: 0.5in,
y: 0.4in,
),
{
title_block(title: identity.name)
contact_info_block(
email: identity.email,
phone: identity.phone,
location: identity.location,
website: identity.website,
)
skills_block(skills: skills)
education_block(education: education)
work_experience_block(work_experience: work_experience)
professional_development_block(professional_development: professional_development)
}
)
}

View File

@ -0,0 +1,26 @@
#let section_base_full(
title: "",
items: (
(
title: "",
subtitle: "",
role: "",
timeframe: "",
skills: (""),
highlights: (""),
),
),
) = {
import "small.typ": section_base_small
import "item.typ": section_base_item
section_base_small(
title: title,
grid(
gutter: 1.5em,
for item in items {
section_base_item(..item)
}
)
)
}

View File

@ -0,0 +1,36 @@
#let section_base_item(
title: "",
subtitle: "",
role: "",
timeframe: "",
skills: (""),
highlights: (""),
) = {
import "../../base/text.typ": base_text
import "item/header.typ": section_base_item_header
let item_highlights(highlights: highlights) = for highlight in highlights {
block(
below: 1em,
par(
justify: true,
highlight
)
)
}
grid(
gutter: 0.95em,
section_base_item_header(
title: title,
subtitle: subtitle,
role: role,
timeframe: timeframe,
skills: skills,
),
pad(
left: 2em,
item_highlights(highlights: highlights)
)
)
}

View File

@ -0,0 +1,66 @@
#let section_base_item_header(
title: "",
subtitle: "",
role: "",
timeframe: "",
skills: (""),
) = {
import "../../../base/text.typ": base_text
let header_title(
title: "",
subtitle: "",
) = grid(
columns: 2,
gutter: 1.5em,
align: bottom,
heading(
level: 2,
base_text(
text(
weight: "semibold",
title
)
)
),
text(
size: .9em,
weight: "extralight",
subtitle
),
)
grid(
columns: 2,
rows: 2,
gutter: 0.75em,
align: (
left,
right,
),
header_title(
title: title,
subtitle: subtitle,
),
block(
width: 100%,
text(
weight: "regular",
timeframe
)
),
text(
weight: "light",
size: .95em,
role
),
block(
width: 100%,
text(
weight: "light",
size: .95em,
skills.join(", ")
)
),
)
}

View File

@ -0,0 +1,23 @@
#let section_base_small(
title: "",
body
) = {
import "../../base/text.typ": base_text
grid(
gutter: 1.1em,
heading(
base_text(
text(
size: 1.3em,
weight: "bold",
title
)
)
),
pad(
left: 1em,
body
)
)
}

View File

@ -0,0 +1,34 @@
#let section_education(
education: (
(
title: "",
degree: "",
graduation: "",
gpa: "",
coursework: (
completed: (""),
current: (""),
),
highlights: (""),
),
),
) = {
import "base/full.typ": section_base_full
import "education/coursework.typ": section_education_coursework
section_base_full(
title: "Education",
items: education.map(school => (
title: school.title,
role: school.degree,
timeframe: school.graduation,
skills: (
school.gpa,
),
highlights: (
..school.highlights,
section_education_coursework(..school.coursework),
),
))
)
}

View File

@ -0,0 +1,47 @@
#let section_education_coursework(
completed: (""),
current: (""),
) = {
let coursework_content(
completed: (""),
current: (""),
) = grid(
columns: 2,
rows: 2,
gutter: 1em,
text(
weight: "regular",
"Completed",
),
text(
weight: "light",
completed.join(", "),
),
text(
weight: "regular",
"Current",
),
text(
weight: "light",
current.join(", "),
),
)
grid(
gutter: .95em,
text(
weight: "medium",
"Relevant Coursework"
),
pad(
left: 1.5em,
text(
size: .95em,
coursework_content(
completed: completed,
current: current,
)
)
)
)
}

View File

@ -0,0 +1,46 @@
#let section_identity(
identity: (
name: "",
email: "",
phone: "",
location: "",
website: "",
),
) = {
let title(title: "") = text(
size: 2.8em,
weight: "extrabold",
title
)
let contact_info(
email: "",
phone: "",
location: "",
website: "",
) = text(
size: 1.05em,
weight: "medium",
grid(
columns: 4,
rows: 1,
gutter: 4em,
email,
phone,
location,
website,
)
)
grid(
gutter: 1.5em,
align: center,
title(title: identity.name),
contact_info(
email: identity.email,
phone: identity.phone,
location: identity.location,
website: identity.website,
),
)
}

View File

@ -0,0 +1,24 @@
#let section_professional_development(
professional_development: (
(
title: "",
timeframe: "",
role: "",
skills: (""),
highlights: (""),
),
),
) = {
import "base/full.typ": section_base_full
section_base_full(
title: "Professional Development",
items: professional_development.map(item => (
title: item.title,
timeframe: item.timeframe,
role: item.role,
skills: item.skills,
highlights: item.highlights,
)),
)
}

View File

@ -0,0 +1,33 @@
#let section_skills(
skills: (
(
title: "",
items: (""),
),
),
) = {
import "../base/text.typ": base_text
import "base/small.typ": section_base_small
section_base_small(
title: "Skills",
grid(
columns: 2,
gutter: 1em,
..for skill in skills {
(
heading(
level: 2,
base_text(
text(
weight: "semibold",
skill.title
)
)
),
skill.items.join(", "),
)
}
)
)
}

View File

@ -0,0 +1,26 @@
#let section_work_experience(
work_experience: (
(
title: "",
location: "",
timeframe: "",
role: "",
skills: (""),
highlights: (""),
),
),
) = {
import "base/full.typ": section_base_full
section_base_full(
title: "Work Experience",
items: work_experience.map(company => (
title: company.title,
subtitle: company.location,
timeframe: company.timeframe,
role: company.role,
skills: company.skills,
highlights: company.highlights,
)),
)
}