Refine resume template for conservative audiences with grayscale styling.
Remove default ability bars, widen margins and section spacing, fix entry layout, and refresh sample PDF for government-facing delivery. Co-authored-by: Cursor <cursoragent@cursor.com>
@ -1,6 +1,6 @@
|
||||
# Resume · 团队简历模板
|
||||
|
||||
GreLin 双栏中文简历 Typst 模板(HyperLabel 配色),用于融资 BP data room 附录。
|
||||
GreLin 双栏中文简历 Typst 模板,用于融资 BP data room 附录。
|
||||
|
||||
## 照片
|
||||
|
||||
@ -25,16 +25,17 @@ GreLin 双栏中文简历 Typst 模板(HyperLabel 配色),用于融资 BP
|
||||
)
|
||||
|
||||
#let skills = (
|
||||
abilities: (
|
||||
(name: "全栈开发", level: 0.9),
|
||||
),
|
||||
language: (
|
||||
name: "英语",
|
||||
level: 0.75,
|
||||
label: "读写",
|
||||
),
|
||||
tags: ("Rust", "Python"),
|
||||
notes: (), // 可选:侧栏技能补充列表
|
||||
// 可选:能力进度条(有数据时自动显示「能力」子区块)
|
||||
// abilities: (
|
||||
// (name: "全栈开发", level: 0.9),
|
||||
// ),
|
||||
// language: (
|
||||
// name: "英语",
|
||||
// level: 0.75,
|
||||
// label: "读写",
|
||||
// ),
|
||||
)
|
||||
|
||||
#let education = (
|
||||
|
||||
@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#C4D94A" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20"/><path d="M2 12h20"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#434950" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20"/><path d="M2 12h20"/></svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 294 B After Width: | Height: | Size: 294 B |
@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#C4D94A" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="20" height="16" x="2" y="4" rx="2"/><path d="m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#434950" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="20" height="16" x="2" y="4" rx="2"/><path d="m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7"/></svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 285 B After Width: | Height: | Size: 285 B |
@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#C4D94A" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0"/><circle cx="12" cy="10" r="3"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#434950" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0"/><circle cx="12" cy="10" r="3"/></svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 326 B After Width: | Height: | Size: 326 B |
@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#C4D94A" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z"/></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#434950" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z"/></svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 480 B After Width: | Height: | Size: 480 B |
@ -22,15 +22,6 @@
|
||||
)
|
||||
|
||||
#let skills = (
|
||||
abilities: (
|
||||
(name: "全栈开发", level: 0.9),
|
||||
(name: "系统架构", level: 0.75),
|
||||
),
|
||||
language: (
|
||||
name: "英语",
|
||||
level: 0.75,
|
||||
label: "读写",
|
||||
),
|
||||
tags: (
|
||||
"Rust", "Python", "Java", "React", "Tauri", "RAG", "Linux", "MySQL", "Redis",
|
||||
"LLM Agent",
|
||||
|
||||
@ -82,9 +82,15 @@
|
||||
} else if sidebar {
|
||||
space-none
|
||||
} else {
|
||||
space-block
|
||||
space-main-section
|
||||
}
|
||||
let title-below = if below != auto {
|
||||
below
|
||||
} else if sidebar {
|
||||
space-title-gap
|
||||
} else {
|
||||
space-main-title-below
|
||||
}
|
||||
let title-below = if below != auto { below } else { space-title-gap }
|
||||
block(width: 100%, above: title-above, below: title-below)[
|
||||
#text(font: heading-font, size: size-heading, weight: "bold", fill: color-ink)[#title]
|
||||
#if divider [
|
||||
@ -121,7 +127,7 @@
|
||||
/// 教育背景条目(notes 可选,一段普通正文)
|
||||
#let edu-entry(degree, school, period, location, notes: "") = block(above: space-none, below: space-none)[
|
||||
#text(fill: color-body, size: size-body)[#degree]
|
||||
#v(space-inline)
|
||||
#v(space-edu-meta-gap)
|
||||
#text(fill: color-text-light, size: size-secondary)[
|
||||
#school#if period != "" [ · #period]#if location != "" [ · #location]
|
||||
]
|
||||
@ -174,7 +180,7 @@
|
||||
]
|
||||
}
|
||||
|
||||
/// 技能进度条(level: 0–1);条与条之间仅用 above 控制间距
|
||||
/// 技能进度条(level: 0–1);config 提供 abilities / language 时由 abilities-block 渲染
|
||||
#let skill-bar(name, level, subtitle: none, above: space-none) = block(above: above, below: space-none)[
|
||||
#if subtitle != none [
|
||||
#grid(
|
||||
@ -193,6 +199,41 @@
|
||||
]
|
||||
]
|
||||
|
||||
#let has-abilities-section() = {
|
||||
let ability-list = skills.at("abilities", default: ())
|
||||
let has-lang = skills.at("language", default: none) != none
|
||||
ability-list.len() > 0 or has-lang
|
||||
}
|
||||
|
||||
/// 「能力」进度条区块(skills.abilities / skills.language 有数据时才显示)
|
||||
#let abilities-block() = {
|
||||
if has-abilities-section() {
|
||||
sidebar-subtitle("能力", above: space-none)
|
||||
block(below: space-none)[
|
||||
#for (i, item) in skills.at("abilities", default: ()).enumerate() {
|
||||
skill-bar(
|
||||
item.name,
|
||||
item.level,
|
||||
above: if i == 0 { space-none } else { space-skill-gap },
|
||||
)
|
||||
}
|
||||
#let lang = skills.at("language", default: none)
|
||||
#if lang != none {
|
||||
skill-bar(
|
||||
lang.name,
|
||||
lang.level,
|
||||
subtitle: lang.at("label", default: none),
|
||||
above: if skills.at("abilities", default: ()).len() == 0 {
|
||||
space-none
|
||||
} else {
|
||||
space-skill-gap
|
||||
},
|
||||
)
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
#let tech-pill(label) = box(
|
||||
fill: color-page,
|
||||
stroke: stroke-pill,
|
||||
@ -213,23 +254,11 @@
|
||||
]
|
||||
|
||||
#let skills-section-block() = {
|
||||
sidebar-subtitle("能力", above: space-none)
|
||||
block(below: space-none)[
|
||||
#for (i, item) in skills.abilities.enumerate() {
|
||||
skill-bar(
|
||||
item.name,
|
||||
item.level,
|
||||
above: if i == 0 { space-none } else { space-skill-gap },
|
||||
)
|
||||
}
|
||||
#skill-bar(
|
||||
skills.language.name,
|
||||
skills.language.level,
|
||||
subtitle: skills.language.label,
|
||||
above: space-skill-gap,
|
||||
)
|
||||
]
|
||||
sidebar-subtitle("技术栈", above: space-subsection-gap)
|
||||
abilities-block()
|
||||
sidebar-subtitle(
|
||||
"技术栈",
|
||||
above: if has-abilities-section() { space-subsection-gap } else { space-none },
|
||||
)
|
||||
tech-stack-block()
|
||||
if skills.notes.len() > 0 {
|
||||
sidebar-subtitle("补充", above: space-subsection-gap)
|
||||
@ -239,14 +268,15 @@
|
||||
|
||||
/// 主栏经历 / 项目条目
|
||||
#let timeline-entry(entry, title-key: "company", subtitle-key: "role") = block[
|
||||
#text(fill: color-body, size: size-body, weight: "bold")[
|
||||
#if subtitle-key != none [
|
||||
#entry.at(title-key) / #entry.at(subtitle-key)
|
||||
] else [
|
||||
#entry.at(title-key)
|
||||
#block(above: space-entry-title-above, below: space-entry-title-below)[
|
||||
#text(fill: color-body, size: size-body, weight: "bold")[
|
||||
#if subtitle-key != none [
|
||||
#entry.at(title-key) / #entry.at(subtitle-key)
|
||||
] else [
|
||||
#entry.at(title-key)
|
||||
]
|
||||
]
|
||||
]
|
||||
#v(space-body)
|
||||
#text(fill: color-text-light, size: size-body)[
|
||||
#entry.location#if entry.location != "" [,]#entry.start - #entry.end
|
||||
]
|
||||
@ -282,8 +312,9 @@
|
||||
|
||||
/// 获奖经历条目(bullets 可留空)
|
||||
#let award-entry(entry) = block[
|
||||
#text(fill: color-body, size: size-body, weight: "bold")[#entry.title]
|
||||
#v(space-body)
|
||||
#block(above: space-entry-title-above, below: space-entry-title-below)[
|
||||
#text(fill: color-body, size: size-body, weight: "bold")[#entry.title]
|
||||
]
|
||||
#text(fill: color-text-light, size: size-body)[#entry.meta]
|
||||
#if entry.bullets.len() > 0 [
|
||||
#v(space-body)
|
||||
|
||||
@ -1,8 +1,9 @@
|
||||
#import "../../brand/colors.typ": *
|
||||
|
||||
#let color-accent-bright = color-lime-deep
|
||||
#let color-icon = color-muted
|
||||
#let color-accent-bright = color-body
|
||||
#let color-accent = color-muted
|
||||
#let color-skill-bar = color-lime-mid
|
||||
#let color-skill-bar = color-muted
|
||||
#let color-divider = color-muted.lighten(68%)
|
||||
#let color-text-light = color-muted.lighten(32%)
|
||||
|
||||
@ -35,9 +36,14 @@
|
||||
#let space-body = size-body
|
||||
#let space-title-gap = 12pt
|
||||
#let space-edu-notes-before = space-title-gap
|
||||
#let space-edu-meta-gap = 10pt
|
||||
#let leading-edu-notes = size-secondary
|
||||
#let space-between-entries = 12pt
|
||||
#let space-between-entries = 20pt
|
||||
#let space-entry-title-above = 6pt
|
||||
#let space-entry-title-below = 14pt
|
||||
#let space-block = 18pt
|
||||
#let space-main-section = 26pt
|
||||
#let space-main-title-below = 14pt
|
||||
#let space-hero-to-photo = space-block
|
||||
#let space-column-gap = space-title-gap
|
||||
|
||||
@ -86,6 +92,6 @@
|
||||
#let page-margin = (
|
||||
top: 2cm,
|
||||
bottom: 2cm,
|
||||
left: 2cm,
|
||||
right: 2cm,
|
||||
left: 1.5cm,
|
||||
right: 1.5cm,
|
||||
)
|
||||
|
||||