Add resume-career template and migrate resume to resume-bp.

Introduce one-page career resume alongside the full BP resume, unify brand color across templates, and update monorepo docs and gitignore.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
MORRO 2026-06-26 23:19:37 +08:00
parent ed33425ee9
commit 769decd445
40 changed files with 6477 additions and 1078 deletions

11
.gitignore vendored
View File

@ -1,17 +1,22 @@
# Typst 编译产物(示例 PDF 除外)
*.pdf
!resume/sample.pdf
!resume-bp/sample.pdf
!resume-career/sample.pdf
!feasibility/sample.pdf
# 本地定制简历个人内容、照片、PDF不提交
resume/local/
resume-bp/local/*
!resume-bp/local/README.md
resume-career/local/*
!resume-career/local/README.md
# IDE / 编辑器本地配置
.cursor/
.vscode/
# 本地照片(可选提交)
# resume/assets/profile.jpeg
# resume-bp/assets/profile.jpeg
# resume-career/assets/profile.jpeg
# 系统文件
.DS_Store

View File

@ -4,7 +4,8 @@ GreLin 内部 Typst 模板库,按文档类型分目录维护。目录结构如
| 文件夹 | 说明 | 入口文件 |
|--------|------|----------|
| [`resume/`](resume/) | 团队简历 | `cv.typ` |
| [`resume-bp/`](resume-bp/) | 融资 BP 团队简历(完整版,含证件照) | `cv.typ` |
| [`resume-career/`](resume-career/) | 求职 / 个人主页简历(精简一页) | `cv.typ`(内容 `data/config.typ` |
| [`feasibility/`](feasibility/) | 可行性研究报告 | `report.typ`(正文编辑 `feasibility/content/report.md` |
## 环境要求
@ -14,9 +15,9 @@ GreLin 内部 Typst 模板库,按文档类型分目录维护。目录结构如
## 快速开始
1. 用 VS Code / Cursor 打开本仓库,打开要编辑的入口文件,例如 `resume/cv.typ` 或 `feasibility/report.typ`
1. 用 VS Code / Cursor 打开本仓库,打开要编辑的入口文件,例如 `resume-bp/cv.typ`、`resume-career/cv.typ``feasibility/report.typ`
2. 可行性报告正文在 `feasibility/content/report.md` 用 Markdown 编写,无需改 Typst 代码
3. 看效果(预览):`Ctrl+Shift+P` → 输入 `Typst Preview` → 回车;侧边会实时显示排版效果
4. 导出 PDF`Ctrl+Shift+P` → 输入 `Typst Export PDF` → 回车PDF 默认生成在同目录(如 `resume/sample.pdf`
4. 导出 PDF`Ctrl+Shift+P` → 输入 `Typst Export PDF` → 回车PDF 默认生成在同目录
> 不熟悉 Typst可参考社区维护的 [小蓝书Typst 中文教程)](https://tutorial.typst.dev/);英文版见 [官方入门教程](https://typst.app/docs/tutorial/)。

View File

@ -1,5 +1,4 @@
// GreLin 品牌色板 — 全文档统一resume / feasibility 等均 import 此文件)
// 来源 HyperLabel foundationPalette + labelPalette
// GreLin 品牌色板 — 全文档统一resume-bp / resume-career / feasibility 等均 import 此文件)
#let color-ink = rgb("#08090B")
#let color-body = rgb("#2D3135")
@ -7,8 +6,15 @@
#let color-bar-bg = rgb("#EFF0F2")
#let color-page = rgb("#FDFDFD")
// 品牌主色(全项目绿色统一)
#let color-brand = rgb(200, 216, 98)
#let color-lime = color-brand.lighten(10%)
#let color-lime-mid = color-brand
#let color-lime-deep = color-brand.darken(22%)
// 品牌主色(文档统一蓝色)
#let color-brand = rgb("#2850d0")
#let color-brand-light = color-brand.lighten(12%)
#let color-brand-mid = color-brand
#let color-brand-deep = color-brand.darken(20%)
#let color-brand-tint = rgb("#eef2fc")
#let color-brand-surface = color-brand.lighten(88%)
// 兼容旧别名lime → brand 蓝色系)
#let color-lime = color-brand-light
#let color-lime-mid = color-brand-mid
#let color-lime-deep = color-brand-deep

View File

@ -45,7 +45,7 @@
} else {
str(n.at(0)) + "." + str(n.at(1)) + "." + str(n.at(2))
}
box(fill: color-neon, inset: (x: 5pt, y: 2pt))[
box(fill: color-accent-surface, inset: (x: 5pt, y: 2pt))[
#text(font: mono-font, size: 7pt, weight: "bold", fill: color-ink)[#id]
]
}

View File

@ -34,7 +34,7 @@
#let print-glossary-block() = {
pagebreak(weak: true)
block(width: 100%, above: space-chapter)[
#box(width: 100%, fill: color-neon, inset: (x: 10pt, y: 6pt))[
#box(width: 100%, fill: color-accent-surface, inset: (x: 10pt, y: 6pt))[
#text(font: heading-font, size: size-h1, weight: "black", fill: color-ink)[术语与缩写]
]
#v(space-block)

View File

@ -20,12 +20,12 @@
columns: (1fr, auto, 1fr, auto, 1fr),
column-gutter: 12pt,
align: horizon,
tech-label("VERSION", fill: color-neon, size: 6.5pt),
tech-label("VERSION", fill: color-accent, size: 6.5pt),
text(font: mono-font, size: 8pt, fill: white)[#meta.version],
tech-label("DATE", fill: color-neon, size: 6.5pt),
tech-label("DATE", fill: color-accent, size: 6.5pt),
text(font: mono-font, size: 8pt, fill: white)[#format-cover-date(meta.date)],
align(right)[
tech-label("STATUS · DRAFT", fill: color-neon, size: 6.5pt)
tech-label("STATUS · DRAFT", fill: color-accent, size: 6.5pt)
],
)
]
@ -49,7 +49,7 @@
]
#place(left + top, dx: 24pt, dy: 168pt)[
#box(width: 92%, fill: color-neon, inset: (x: 16pt, y: 18pt))[
#box(width: 92%, fill: color-accent-surface, inset: (x: 16pt, y: 18pt))[
#text(
font: heading-font,
size: size-cover-title,
@ -83,7 +83,7 @@
stroke: 1.5pt + color-ink,
inset: summary-inset,
)[
#box(width: 100%, fill: color-neon, inset: (x: 10pt, y: 5pt))[
#box(width: 100%, fill: color-accent-surface, inset: (x: 10pt, y: 5pt))[
#tech-label("ABSTRACT", fill: color-ink, size: 7pt)
]
#v(10pt)
@ -114,7 +114,7 @@
tech-barcode(36pt, 8pt, bars: 10),
box(width: 100%, height: 1pt, fill: color-ink),
box(fill: color-ink, inset: (x: 8pt, y: 3pt))[
#text(font: mono-font, size: 8pt, fill: color-neon)[
#text(font: mono-font, size: 8pt, fill: color-accent)[
#counter(page).display("1")
#h(0.12em)
#sym.slash
@ -135,7 +135,7 @@
columns: (auto, 1fr, auto),
column-gutter: 8pt,
align: horizon,
box(fill: color-neon, inset: (x: 6pt, y: 2pt))[
box(fill: color-accent-surface, inset: (x: 6pt, y: 2pt))[
#text(font: mono-font, size: 7pt, weight: "bold", fill: color-ink)[#upper(meta.brand)]
],
box(width: 100%, height: 1pt, fill: color-ink),

View File

@ -1,7 +1,7 @@
#import "theme.typ": *
#import "decor.typ": tech-label
/// Logo霓虹绿块 + 白色折线图形 + GreLin | Tech
/// Logo品牌蓝块 + 白色折线图形 + GreLin | Tech
#let grelin-logo(
primary: "GreLin",
secondary: "Tech",
@ -9,7 +9,7 @@
columns: (auto, auto),
column-gutter: 10pt,
align: horizon,
box(width: 34pt, height: 34pt, fill: color-neon)[
box(width: 34pt, height: 34pt, fill: color-brand)[
#place(left + top, dx: 7pt, dy: 8pt, box(width: 14pt, height: 3pt, fill: white))
#place(left + top, dx: 7pt, dy: 14pt, box(width: 3pt, height: 14pt, fill: white))
#place(left + top, dx: 18pt, dy: 14pt, box(width: 9pt, height: 3pt, fill: white))

View File

@ -36,7 +36,7 @@
column-gutter: 8pt,
align: horizon,
context section-tech-id(..counter(heading).get()),
box(width: 100%, fill: color-neon, inset: (x: 8pt, y: 4pt))[
box(width: 100%, fill: color-accent-surface, inset: (x: 8pt, y: 4pt))[
#text(font: heading-font, size: size-h1, weight: "black", fill: color-ink)[
#heading-number(it)
#it.body

View File

@ -1,9 +1,9 @@
#import "../../brand/colors.typ": *
// Brutalist / FUI 配色:霓虹绿 · 纯黑 · 冷灰(避免橄榄灰发脏)
#let color-neon = rgb(210, 255, 72)
#let color-heading = color-neon
#let color-accent = color-neon
// 可行性报告配色:品牌蓝 · 纯黑 · 冷灰
#let color-accent = color-brand
#let color-accent-surface = color-brand-surface
#let color-heading = color-brand
#let color-accent-line = color-ink
#let color-divider = rgb(205, 205, 205)
#let color-caption = rgb(110, 110, 110)
@ -62,7 +62,7 @@
#let cover-block-height = 19.5cm
// --- 线条 / 边框 ---
#let underline-stroke = 2pt + color-neon
#let underline-stroke = 2pt + color-accent
#let underline-offset = 5pt
#let heading-number-gap = 0.35em
#let stroke-accent = 1.5pt + color-ink
@ -81,8 +81,8 @@
#let page-accent-bar-width = 10pt
// --- 表格 ---
#let table-zebra-fill = rgb(245, 255, 228)
#let table-header-fill = color-neon
#let table-zebra-fill = color-brand-tint
#let table-header-fill = color-brand-surface
#let table-data-text = rgb(50, 50, 50)
#let table-inset = (x: 10pt, y: 6pt)
@ -99,4 +99,4 @@
// --- 引用 ---
#let blockquote-inset = 10pt
#let blockquote-stroke = 3pt + color-neon
#let blockquote-stroke = 3pt + color-accent

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,8 @@
# Resume · 团队简历模板
# Resume BP · 融资团队简历
GreLin 双栏中文简历 Typst 模板,用于融资 BP data room 附录。
GreLin 双栏中文简历 Typst 模板,用于融资 BP data room 附录。内容偏完整,含证件照、详细经历与可选研究成果。
入口:`cv.typ` · 内容编辑:`data/config.typ`
## 照片
@ -26,16 +28,7 @@ GreLin 双栏中文简历 Typst 模板,用于融资 BP data room 附录。
#let skills = (
tags: ("Rust", "Python"),
notes: (), // 可选:侧栏技能补充列表
// 可选:能力进度条(有数据时自动显示「能力」子区块)
// abilities: (
// (name: "全栈开发", level: 0.9),
// ),
// language: (
// name: "英语",
// level: 0.75,
// label: "读写",
// ),
notes: (),
)
#let education = (
@ -44,12 +37,10 @@ GreLin 双栏中文简历 Typst 模板,用于融资 BP data room 附录。
school: "西北大学",
period: "2022 2025",
location: "西安",
notes: "", // 可选GPA、主修课程等一段说明
notes: "",
),
)
#let awards = () // 可选:主栏获奖经历
#let experiences = (
(
company: "某某科技",

View File

Before

Width:  |  Height:  |  Size: 326 B

After

Width:  |  Height:  |  Size: 326 B

View File

Before

Width:  |  Height:  |  Size: 318 B

After

Width:  |  Height:  |  Size: 318 B

View File

Before

Width:  |  Height:  |  Size: 637 B

After

Width:  |  Height:  |  Size: 637 B

View File

Before

Width:  |  Height:  |  Size: 294 B

After

Width:  |  Height:  |  Size: 294 B

View File

Before

Width:  |  Height:  |  Size: 285 B

After

Width:  |  Height:  |  Size: 285 B

View File

Before

Width:  |  Height:  |  Size: 326 B

After

Width:  |  Height:  |  Size: 326 B

View File

Before

Width:  |  Height:  |  Size: 480 B

After

Width:  |  Height:  |  Size: 480 B

View File

Before

Width:  |  Height:  |  Size: 394 B

After

Width:  |  Height:  |  Size: 394 B

View File

Before

Width:  |  Height:  |  Size: 340 B

After

Width:  |  Height:  |  Size: 340 B

View File

Before

Width:  |  Height:  |  Size: 256 B

After

Width:  |  Height:  |  Size: 256 B

View File

Before

Width:  |  Height:  |  Size: 320 B

After

Width:  |  Height:  |  Size: 320 B

View File

Before

Width:  |  Height:  |  Size: 238 B

After

Width:  |  Height:  |  Size: 238 B

View File

Before

Width:  |  Height:  |  Size: 261 B

After

Width:  |  Height:  |  Size: 261 B

View File

Before

Width:  |  Height:  |  Size: 841 KiB

After

Width:  |  Height:  |  Size: 841 KiB

View File

@ -1,9 +1,9 @@
#import "../../brand/colors.typ": *
#let color-icon = color-muted
#let color-accent-bright = color-body
#let color-accent = color-muted
#let color-skill-bar = color-muted
#let color-icon = color-brand-deep
#let color-accent-bright = color-brand
#let color-accent = color-brand
#let color-skill-bar = color-brand
#let color-divider = color-muted.lighten(68%)
#let color-text-light = color-muted.lighten(32%)

View File

@ -844,24 +844,24 @@ uUL
endstream
endobj
116 0 obj
<</Length 4808/Filter/FlateDecode>>
<</Length 4816/Filter/FlateDecode>>
stream
xœÝ]ùÇmÿ<6D>ÅöJøÌ<>VUó.¶qâ´®˜Ä‰í46Å%Ÿiâÿ¾ŸïìùøCQOKñCéÃy»Ø9°`Ž}¼úöûÏŸrñ}³~osòMà 5Ô<ÂOVv9[n.^<¾ æâ»†œ™pˆ9^sùÝÅËRþE,8I!6Ô\Ž7C•—Óú/O>;y~òþÉî½Íãg_òòÉ“Çïm~¶mèéÓõv)ØbÖ&%rͦÈgŸ$„rÄ”—Ú‚ v'ëó†šóo?§F¨9>}ajÎ_|øã<C3B8>ˆè#"î~¥ûõ§Ÿ¿{²;ŸÁ“kxrj>Mñä5Ç-áRCN(eõ¬W±d©a©Ýoè~c÷Êï§%ý~rý²}ξü>/é·×¿™ÔÞLÔ… §¯¦É€îaèŒàË¿+À “ ·ê‚[¿ôìëv°®§ÓGê8äÌ>t- Užqå™TžuØK‡½tØK‡‡´Ø“ïÚö];¾«Ówå}WÞwå}WÞwå9]ß<>þ ;}TrŠaéîl<C3AE>üÍÍ(ê!Š);a‰Kcø·HþÉß#ù$?ºYøCMDÈ»È¤Ë ü<>¹ßLÓx€bŒE ÉÂNÿèéO<C3A9>¼ƒäŸnF8 læ$¥…Ñ}´Ï£ N5 <09>
'çƒh.ÅKæ"­ETœöBZÀERKU‰!ùg$ÿRWûŠî É¿!ù)’Õ|Ö×8W˜6fq1æ´<C3A6>˜m<CB9C>lçtÛÉH~†ä]$?`¿@òÞluZõ—Hþ³×ýûdèí<C3A8>'OŸÿðõÿ⓾úó÷‡ôÖi<C396>\K˜g ¹2€ÃU F—…Dœšg_6äbó—F÷:{ȼ ê=i1ˆÆ;fï|Yb±‰¦·'Ÿ<><k>ù¦àXBjRV—-æ++ˆÓl¼<1C>1‰cæærRz€<7A>|vò“—]ÍWÞ´­8…<38>§ÐË 4&v™!‰—cà]Ô¾ÇÑÖ÷à”Рgt9' Óz`9 ?ÿJÍö«ŽÆïãÿ+³Ç(.ÁwhÝ?BØc<C398>ÀäÄGôý¾oeÖÌá(Ñ%¯9aW-ÍÎ\zY±3xk‡Ö&øCèåJ~€Nj¡OÓ<E28098>¡yÚ>~4¹ŸkzÒ/%i`\år ôTB·H×'ܼÛpó|FïàW<C3A0>™Ç<E284A2>FnÆ»oX\$n„]/{Ñ@>7"ŽbŒ17Ì.µ(û0o63¼õ•jߢñFàBæ$Ò¤þBÐ]£SÎr#ÀrÈÙb~QXéNIÆ¡%~ÙÅs ûñ
˜³êä<\ž´InkßÛš<d²&O(=T™ÐÖ˜µ´ÑiÏ>=tjBÙ-9“”ükúkÜØµBô_WÜšòû~E s}ì¢`iF FèT BŽ35<>ÞN ÆFŽ(Çš@¦¤aÃåe É" ¹ô#d#&ÒŒ+æP®|J WJœch.PÆ|b*Д%$°¿ó™rô€Y¢˜3ZËRî;ÁI*Ù+ !‡¨`©”£A0aÝha'vl g—ÑTv)ù Daj±Æèè˜AœÄȉ ¥Œwjf)ƒ‰EYHqªYÔ7ÉI"3M<33>8FBš¼o¼B9‰oÄIˆ¤ñÐ!$4â¢×ƒá*p.­{ QÂGË ‰9˜
j&
#šâ¢@R{qÙdÇì3Èà̈Ùr“<72>E PpxGICvïŠZˆâu1T[cNÈ\Is™èB'ð”5ù€÷Ž”ShÌù¥¬™Pƒ<50>MvQ ¹É<C2B9>6 ,B]•}Ј¾ 9j(
SsT-Wdè
58 6VTwÙB[—‹ ýq0ÒûÆAbé[MÈÃE§gçSTJ)JÌœg3_†ƒ½GBpŸQHØ!gôh”<çX˜\#8#MæGi¨¨+­¨«`´˜ºêÃÿ<>ä’óá¶üj ¿.IE£ ÎòTÑœF {-ÚœF¡·ÔhC#Çh4m`Ò
5à0aǤ!5о/õ„¾o"¸BFð³U}mΡˆ<CB86>¤´#¾ÀM<C380>±<5Ó"¨å¢A<C2A2>—Í^3ðÒ<C2B0>­î” 0S0þ{GÅ@J<><q
Ÿ8°iÌR¤×ÌŸÂÈFx‡õ´¶ð +ÅšX$ÿÄÉo¦5üj€ä·H~‡äÊ ¡‘)ÿû9  {ëPFè-%hhäX 7 "Yóäª},p¢Ó”8`8,&ð˜YŠD 9&y[y9­ åo)-oäå j/šèàDb]œÜÁ¼^6GE nQ¦}Ç»<C2BB>IçÉõâškââbâZäë£<C3AB>¤óÙ ´ɯ§ÒùÁ»üý¶ü$@òÉ<C3B2>§<ýÝë™Æ®ð3®×kDØ'ß¹6Š`5,(¹rZ,ˆÐGé¨2åT shN.qÚߊSnšsªÍ)uøïÝ´SL•÷©Íj"Ø¿öÚ¡V;bþ¬}<7D>ÿ<EFBFBD>ÞœOåä|iÿ±ž·³™Š_ÁÝ•Úd£ª8ÞŽïèXëz_{#‰Ž##rû¾×ÏnÑýç·íý[kI¥¼G³Å´¤h Ÿ¾ª-kí§˜E*¼U«ÝñTn?3dÇz5gÞ§Û¯5fB¨Aœ&EŸý䪟J¢“ÀËFn—ìLI§åP[übdÇ^X uô0sLmR)“Ë”<C38B>mhu]tµŽ<C2B5>Ë)ò”†Šilöb²Væh2¿ú\V/?=9_<r,ry3 Í«ŠCGTËÖ+;Øño^É?lÑ?û´¢+çÓ;<3B>„HžŠKÄñ<C384>¬ãº„ó/n­rFh€ã<E282AC>(Ÿ\Ê^-VöVB“wZÜ&hú±äë™y„L¸yö\7V<òäØôÛS×Òúíð hz¼Ž8ô~1MÝQ}9ñÏO‰3±˜môdK´é<C2B4>Šâ8tYÌQÀ±û©9X#¤»1)‚“`T /s„±Ë¼"šã(8À†ap€LÇÁ8 „CÅ“<C385>phúíiŽki}”]ñ<>hz´æð‡ÑÜS}9ÍñÅ)f¿"qˆåþK$—§Œu
,­ù²²Ðô0èÁI{Jùž*މ•,êDeß3Ó6¹œà&¶ã£`Z;ÜyïB ±iÉÖsù™pùÆÇ¡âÉø84}/\+Ä>ÊèxHD=^uHÍ1áàÔ/âœzr¼úvêOõñÛÜ.K±lòÈ<C3B2>çäˆï•°à4 £ß…Â<E280A6>²jݸ@²x,˜ã)g÷ <C3B7>±{À”¯{Ø0"•NFľշ§*®'óQVÆÃ çñJâ0ÐÉDÅÓ/N™ÕIH™Gû¢3Ê|Êï+Zâ0ðÉœ…ÀrÕkp>`ÍÓ<C38D>¨‰èȲú܇åB
¸²p ð½¨\›„å:È~\®Ns¥Ú½°\×ìÛôF®#ôa·AÐãUÅa õ$_Ξ@Ò\qG¾ªè‡Ts=îŸ~Ma± SS<17>X˜3ÃÊÅÖDFØ<zVmŒÑm6 }d:ö ÀÁD*ž°ôÐô}ð;®û(ñ<>ˆz¼žÈ¿C²¹¤~Mñõ°ç<>Á𸦢(ƒ›)8Î1¦Øˆ±óœýýŠQ`õIAoyUá³#1HCÁ O”\" ¶¿oA“ð} Ø<>Þ·°Ið¾­sâF÷m¾Åé<C385>ëh|Tdâ!ÐòhÍ ‡ÁL“žÚ *†²ãÿs$ß!)G|]Ù‚>¼”ìÔöŠÜKÅÀ×»1"<¬>ñúñ. ´q6BìG÷ãllgë ûq¶8ﺊ÷âl]ÓoÓÑ¸ŽØG/Q<>W2?ÛÔ’}A]1¾üó`Yü©¢6|Åñ¸Ÿjcb'ïB¼ßV[Î|(wØííyÜ…èRÎ;¬†’#¬çð2áðØóáXñÈ¥cÓ÷Â÷¸BìcÔÆƒ"êñjCk¾GÄ^=¿”ïQ @y­ÅlÒéèÃë<C383>8<EFBFBD>÷WÁ×­€ÕÃ0«PÙæ™lùÓ®?,©¢c cR—ÌËkª_/ΪÚc­ÉJía¹pO¼
R…H!cÇ2‡…Oôzɪ¶…àƒƒí:ý[ÿßôæ/HþZyÙÃH„`«a†…¨N<C2A8>ÙzQ<1B>Ø<1B>÷p:Œ:ˆ0¶m_ §ŸùHäÏDÞˆüŠÈ¯‰8qÆ®pœPD”VDiM¤L”6DiK¤"Ýâð"àC¤xŽg;¢tF„â‰tG”™H<E284A2>HWDYˆ²ÇQDO¯??j<E280B9>¤ápÛÇôRàZ/-…º©<C2BA>Ñ©1H«D9åH”QÎDˆ$e#bäÇ3<C387>»tÛSQuI(ꢼ!Ê[¢Œž9#2>…ê×{ÙŒ‰LˆÌ™vXlˆ,Y¬tžÔè„i ‰<E280B0>É‘å–{«ÜåkÜEv¸ã.¸KkT[
)<29>­ÉŽÛzú(™ãL9ÏœaØ?Ám&÷§‡Yo¨eEdk"~ƒ"Á/Ø“gj¿²§¬rßÌ^RìÕåè9.¦ýtXQ[ÙØf6
|¯âdÅ",»VíÓYEP  êr¦´4 <>„ßÍ3ÍQ€¬ÃlÀ!5yŸÙgLæröº0
D>ü±ñ7 —Í·wNåëOŒ¤Š†R#¯ì.{“VâdÿõǃÍ÷ó
²3ƒuÀA@Dº²`L0¤­`â€IcǤÚ2jm`ŠR1Ä5·BöFw嶇Ðã®\=Àö6îJô5*adY&tjh‡§C æ±îk¢{øŒ(Å®ó'ùÂf/T˜@+։РïÀ:‰¡&ûK!Õræþ¡»·;ävÆýOÉ)#±0Ú¯{Îm<t=bd)Ñ‚ýõ¸ã}ñ.°®NöD¢8qWpψVð?pŸ‰VÖºðjC_œY<15>Ùi œs¸ì«Îç*}23FSp<53>-ÉGOFwnWnU>RÍkVò.§˜îXq¤šÓ¼N…p<E280A6>_ ­ÖD« Ñj{àäöÑ ø¿‚? ס¥yYÁAÊnôêŒh<C592>a¢µ­=£Íxo†`ERÍgö¹¬£[êŒóŸÎŸ‰¼‡^Ícö1â`R½kΪ9ÌKáÔRl<^û†#ËgFM<46>NÈX—Cñ QòDë@vDëØþÕ'£¹˜eY<{é[CX·clq<6C>‰ÖF´^µR‰ðâkü!±³ž>bsI,ˆŸ‰0 Ïž­w­ñ]ÂŽg¥IÚp+å1]ñšh#¥¿)&ýyËsãÇq`£û–%þp?¥TuŒÈãÙ³wŠO²,5ƒsÅ“x•œd„1ƒ¼7]Ê'ªXcü~Esаˆä~äðé<C3B0>ÊwTòÌppjÆÁ¡Ë¾ÙÜw-æ=µ7?‰U¡×ú:š vÄDíýš‡ÊRRªà@Ñßñ˜š}EÇ-†TÑq<C391>hýˆ6˜<36>Êc`šíúª+6ÙY`ky¢ÍŠh¥Ëow`ù &Ý,,¿Íh³#Ú`V¤â£çší!<1E>š+ßÈzSt-0øm$OD[©ëûjl†íVGJß1ÅùBj:á9LJ^™Äl=ÑVÇÉÏÞ«õgD{zjŒC…'DÛ@ä¥n_å™@º÷.œñ½ØûΞt³Õšg¼ò<C2BC>]Ž8®|ÑÞ饷JÊ™³*³¸TÍ; å—Ç«? K딵Ã?àLp|—eQÂölnézÂZÍSg .Kˆè4è°~µ@­ëmfÈ Ñ©ôËbµ<>º¿æslf 5qÄøÎÌ¢Xö#Ù¯à [ [¸Cgc™)¬·k¢-\¥üj«6L+æÇärVòoÑTÿÑ<Þ3ÒOo²Ômf<10>ÙWì»ZúÅZûJ ùÑtÞdüüØÛ·á­¶âÛqÛ¹í‡aÄ[ªXWŒ¥.ˆÅܱue¹¦È—BªXW«{»%ÚB‰@¡À’‚"Š%8ZSoð_5ì±d×ý;!Ú!”•‰vJ´Ãô  È“:VSLVë&L±ã„§;î&¦Ú|úbXµ2~u°n±0ÍX<1A>†¤¼47<E28099>1ÆúÔ;ŸB•/±§è•ΟyBž£ó¤ø~Åb„À> í àúÑ® Šö <E28099>Ôí AÛÉ4F»J«òj3GR[v>âÓ<C3A2>¾Ún‡íΊáqš3½ñì¢.Œd;»YC¬69Ž¥&œt} Á3>Ô}¯¸{€šÌØ3ºõ[ß ßòÆÙ É´g`Œw<77>àZíç¼'w·ß2öÔ‰<C394>تdŠ/gÝ%¢ÿa3È
xœÝ]ùÇmÿ<6D>ÅöJøÌ<>VUó.¶qâ´®˜Ä‰í46Å%Ÿiâÿ¾ŸïìùøCQOKñCéÃy»Ø9°`Ž}¼úöûÏŸrñ}³~osòMà 5Ô<ÂOVv9[n.^<¾ æâ»†œ™pˆ9^sùÝÅËRþE,8I!6Ô\Ž7C•—Óú/O>;y~òþÉî½Íãg_òòÉ“Çïm~¶mèéÓõv)ØbÖ&%rͦÈgŸ$„rÄ”—Ú‚ v'ëó†šóo?§F¨9>}ajÎ_|øã<C3B8>ˆè#"î~¥ûõ§Ÿ¿{²;ŸÁ“kxrj>Mñ,´<GŒs<C592>ú«H²Ô<C2B2>Ôî7t¿±ûMå÷Ó~?¹~Ù>g_~Ÿ—ôÛë_Lj/&êBŠÓ7SËäM@ö0¼YðåßúsÃä­zàÖ/=ûº¬+Åéô‘:]ËB•g\y&•göÒa/öÒá!-öä»¶}׎ïêô]yß•÷]yß•÷]yN×w§?èNÕ…œbXº;$s3ŠzˆbÊNXâÒþ-¿Cò÷HþÉ<>nýPò.2é2ÿcAîÇ7Ó4 £ãUưtúG§Hä$ÿt3Âéa3')-Œî£}6epªYÇHèT89Ds)^2i-¢Zä´Ò.ZªÊH É?#ù—º
ØWtO<EFBFBD>ü+§Hþ ÉO¬®à³¾žÀ¹Â´11§…Älƒd;§ÛvHÎ<48>ü;’ÿ@ò3$ï"ùùû÷f{¨Óª¿DòŸ½îß'Coî<yòøü‡¯ÿøøŸüðÕŸ¿?¤G°NëäàZ´äØ<kÈ¥¨‰á*IP#<23>ËB"NͳÍ/r±ùK£Í{<7B>9dÞõž´ØCã³w>‡,±˜DÓÛ“ÏNžµHŸ|Sð ,!5)«Ës€Äi6^ŽÀ˜Ä1ss9)=ÀN>;ùÍÉË®æ+oÚVœBÈSèå»Ì<C2BB>Ä˱ ð.jßãhë{pJhÐ3ºœ“†i=0IП¥fûUGã÷ñÿ•Ùc—à;´!ì1H`r⣀?ú~ß72kÖp”è×<1C>0‡«fg.½¬Áƒ<AµCëEü!ôr
%?@'5ŒÐ<C592>§ÈiÈÐ<m?šÜÏ5=é40®`€kAz*¡[¤ënÞm¸ù.£wð«ÎÌãG#7BŽq'.7Â.ÁÁ½h ŸG1Ƙf—Z”}˜7Ë™ ÞúJµoKÑøE£Mp!siR!è.AÑ)gI¹`9äl1¿(¬t§$ãÐ’ ¿ìbˆ9„†ýxÌÙur^=kÚ$·µïmM2 YŠ'”ªLhkÌZÚ¿è´ç Ÿ:5!<21>ìœIJ~Ï]+â ?—[?7<>”2¼:øÙµBô_WÜšòû~E s}ì¢`iF FèT BŽ35<>ÞN ÆFŽ(Çš@¦¤aÃåe É" ¹ô#d#&ÒŒ+æP®|J WJœch.PÆ|b*Д%$°¿ó™àO ;KsFkYÊ}'8I%{,•r4-ìÄŽ­áì2šÊ.%Ÿ<>(L-Ö}]3ˆƒ“9qƒA º ”ñNÍ,e0±( i#N5ú&9Id¦©ÇÒ¨ãŒBdC“÷<E2809C>wQ('ñ<>8 Q4:D„F\ôšb0\ŽÂ¥5b/Á"JøhÙRƒ!1SAÍDArDS\Hj/.›ì˜}œ1[n²³h
ïh1icÈî]BQC Q|£.fjkÌiÙ‚‹"IRc.sž²&ðÞr
<EFBFBD>9#£"¿”5jð±É.j!7²À†<C380>ãCˆ «²Ñ7!G EajŽªåŠ ]a ÔÆŠê.[h`ër¡!ÆRzß8H,}« y¸èôì|JJ© E‰™ólæËp<C38B>¢÷àHÈî3
;äŒ<1E>ç “Kcg¤Éü( uŒSW}8ã¿<Cr>Üö!_ à’á×%©h´ÁYžê#šÓhtO£EÓh#ô–mhä<18>¦ LZ¡˜4¤FÑ·à… žÐ÷MWHÈ}¶ª¯Í9”vĸ 2§fZµ\4¨ó²Ùkf¸V:°Õ<C2B0>f
Æï¨H 'Ná§6<>YŠôšYðSï0£žÖža¥XäïŸX ùÍ´†_ à<0F>üÉï<C389>|X !42å?'AtOàc½¥ <0A>kôArA$kž\µ<>Ntš ‡Åó Kˆ!Ç$ï`+OòC"§µ¡ü-¥å<C2A5>¼|AíEƒˆ@¬‹“;˜÷ÃëÃæh±hÁÃ-Ê´ïx÷/0é<¹^\sM\C\L\|}ôÑ<C3B4>t>„öã!ùõT:?c—¿–ÿƒäH>ò”§¿{½ ÓØ~Æõz<C3B5>(ûä"â;×F¬†%CNú(U¦œjaÍÉ%Nûà[qÊMsNµ9¥ÿ½vŠé¢ò>µÉAMû×^;ÔjGÌŸµ/ð¿Ó󩜜O íã?Öóöb6Sñ+¸»RlTgaÑ{Óñk]ïko$ÑqdBîaß÷ZðÙ-ºÿü¶½k-©”÷h¶˜­`á3ÃWµÅb­ý³H…·jóŽ>²cõ¯;žÊígæ<67>ìX¯æÌûtû¥&âbÂL5ˆÓ¤è³Ÿ\õÏáSItƒxÙHBð'Âí<C3AD>)é´Üj_Œ€ìØ ‹¡Žf.©M*er™² ­Ž ‹®Ör9E~€ÒP1<50>Í^LÊMæWŸËêå§'ç‡BÎ<42>E.of¡yUqèˆê`ÙzeÇ;þÍ+ùçƒ-ú§bŸVtÅá|zb§ÉSq‰8¾ñ<C2BE>u\—pþÅ­5CÎÅà“KÙ«¥ÂÊÞJh2àNÛM?a=3<><33> 7<>ÀžëÆŠGž~{êáZZ£M<>ׇÞ/¦©;ª/§">Còùé#q&sj×¢<C397>žl‰6½SQ‡Î"9
X0v?5t7&EpŒ
ôcSòe0v™WBDsØ0 <0E>é88<>p¨x2M¿=Íq-­<>²+M<>Öþ0Â<>{ª/§9¾8ÅìW$±Ü‰äò”±N<C2B1>¥Õ#_Vš=8©cO)ßSÅ1±E<E28099>¨ì{æoÚæ —ÜÄv|LkÇ€;ï]$6-9Âz.!.<1F>Ãø8T<‡¦ï…Kr…ØG‰¨Ç«©9&œúEÜSONWß®BýÉ >~{ƒ›âÃe)=¹ñœñ½Rœ&Árô»P’À.VBV<42>HB<16>3b<åì40v˜òuFÄ¡ÒɈطúöTÅõd>ÊÊxä<^I:™h øbZâÅ)³: )óh_”`F™Où}EK>Y³X` άyº5YVŸû°\H×R®¾•ë`“°\Ù<>ËuÀI`®T»–ëš}ÞÈu„>2Ìù0z¼ª8 tr žäËÙHš+îÈWý<>j®ÇýÓ£),ajê¢ sfX¹ØšÈˆGÏÀª<C380>1¢íãÈ7À†¡o€LǾ8˜ÈCÅš¾~ÇUb¥#Q<>×¹âwH6—Ô/¢)¾Vã¼3XßTÅap3Ç9Æ1vž³¿_1
¬~1)è-¯*|v$ih#ø<>¢á‰K¤Áöã÷-h¾oûÑû6 Þ·uNÜè¾Í·8r<1D><>ŠL<Z­ô0˜iÒS{AÅPvüŽä;$åh€¯+[Ðg<E28094>ZÂ^¡`òz7F„‡Õ'^C?ÞeÁ6ÎFˆýè~œ­ƒMâld?ÎÖ'ã]Wñ^œ­kúm:×ûÈàåÃ!êñªBægZ²/¨+f×,?UÔ†¯8÷SmLÌáä]ˆWð{Ãj#`˙廽]02<30>»]Ê9`‡ÕPr„õ>B&>{>+¹tlú^øWˆ}ŒÚxPD=^mhÍ÷ˆØ«Çâ—ò=Jòítáëü(¯µXM:]}x½òþ*ز,öº°zf*Û<“-ÚÀõ‡%Uôo¬aLêyyMõëïÅYU{¬5Y©=,î‰W!Rª)dìXæ°ð‰^ï#YÕ¶|p°]§ëÿ›ÞüÉ_+/{l5Ì<35>¢Õé1[/jò{£ñN‡QƶMòáôá"‰|"ò™È_ù5'"ÎØŽŠˆÒŠ(­‰”‰Ò†(m‰tC¤[^„|ˆÏñlG”ΈP\"îˆ2©éŠ( Qö8ŠèéõçgQ­“4¸ƒ^
\륥<C2A5>B72z"U"i•(¢‰r"Ê™Hd¢lDŒüxr—n{*ª. E}B”7DyK”Ñ3gD†Ã§Pýz/1 y"Ó "‹•Γ<1A>0­!q2Y"²Üro•»|<7C>»È7rÜwi<77>jK!²õ*;"9Ãq[O%sœ)ç™3 ûG ¸Íäþô0ë µ¬ˆlMäÁoP$ø{òLíWö”UŽàÙ CêB½º=ÇÅ´Ÿ+j+ÃÌF„ïUü¬X„eת}:«Ê¡a A]Δ–&a3<61>ð»y¦9#
<EFBFBD>u˜ 8D &ï3ûŒÉ\Î^&òŠ_<C5A0>ȇƒ?6þfá²ùöΩ|ý‰TÑPjäâ•ÝeoÒJœì¿þx°ù~^Avf°8ˆH—CŒ †¢L0iì˜T[F­ LQ*†¸ÆãVÈÞè®ÜöÚcÜ•«ØÞÆ]‰¾F%Ì‚,"Ë„N íð`ˆÁ<Ö}M`Ÿ¥Øuþ$_ØLò…
hÅ:QÃ<E28098>áX'1Ôd)¤ZÎÜ?t÷v‡Üθÿ)9eÄ!FûuϹ<C38F>‡ƒ®GŒ,%Z°ÿ¯w¼/ÞåÖÕ©âÀžH'®ã
îáÑ
þî3ÑÊZwCmè2; „s—}Õ™à\¥OfÆh
.P°%ùèÉèέàÊ­êÃGªyÍJÞåÓ+ŽTsš—©®óA¸Õšhµ!ZmœÜ>zÿWð‡á:´4ï£ +8HùÀ<C3B9>^<5E>­Ñ#L´¢µ'btÑnt±Ïà­Ã¬HBªùÌ>—utK<74>qþÓù3÷ЫyÌ>FLªwÍY5‡y)œZŠ<5A>Çkßpdų̀©Ñ ër(>!JžhˆÂŽhÛ¿š"N3ãd4³,g/}këvŒ-®3ÑÚˆÖ«V*@|q<>?ä/vÖÓGl.‰ñ3†áÙ¢õ®5¾KØñ¬4In¥\ ¦+"^m¤B£Tã7Ť?/cynü8ltß²Äî§”ªŽ¹b<{öNñE¥fp®x¯2ƒ“¬0fЃ÷¦KùDõkŒß¯hNÜoƒ>½QùŽJž®NRÍ88tÙ7û®Å¼§öæ'±*áZ_GsÁŽ˜¨½_óPY*C*B(ú;S³¯è¸Å<C2B8>*:.m ßѳQy L³]?CuÅ&Û l-O´Ym Ôaùí,¿a¤<05>å·ÙmvDÌŠT|ô\³=Ä#PsåYoŠN ¿-ä‰h+u}ŸC<C5B8>ͰÝ*âHé;f³X#ßRHM'<‡IÉ+“˜`­'Úê8ùÙ{µþŒ`OO<4F>q(@¢ð„hˆ¼Ôí«<H÷Þå€3¾{ßÙ<13>n¶ZóŒW²ËÇ•/Ú;½ôVI9sVe—Ê y¤ür âxõ‡a)`<60>²v8✠Žï²,JØžÍ-]OX«yêlÁe q<11>Ö¯¨u½Í ™!º@8•~Y ¡R÷wÃ|ŽÍŒ¡&Žß™YË~$ãcdkã@a wèl,3…õ£àvM´…«”_mÕ†iÅ|ã˜\ÎJþ-šê?‚Ç{FúéMºÍ ¢1;òŠ}WK¿Xkq_‰!?šÎ›ŒŸ{û6¼ÕVÜa;n;·ý0ŒxK늱Ô±˜;¶®,×ùRHëjbuo·D[((XRPD±Gbê þ«†=V€ì:£'D;„²2ÑN‰v˜~Ã*ÔƒÁyR§ÀjŠÉjÝ„)vœðtÇÝÄTO_ «VRƯÖ-¦«@£Ó<C2A3>”—Fò¦ó ÆXŸzçSh£ò% öt½Òù3¯BˆCãÃstž߯XŒx#LÿÀga¢$\¿"ÚuAÑ^´“º$h;™ÆhWiU^mæHjËÎG|:pÑWÛíð<C3AD> ¢ÝY1<n@sæ£7ž]Ô…lg7kˆÕ&DZԄ“.¢o1!xƇºïwP“{Fó­¾CÝ ôò!¤äEÚ30Æ»ÈNð­ökÞ“»ÛoŽ {êÄGìU2Å—³îÑÿ˜è3¸
endstream
endobj
117 0 obj
@ -4733,12 +4733,12 @@ T
endstream
endobj
119 0 obj
<</Creator(Typst 0.15.0)/ModDate(D:20260625171058+08'00)/CreationDate(D:20260625171058+08'00)>>
<</Creator(Typst 0.15.0)/ModDate(D:20260626220705+08'00)/CreationDate(D:20260626220705+08'00)>>
endobj
120 0 obj
<</Length 996/Type/Metadata/Subtype/XML>>
stream
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?><x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="xmp-writer"><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/" xmlns:pdf="http://ns.adobe.com/pdf/1.3/" ><xmp:CreatorTool>Typst 0.15.0</xmp:CreatorTool><dc:language><rdf:Bag><rdf:li>zh</rdf:li></rdf:Bag></dc:language><xmp:ModifyDate>2026-06-25T17:10:58+08:00</xmp:ModifyDate><xmp:CreateDate>2026-06-25T17:10:58+08:00</xmp:CreateDate><xmpTPg:NPages>1</xmpTPg:NPages><dc:format>application/pdf</dc:format><xmpMM:InstanceID>YG9afPnvozvA+8c8Oh87JQ==</xmpMM:InstanceID><xmpMM:DocumentID>YG9afPnvozvA+8c8Oh87JQ==</xmpMM:DocumentID><xmpMM:RenditionClass>proof</xmpMM:RenditionClass><pdf:PDFVersion>1.7</pdf:PDFVersion></rdf:Description></rdf:RDF></x:xmpmeta><?xpacket end="r"?>
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?><x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="xmp-writer"><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/" xmlns:pdf="http://ns.adobe.com/pdf/1.3/" ><xmp:CreatorTool>Typst 0.15.0</xmp:CreatorTool><dc:language><rdf:Bag><rdf:li>zh</rdf:li></rdf:Bag></dc:language><xmp:ModifyDate>2026-06-26T22:07:05+08:00</xmp:ModifyDate><xmp:CreateDate>2026-06-26T22:07:05+08:00</xmp:CreateDate><xmpTPg:NPages>1</xmpTPg:NPages><dc:format>application/pdf</dc:format><xmpMM:InstanceID>Rq5tUu1gLtpQkiBO4QI29A==</xmpMM:InstanceID><xmpMM:DocumentID>Rq5tUu1gLtpQkiBO4QI29A==</xmpMM:DocumentID><xmpMM:RenditionClass>proof</xmpMM:RenditionClass><pdf:PDFVersion>1.7</pdf:PDFVersion></rdf:Description></rdf:RDF></x:xmpmeta><?xpacket end="r"?>
endstream
endobj
121 0 obj
@ -4863,13 +4863,13 @@ xref
0000119124 00000 n
0000119836 00000 n
0000138524 00000 n
0000143403 00000 n
0000143810 00000 n
0001005525 00000 n
0001005638 00000 n
0001006711 00000 n
0000143411 00000 n
0000143818 00000 n
0001005533 00000 n
0001005646 00000 n
0001006719 00000 n
trailer
<</Size 122/Root 121 0 R/Info 119 0 R/ID[(YG9afPnvozvA+8c8Oh87JQ==)(YG9afPnvozvA+8c8Oh87JQ==)]>>
<</Size 122/Root 121 0 R/Info 119 0 R/ID[(Rq5tUu1gLtpQkiBO4QI29A==)(Rq5tUu1gLtpQkiBO4QI29A==)]>>
startxref
1006881
1006889
%%EOF

98
resume-career/README.md Normal file
View File

@ -0,0 +1,98 @@
# Resume Career · 求职 / 个人主页简历
精简一页中文简历Brittany Chiang 风格双栏布局。与 [`resume-bp/`](../resume-bp/) 共用同一套目录约定。
## 目录结构
```
resume-career/
├── cv.typ # 入口(一般不用改)
├── data/
│ ├── config.typ # ★ 内容:姓名、经历、技能等
│ ├── layout.typ # 排版组件
│ └── theme.typ # 设计 token字号、间距、主题色
├── assets/
│ └── profile.jpeg # 证件照(可选,侧栏「专业技能」上方)
├── local/ # 个人本地版(已 gitignore不提交
│ └── <你的名字>/
│ ├── config.typ
│ ├── photo.jpeg
│ └── compile.ps1
└── sample.pdf # 示例 PDF可提交
```
| 文件 | 谁改 | 说明 |
|------|------|------|
| `data/config.typ` | 日常编辑 | 简历正文与联系方式 |
| `data/theme.typ` | 调样式时 | 字号、间距、主题色 |
| `data/layout.typ` | 改结构时 | 区块组件与排版逻辑 |
| `cv.typ` | 很少 | 页面级 grid 编排 |
## 快速开始
1. 编辑 `data/config.typ`
2. 证件照放入 `assets/profile.jpeg`(或在 `profile.photo-path` 指定相对 `data/` 的路径)
3. 打开 `cv.typ`Tinymist 预览或导出 PDF
CLI 编译(仓库根目录为 `--root`
```bash
typst compile --root . resume-career/cv.typ resume-career/sample.pdf
```
## 照片
`photo-path` 相对于 `data/layout.typ` 解析,默认:
```typst
photo-path: "../assets/profile.jpeg",
```
留空 `""` 则不显示照片。
## 本地定制local/
个人真实简历建议放在 `local/<名字>/`,避免污染模板示例:
```
local/qimengfan/
├── config.typ # 完整 config 副本photo-path 可写 "../photo.jpeg"
├── photo.jpeg
└── compile.ps1 # 临时覆盖 data/config.typ 后编译,见 resume-bp/local 同款脚本
```
`local/` 已在仓库 `.gitignore` 中忽略。
## 主题色
`data/theme.typ` 改一行:
```typst
#let color-primary = rgb("#2850d0")
```
`color-accent` 已绑定 `color-primary`,姓名与区块标题会自动上色。
## 内容建议
- **简介**:一两句话
- **工作经历**23 段,每段 23 条 bullet
- **项目**23 个,各一行 `intro`
- **教育**:通常只保留最高学历
`bullets` 用字符串元组,不要手写 `-` 列表语法。
## 设计 tokenTailwind 灰稿)
规范来源:[Tailwind CSS 默认 theme](https://tailwindcss.com/docs/theme)
| Tailwind | 本模板 | 用途 |
|----------|--------|------|
| `text-3xl` | `size-3xl` 22.5pt | 姓名 |
| `text-base` | `size-base` 12pt | 区块标题 |
| `text-sm` | `size-sm` 10.5pt | 正文 |
| `gray-900` | `color-heading` | 小标题 |
| `gray-600` | `color-text` | 正文 |
| `gray-500` / `gray-400` | 次要 / 元信息 | |
间距 token 按各层级行高定义,详见 `data/theme.typ` 注释。

View File

@ -0,0 +1,2 @@
# 占位:将证件照命名为 profile.jpeg 放在此目录
# 或在 data/config.typ 的 profile.photo-path 中指定其他相对路径

Binary file not shown.

After

Width:  |  Height:  |  Size: 847 KiB

57
resume-career/cv.typ Normal file
View File

@ -0,0 +1,57 @@
#import "data/config.typ": *
#import "data/theme.typ": *
#import "data/layout.typ": *
#set page(
paper: "a4",
margin: page-margin,
fill: color-page,
)
#set text(
font: body-font,
size: size-body,
weight: weight-normal,
fill: color-text,
lang: "zh",
)
#set par(leading: leading-body, spacing: space-none, justify: true)
// 页眉单独一行 grid左右栏等高短侧自动补白
#grid(
columns: (main-column, sidebar-column),
column-gutter: space-column-gap,
align: (top, top),
profile-block(),
contact-block(),
)
#v(space-header-bottom)
// 正文区:「工作经历 / 专业技能」等同水平线起排
#grid(
columns: (main-column, sidebar-column),
column-gutter: space-column-gap,
align: (top, top),
[
#section-title("工作经历", above: space-none)
#experiences-block()
],
[
#sidebar-photo()
#section-title("专业技能", above: space-none)
#skills-block()
#section-title("项目经历")
#sidebar-projects-block()
#section-title("教育背景")
#sidebar-education-block()
#if interests != "" [
#section-title("兴趣爱好")
#interests-block()
]
],
)

View File

@ -0,0 +1,121 @@
// =====================================================================
// 示例内容 · Brittany Chiang 简历中文版(预览排版效果用)
// 原文https://brittanychiang.com/resume.pdf
// =====================================================================
#let profile = (
name: "齐梦璠",
summary: "经验丰富的软件工程师,专注于打造交互友好、无障碍的体验。",
photo-path: "../assets/profile.jpeg",
)
#let contact = (
phone: "(914) 960-3665",
email: "brittany.chiang@gmail.com",
github: "https://github.com/bchiang7",
github-label: "github.com/bchiang7",
website: "https://brittanychiang.com",
website-label: "brittanychiang.com",
)
#let skills = (
categories: (
(
title: "编程语言",
items: "JavaScript (ES2015+), TypeScript, HTML, CSS, Sass, PHP, GraphQL",
),
(
title: "框架与库",
items: "React, Next.js, Gatsby, Eleventy, Node.js, React Native, Tailwind CSS, Styled Components, Framer Motion, Anime.js, Timber for WordPress",
),
(
title: "工具与平台",
items: "Git, GitHub, Netlify, Vercel, Heroku, WordPress, Contentful, Algolia, Firebase, Storybook, Docker, Webpack, Figma",
),
),
)
#let education = (
(
school: "东北大学",
degree: "信息科学学士 · 人机交互方向 · 交互与体验设计辅修",
period: "",
),
)
#let experiences = (
(
company: "字节跳动",
role: "首席工程师",
start: "2022.03",
end: "至今",
bullets: (
"为多元客户构建、设计并交付高质量网站、设计系统、移动应用与跨平台数字体验,技术栈包括 JavaScript、TypeScript、React、CSS、WordPress、Contentful 等。",
"主导 CMS、REST API、CI 流水线等技术工具的架构与开发,满足业务需求。",
"与产品、项目经理、设计师及工程师协作,以敏捷(双周)节奏将创意转化为精细的数字体验。",
"通过紧密协作、构建开发者体验工具与导师制,在工程团队内提供技术领导力。",
"推动公司级无障碍举措:编写最佳实践文档、建立开发者无障碍检查清单并组织知识分享。",
),
),
(
company: "美团",
role: "开发工程师",
start: "2017 春",
end: "2018 春",
bullets: (
"与学生设计师、工程师协作,为社区组织公益项目创建品牌、设计系统与网站。",
"根据利益相关方业务需求构建并交付技术方案。",
),
),
(
company: "网易",
role: "UI 工程师",
start: "2017.07",
end: "2017.12",
bullets: (
"使用 Ember 与 SCSS 开发并设计 Apple Music 交互式 Web 应用。",
"构建并发布 Apple Music Facebook Messenger 扩展,整合第三方与内部 API。",
"架构并实现 Apple Music 可嵌入 Web 播放器组件,支持浏览器内授权与完整歌曲播放。",
"深度参与 MusicKit JS 公共 JavaScript SDK 的开发,用于在 Web 应用中嵌入 Apple Music 播放器。",
),
),
(
company: "拼多多",
role: "软件工程师",
start: "2016.07",
end: "2016.12",
bullets: (
"使用 Cordova、ES6、Handlebars、Backbone、Marionette 与 CSS 开发并改进 Starry 面向客户的 Android Web 应用核心功能。",
"针对云服务与用户端应用的问题提出并实现可扩展方案,负责与 Starry Station 路由器通信。",
"与设计师及其他开发者协作,确保 Starry iOS 与 Android 移动应用体验一致、细致。",
),
),
(
company: "米哈游",
role: "创意技术师",
start: "2015.07",
end: "2015.12",
bullets: (
"主要使用 HTML、CSS、Sass、JavaScript 与 jQuery 为客户网站开发、维护并交付生产代码。",
"对多个站点进行 QA 测试,确保跨浏览器兼容与移动端响应式表现。",
"客户包括 JetBlue、Lovesac、U.S. Cellular、美国国防部等。",
),
),
)
#let projects = (
(
name: "Build a Spotify Connected App",
intro: "视频课程:使用 Spotify API 构建 Web 应用,涵盖 REST API、用户认证、Node、Express、React、Styled Components 等。",
),
(
name: "Halcyon VS Code 主题",
intro: "Visual Studio Code 深蓝主题,安装量 10 万+。",
),
(
name: "brittanychiang.com (v4)",
intro: "基于 Gatsby 的个人网站旧版GitHub 7k+ star、3k+ fork。",
),
)
#let interests = "Web 无障碍、攀岩、滑雪、科幻与奇幻小说、《塞尔达传说:旷野之息》与《王国之泪》"

View File

@ -0,0 +1,145 @@
#import "theme.typ": *
#import "config.typ": *
// =====================================================================
// GreLin 求职简历 · LayoutTailwind 灰稿)
// 双栏共用 grid右栏联系方式与下方模块左对齐
// =====================================================================
#let sidebar-photo() = {
let path = profile.at("photo-path", default: "")
if path != "" {
block(width: 100%, below: space-photo-below)[
#box(width: 100%, clip: true, radius: rounded)[
#image(path, width: 100%, fit: "cover")
]
]
}
}
#let profile-block() = block(width: 100%)[
#text(font: heading-font, size: size-name, weight: weight-semibold, fill: color-accent)[#profile.name]
#v(space-name-summary)
#box(width: summary-max-width)[
#set text(fill: color-text-light, size: size-prose, weight: weight-normal)
#set par(leading: leading-prose, spacing: space-none, justify: false)
#profile.summary
]
]
#let sidebar-body(content) = {
set text(fill: color-text-light, size: size-prose, weight: weight-normal)
set par(leading: leading-prose, spacing: space-none, justify: false)
content
}
#let sidebar-body-en(content) = sidebar-body(content)
#let sidebar-body-zh(content) = sidebar-body(content)
#let contact-block() = block(width: 100%)[
#let github = contact.at("github", default: "")
#let github-label = contact.at("github-label", default: github)
#set text(font: mono-font, size: size-prose, fill: color-meta, weight: weight-normal)
#set par(leading: leading-prose, spacing: space-contact-line)
#link("mailto:" + contact.email, contact.email)
#linebreak()
#link("tel:" + contact.phone, contact.phone)
#if github != "" [
#linebreak()
#link(github, github-label)
]
#if contact.website != "" [
#linebreak()
#link(contact.website, contact.website-label)
]
]
#let section-title(title, above: auto, below: auto, accent: true) = {
let gap-above = if above != auto { above } else { space-section }
let gap-below = if below != auto { below } else { space-title-below }
let title-color = if accent { color-accent } else { color-heading }
block(width: 100%, above: gap-above, below: gap-below)[
#text(font: heading-font, size: size-section, weight: weight-semibold, fill: title-color)[#title]
]
}
#let sidebar-subtitle(title, above: auto, below: auto) = {
let gap-above = if above != auto { above } else { space-skill-group }
let gap-below = if below != auto { below } else { space-subtitle-below }
block(above: gap-above, below: gap-below)[
#text(font: heading-font, size: size-body, weight: weight-semibold, fill: color-heading)[#title]
]
}
#let sidebar-entry-title(title) = block(below: space-subtitle-below)[
#text(font: heading-font, size: size-body, weight: weight-semibold, fill: color-heading)[#title]
]
#let experience-entry(entry) = block[
#text(font: heading-font, size: size-body, fill: color-heading)[
#entry.role
#text(fill: color-text-light, weight: weight-normal)[ · ]
#text(weight: weight-semibold)[#entry.company]
#h(space-entry-date-gap)
#text(font: mono-font, fill: color-meta, size: size-body, weight: weight-normal)[
#entry.start#if entry.end != "" [ — #entry.end]
]
]
#v(space-entry-title-below)
#set text(fill: color-text-light, size: size-prose, weight: weight-normal)
#set par(leading: leading-prose, spacing: space-none, justify: false)
#set list(tight: true, indent: list-indent, body-indent: list-body-indent)
#for line in entry.bullets [
- #line
]
]
#let experiences-block() = {
for (i, entry) in experiences.enumerate() {
if i > 0 { v(space-entry) }
experience-entry(entry)
}
}
#let skills-block() = {
for (i, cat) in skills.categories.enumerate() {
sidebar-subtitle(cat.title, above: if i == 0 { space-none } else { space-subtitle-group })
block(below: space-none)[
#sidebar-body-en[#cat.items]
]
}
}
#let sidebar-project-entry(entry) = block[
#sidebar-entry-title(entry.name)
#sidebar-body-zh[#entry.intro]
]
#let sidebar-projects-block() = {
for (i, entry) in projects.enumerate() {
if i > 0 { v(space-sidebar-item) }
sidebar-project-entry(entry)
}
}
#let sidebar-edu-entry(item) = block[
#sidebar-entry-title(item.school)
#sidebar-body-zh[
#item.degree#if item.period != "" [ · #item.period]
]
]
#let sidebar-education-block() = {
for (i, item) in education.enumerate() {
if i > 0 { v(space-sidebar-item) }
sidebar-edu-entry(item)
}
}
#let interests-block() = {
if interests != "" {
block(above: space-none)[
#sidebar-body-zh[#interests]
]
}
}

View File

@ -0,0 +1,122 @@
// =====================================================================
// GreLin 求职简历 · Design TokensTailwind 灰稿)
// 规范Tailwind CSS 默认 themefont-size · spacing · gray palette
// 印刷px × 0.75 → ptTailwind 默认 16px = 1rem
// 定稿主题色:只改 color-primary 一处即可
// =====================================================================
// --- 主题色 ---
#let color-primary = rgb("#2850d0")
#let color-accent = color-primary
// --- Tailwind gray 色板 ---
#let gray-50 = rgb("#f9fafb")
#let gray-100 = rgb("#f3f4f6")
#let gray-200 = rgb("#e5e7eb")
#let gray-300 = rgb("#d1d5db")
#let gray-400 = rgb("#9ca3af")
#let gray-500 = rgb("#6b7280")
#let gray-600 = rgb("#4b5563")
#let gray-700 = rgb("#374151")
#let gray-800 = rgb("#1f2937")
#let gray-900 = rgb("#111827")
#let color-page = white
#let color-heading = gray-900
#let color-text = gray-600
#let color-text-light = gray-500
#let color-meta = gray-400
// --- 字体Tailwind font-sans / font-mono + 中文)---
#let font-sans = ("Segoe UI", "Microsoft YaHei UI", "Microsoft YaHei")
#let font-mono = ("Consolas", "Cascadia Mono")
#let body-font = font-sans
#let heading-font = font-sans
#let mono-font = font-mono
// --- 字号Tailwind text-* · 印刷 pt---
#let size-xs = 9pt // text-xs 12px
#let size-sm = 10.5pt // text-sm 14px
#let size-base = 12pt // text-base 16px
#let size-lg = 13.5pt // text-lg 18px
#let size-xl = 15pt // text-xl 20px
#let size-2xl = 18pt // text-2xl 24px
#let size-3xl = 22.5pt // text-3xl 30px
#let size-name = size-3xl
#let size-section = size-base
#let size-body = size-sm
#let size-secondary = size-sm
#let size-contact = size-sm
// 正文:简介 · 联系方式 · 左右栏 bullet / 侧栏列表(统一 text-sm 10.5pt
#let size-prose = size-sm
// size-entry-title 与 size-body 对齐(岗位 · 公司 · 日期 ≡ 侧栏子标题)
#let size-entry-title = size-body
// --- 行距Tailwind line-height---
#let leading-tight-ratio = 1.25 // leading-tight
#let leading-snug-ratio = 1.375
#let leading-normal-ratio = 1.5
#let leading-xs = size-xs * leading-normal-ratio
#let leading-sm = size-sm * leading-normal-ratio
#let leading-base = size-base * leading-normal-ratio
#let leading-body = leading-sm
// 正文行距
#let leading-prose = size-prose * leading-tight-ratio
#let leading-summary = leading-prose
#let leading-contact = leading-prose
// 蓝标题size-section单行高度
#let leading-section = size-section * leading-normal-ratio
// 职位行size-body单行高度
#let leading-entry-title = size-body * leading-tight-ratio
// --- 字重Tailwind font-normal / medium / semibold---
#let weight-normal = "regular"
#let weight-medium = "medium"
#let weight-semibold = "semibold"
// --- 间距(按各层级单行/双行高度定义)---
#let space-none = 0pt
#let space-contact-line = space-none
#let space-inline = 6pt
#let space-entry-date-gap = space-inline
#let space-title-below = leading-section // 蓝标题 → 内容1 行蓝标题高
#let space-subtitle-below = leading-prose // 小标题 → 正文1 行正文行距
#let space-entry-title-below = leading-entry-title // 职位行 → bullet1 行职位行高
#let space-name-summary = leading-prose // 姓名 → 简介1 行简介行高
#let space-section = leading-section * 2 // 大模块之间2 行蓝标题高
#let space-entry = leading-section // 经历条目之间1 行蓝标题高
#let space-subtitle-group = leading-prose // 技能分组 / 侧栏条目1 行正文行高
#let space-skill-group = space-subtitle-group
#let space-sidebar-item = space-subtitle-group
// 页眉 → 正文(未指定,沿用 1.5 行蓝标题高)
#let space-header-bottom = leading-section * 1.5
// 双栏间距
#let space-column-gap = 15pt
// --- 列表 ---
#let list-indent = 0.85em
#let list-body-indent = 0.4em
#let list-item-leading = leading-prose
// --- 布局 ---
#let main-column = 2fr
#let sidebar-column = 1fr
// 简介最大宽度(主栏内略放宽,避免过早换行)
#let summary-max-width = 58%
// 侧栏证件照
#let space-photo-below = leading-section
#let page-margin = (
top: 1.5cm,
bottom: 1.5cm,
left: 1.5cm,
right: 1.5cm,
)
// --- 圆角Tailwind rounded DEFAULT = 4px---
#let rounded = 3pt

View File

@ -0,0 +1,12 @@
# 本地简历(不提交 Git
在此目录为每位同学生成子文件夹,例如 `local/zhangsan/`
```
local/zhangsan/
├── config.typ # 从 ../data/config.typ 复制后改内容
├── photo.jpeg # 证件照config 里写 photo-path: "../photo.jpeg"
└── compile.ps1 # 可选:编译脚本
```
`compile.ps1` 可参考 [`resume-bp/local/wenzf/compile.ps1`](../../resume-bp/local/wenzf/compile.ps1),将 `$resumeRoot` 指向 `resume-career` 即可。

4833
resume-career/sample.pdf Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,3 +1,3 @@
# GreLin Typst monorepo — 项目根目录,供 resume / feasibility 共享 brand/colors.typ
# GreLin Typst monorepo — 项目根目录,供 resume-bp / resume-career / feasibility 共享 brand/colors.typ
[project]