Compare commits
No commits in common. "main" and "feat/resume-template" have entirely different histories.
main
...
feat/resum
17
.gitignore
vendored
@ -1,24 +1,17 @@
|
||||
# Typst 编译产物(示例 PDF 除外)
|
||||
*.pdf
|
||||
!resume-bp/sample.pdf
|
||||
!resume-career/sample.pdf
|
||||
!tech-report/sample.pdf
|
||||
!presentation/sample.pdf
|
||||
!travel-plan/sample.pdf
|
||||
!resume/sample.pdf
|
||||
!feasibility/sample.pdf
|
||||
|
||||
# 本地定制(个人内容、照片、PDF,不提交)
|
||||
resume-bp/local/*
|
||||
!resume-bp/local/README.md
|
||||
resume-career/local/*
|
||||
travel-plan/local/*
|
||||
# 本地定制简历(个人内容、照片、PDF,不提交)
|
||||
resume/local/
|
||||
|
||||
# IDE / 编辑器本地配置
|
||||
.cursor/
|
||||
.vscode/
|
||||
|
||||
# 本地照片(可选提交)
|
||||
# resume-bp/assets/profile.jpeg
|
||||
# resume-career/assets/profile.jpeg
|
||||
# resume/assets/profile.jpeg
|
||||
|
||||
# 系统文件
|
||||
.DS_Store
|
||||
|
||||
13
README.md
@ -4,11 +4,8 @@ GreLin 内部 Typst 模板库,按文档类型分目录维护。目录结构如
|
||||
|
||||
| 文件夹 | 说明 | 入口文件 |
|
||||
|--------|------|----------|
|
||||
| [`resume-bp/`](resume-bp/) | 融资 BP 团队简历(完整版,含证件照) | `cv.typ` |
|
||||
| [`resume-career/`](resume-career/) | 求职 / 个人主页简历(精简一页) | `cv.typ`(内容 `data/config.typ`) |
|
||||
| [`tech-report/`](tech-report/) | 技术报告 | `report.typ`(正文编辑 `tech-report/content/report.md`) |
|
||||
| [`presentation/`](presentation/) | PPT 演示文稿(16:9,待完善) | `deck.typ`(内容 `data/config.typ`) |
|
||||
| [`travel-plan/`](travel-plan/) | 旅行计划(参考图、链接、行程) | `trips/<名>/` · 可选 `plan.typ` |
|
||||
| [`resume/`](resume/) | 团队简历 | `cv.typ` |
|
||||
| [`feasibility/`](feasibility/) | 可行性研究报告 | `report.typ`(正文编辑 `feasibility/content/report.md`) |
|
||||
|
||||
## 环境要求
|
||||
|
||||
@ -17,9 +14,9 @@ GreLin 内部 Typst 模板库,按文档类型分目录维护。目录结构如
|
||||
|
||||
## 快速开始
|
||||
|
||||
1. 用 VS Code / Cursor 打开本仓库,打开要编辑的入口文件,例如 `resume-bp/cv.typ`、`resume-career/cv.typ`、`presentation/deck.typ` 或 `tech-report/report.typ`
|
||||
2. 技术报告正文在 `tech-report/content/report.md` 用 Markdown 编写,无需改 Typst 代码
|
||||
1. 用 VS Code / Cursor 打开本仓库,打开要编辑的入口文件,例如 `resume/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 默认生成在同目录
|
||||
4. 导出 PDF:`Ctrl+Shift+P` → 输入 `Typst Export PDF` → 回车;PDF 默认生成在同目录(如 `resume/sample.pdf`)
|
||||
|
||||
> 不熟悉 Typst?可参考社区维护的 [小蓝书(Typst 中文教程)](https://tutorial.typst.dev/);英文版见 [官方入门教程](https://typst.app/docs/tutorial/)。
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
// GreLin 品牌色板 — 全文档统一(resume-bp / resume-career / tech-report / presentation 等均 import 此文件)
|
||||
// GreLin 品牌色板 — 全文档统一(resume / feasibility 等均 import 此文件)
|
||||
// 来源 HyperLabel foundationPalette + labelPalette
|
||||
|
||||
#let color-ink = rgb("#08090B")
|
||||
#let color-body = rgb("#2D3135")
|
||||
@ -6,15 +7,8 @@
|
||||
#let color-bar-bg = rgb("#EFF0F2")
|
||||
#let color-page = rgb("#FDFDFD")
|
||||
|
||||
// 品牌主色(文档统一蓝色)
|
||||
#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
|
||||
// 品牌主色(全项目绿色统一)
|
||||
#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%)
|
||||
|
||||
74
feasibility/README.md
Normal file
@ -0,0 +1,74 @@
|
||||
# Feasibility Report · 可行性研究报告模板
|
||||
|
||||
GreLin 可行性报告 Typst 模板,面向矿石分选项目论证与客户交付。同事用 **Markdown** 写正文,模板负责封面、页眉页脚与图表排版。
|
||||
|
||||
## 快速开始
|
||||
|
||||
1. 编辑 [`content/report.md`](content/report.md)(或从 [`content/report.template.md`](content/report.template.md) 复制)
|
||||
2. 用 VS Code / Cursor 打开 [`report.typ`](report.typ)
|
||||
3. `Ctrl+Shift+P` → **Typst Preview** 预览,或 **Typst Export PDF** 导出
|
||||
|
||||
仓库根目录编译(共享 `brand/colors.typ`):
|
||||
|
||||
```bash
|
||||
typst compile feasibility/report.typ feasibility/sample.pdf --root .
|
||||
```
|
||||
|
||||
示例输出:[`sample.pdf`](sample.pdf)
|
||||
|
||||
## 工作流
|
||||
|
||||
| 文件 | 说明 |
|
||||
|------|------|
|
||||
| [`content/report.md`](content/report.md) | **主编辑入口**:YAML 元数据 + 正文 |
|
||||
| [`content/assets/`](content/assets/) | 图片资源(支持 `.jpg` / `.png` / `.svg`) |
|
||||
| [`data/config.typ`](data/config.typ) | 默认公司名、副标题等(YAML 未写时使用) |
|
||||
| [`data/theme.typ`](data/theme.typ) | 设计 token(字号、间距、表格) |
|
||||
| [`data/styling.typ`](data/styling.typ) | 标题 / 表格 / 图片 `#show` 规范 |
|
||||
| [`data/layout.typ`](data/layout.typ) | 封面、摘要、页眉组件 |
|
||||
| [`report.typ`](report.typ) | 编译入口(一般无需改动) |
|
||||
|
||||
## YAML 元数据
|
||||
|
||||
在 `report.md` 顶部填写:
|
||||
|
||||
```yaml
|
||||
---
|
||||
title: 某某矿山智能分选可行性研究
|
||||
brand: GreLin
|
||||
company: 西安高岭绿能科技有限公司
|
||||
date: 2026-06-22
|
||||
version: v1.0
|
||||
summary: |
|
||||
摘要正文……
|
||||
---
|
||||
```
|
||||
|
||||
## Markdown 写法
|
||||
|
||||
- 章节:`# 项目概述`(自动编号为 1. / 1.1 / 1.1.1,无需手写「一、二、三」)
|
||||
- 表格:标准 GFM 表格语法
|
||||
- 图片:`` 或 `assets/chart.png`,文件放在 `content/assets/`
|
||||
- 行内代码:`` `ONNX Runtime` ``(灰底、小圆角、品牌色文字)
|
||||
- 代码块:` ```python ` 围栏 + 语言名,由 [codly](https://typst.app/universe/package/codly) 自动语法高亮并显示语言标签
|
||||
- 下划线:`<u>文字</u>`(品牌色,线下移 5pt)
|
||||
- Emoji:正文可直接写 🐱 等符号(需系统字体支持)
|
||||
- 列表、加粗等均支持(基于 [cmarker](https://typst.app/universe/package/cmarker))
|
||||
|
||||
## 依赖包
|
||||
|
||||
| 包 | 用途 |
|
||||
|----|------|
|
||||
| [cmarker](https://typst.app/universe/package/cmarker) | Markdown → Typst 正文 |
|
||||
| [codly](https://typst.app/universe/package/codly) + [codly-languages](https://typst.app/universe/package/codly-languages) | 代码块高亮与语言标签 |
|
||||
|
||||
可选扩展:[toutu](https://typst.app/universe/package/toutu)(目录)、[hydra](https://typst.app/universe/package/hydra)(页眉章节名)、[cetz](https://typst.app/universe/package/cetz)(矢量图表)。
|
||||
|
||||
## 环境要求
|
||||
|
||||
- **Typst ≥ 0.14.0**;请使用较新版本的 Tinymist 或 Typst CLI
|
||||
- 首次编译会自动下载 `cmarker`、`codly`、`codly-languages`(需网络)
|
||||
|
||||
## 替换外部 MD
|
||||
|
||||
将同事发来的 `.md` 覆盖 `content/report.md`,图片放入 `content/assets/` 并修正文内路径,重新预览即可。
|
||||
|
Before Width: | Height: | Size: 251 KiB After Width: | Height: | Size: 251 KiB |
89
feasibility/content/report.md
Normal file
@ -0,0 +1,89 @@
|
||||
---
|
||||
title: 铝土矿可行性研究报告
|
||||
company: 西安高岭绿能科技有限公司
|
||||
date: 2026-06-22
|
||||
version: v1.0
|
||||
summary: |
|
||||
本项目拟在目标矿山建设智能矿石分选产线,以高光谱感知、深度学习推理与喷阀执行闭环为核心,实现铝土矿预选抛废与品位提升。经现场调研与算法验证,单线设计处理量 25 t/h,精矿 A/S 可达 4.0+,具备工程化落地条件。
|
||||
---
|
||||
|
||||
# 项目概述
|
||||
|
||||
本项目面向铝土矿预选场景,建设「感知—推理—执行—运维」一体化的智能分选系统,将算法能力转化为可部署、可运维的工业产品,降低后续磨选成本并提升资源利用率。
|
||||
|
||||
> 引用块示例:政策与市场需求推动预选抛废技术应用,本段为 blockquote 样式预览。
|
||||
|
||||
**常用 Markdown 语法预览:**
|
||||
|
||||
- **加粗**:单线处理量 `25 t/h`
|
||||
- *斜体*:用于强调术语
|
||||
- ~~删除线~~:已废弃方案
|
||||
- <u>下划线</u>:关键指标标注
|
||||
- Emoji:产线状态 🐱 正常 / ⚠️ 告警
|
||||
- 行内代码:`ONNX Runtime`、`Ratatui`
|
||||
|
||||
```python
|
||||
# 推理回调示例
|
||||
for sample in belt_stream:
|
||||
grade = model.infer(sample)
|
||||
valve.fire(grade)
|
||||
```
|
||||
|
||||
## 项目概述2
|
||||
|
||||
建设内容包括:产线感知与推理控制软件、运营后台、运维工具及现场联调交付。
|
||||
|
||||
# 建设必要性与市场分析
|
||||
|
||||
铝土矿原料品位波动大,传统全量入磨能耗高、尾矿处置压力大。政策层面,绿色矿山与节能降碳要求推动预选抛废技术应用。目标客户在降本增效与环保合规方面需求明确,智能分选在预选环节具备可复制推广价值。
|
||||
|
||||
# 技术方案
|
||||
|
||||
系统采用 <!--raw-typst #gls-long("hsi") --> 与 <!--raw-typst #gls-short("onnx") --> 推理引擎,构建边缘推理与喷阀执行闭环架构。
|
||||
|
||||
<!--raw-typst #ore-sorting-flow()-->
|
||||
|
||||

|
||||
|
||||
核心技术路线:
|
||||
|
||||
- 高光谱采集与样本标准化处理
|
||||
- ONNX 推理服务与产线实时回调
|
||||
- Rust 运维控制台与产线状态监控
|
||||
|
||||
## 验证指标(实验室 / 现场)
|
||||
|
||||
| 指标 | 设计值 | 验证情况 |
|
||||
| ---- | ------ | -------- |
|
||||
| 单线处理量 | 25 t/h | 已验证 |
|
||||
| 精矿 <!--raw-typst #gls-short("as-ratio") --> | ≥ 4.0 | 4.0+ |
|
||||
| 尾矿 A/S | ≤ 1.7 | 1.7- |
|
||||
| 回收率 | ≥ 30% | 30%+ |
|
||||
|
||||
# 实施计划
|
||||
|
||||
1. **研发验证**(1–2 月):算法迭代、软件模块开发与台架测试。
|
||||
2. **试点部署**(2–3 月):单线现场安装、联调与试运行。
|
||||
3. **规模化推广**(持续):复制部署、运维体系与客户培训。
|
||||
|
||||
# 投资估算与资金用途
|
||||
|
||||
投资主要用于光谱传感与执行机构硬件、软件开发与现场实施、人员与运维体系建设。具体金额结合矿山规模与产线配置在商务阶段细化。
|
||||
|
||||
# 效益分析
|
||||
|
||||
- **经济效益**:减少入磨量,降低能耗与药剂成本;提升精矿品位与回收率。
|
||||
- **环保效益**:减少尾矿产生量,降低固废处置压力。
|
||||
- **社会效益**:支撑绿色矿山建设,提升企业技术形象。
|
||||
|
||||
# 风险分析与对策
|
||||
|
||||
| 风险 | 对策 |
|
||||
| ---- | ---- |
|
||||
| 原料波动影响模型稳定性 | 持续采样标注与模型迭代;异常降级策略 |
|
||||
| 现场交付周期 | 标准化模块与运维工具;阶段里程碑管控 |
|
||||
| 客户接受度 | 试点数据透明展示;可量化的效益测算 |
|
||||
|
||||
# 结论
|
||||
|
||||
综合技术验证、市场需求与实施条件,本项目具备可行性。建议推进试点产线建设,以现场数据支撑后续规模化复制。
|
||||
38
feasibility/data/code.typ
Normal file
@ -0,0 +1,38 @@
|
||||
#import "@preview/codly:1.3.0": *
|
||||
#import "@preview/codly-languages:0.1.10": codly-languages
|
||||
#import "theme.typ": *
|
||||
|
||||
#let codly-init-rule = codly-init.with()
|
||||
|
||||
#let codly-config = codly(
|
||||
languages: codly-languages,
|
||||
fill: code-block-fill,
|
||||
radius: code-block-radius,
|
||||
stroke: none,
|
||||
zebra-fill: none,
|
||||
number-format: none,
|
||||
display-icon: false,
|
||||
display-name: true,
|
||||
default-color: color-body,
|
||||
lang-stroke: (_) => none,
|
||||
lang-fill: (_) => code-block-fill,
|
||||
lang-radius: 0pt,
|
||||
)
|
||||
|
||||
/// 与 codly 配合的语法高亮色(须在 codly-init 之后注册)
|
||||
#let code-token-highlight-init(doc) = {
|
||||
show raw.where(block: true): it => {
|
||||
show "keyword": set text(fill: code-token-keyword)
|
||||
show "comment": set text(fill: code-token-comment)
|
||||
show "string": set text(fill: code-token-string)
|
||||
show "number": set text(fill: code-token-number)
|
||||
show "builtin": set text(fill: code-token-function)
|
||||
show "function": set text(fill: code-token-function)
|
||||
show "decor": set text(fill: code-token-function)
|
||||
show "operator": set text(fill: code-token-operator)
|
||||
show "punctuation": set text(fill: code-token-operator)
|
||||
set text(fill: color-body)
|
||||
it
|
||||
}
|
||||
doc
|
||||
}
|
||||
@ -1,10 +1,10 @@
|
||||
// =============================================================================
|
||||
// 技术报告 — 默认值(正文在 content/report.md,YAML 可覆盖下列字段)
|
||||
// 可行性报告 — 默认值(正文在 content/report.md,YAML 可覆盖下列字段)
|
||||
// =============================================================================
|
||||
|
||||
#let default-brand = "GreLin"
|
||||
#let default-company = "西安高岭绿能科技有限公司"
|
||||
#let default-title = "智能矿石分选系统技术报告"
|
||||
#let default-title = "智能矿石分选系统建设项目"
|
||||
#let default-version = "v1.0"
|
||||
#let default-date = "2026 年 6 月"
|
||||
|
||||
51
feasibility/data/decor.typ
Normal file
@ -0,0 +1,51 @@
|
||||
#import "theme.typ": *
|
||||
|
||||
/// 点阵底纹
|
||||
#let tech-dots(width: 100%, height: 100%, step: 10pt) = box(width: width, height: height, clip: true)[
|
||||
#for x in range(40) {
|
||||
for y in range(40) {
|
||||
place(
|
||||
left + top,
|
||||
dx: x * step,
|
||||
dy: y * step,
|
||||
circle(radius: 0.35pt, fill: color-grid),
|
||||
)
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
/// 条形码条
|
||||
#let tech-barcode(width, height, bars: 28) = box(width: width, height: height, clip: true)[
|
||||
#for i in range(bars) {
|
||||
let w = if calc.rem(i, 4) == 0 { 2.2pt } else if calc.rem(i, 2) == 0 { 1.4pt } else { 0.8pt }
|
||||
place(
|
||||
left + top,
|
||||
dx: i * (width / bars),
|
||||
box(width: w, height: 100%, fill: color-ink),
|
||||
)
|
||||
}
|
||||
]
|
||||
|
||||
/// 等宽标签
|
||||
#let tech-label(body, fill: color-ink, size: 7pt) = text(
|
||||
font: mono-font,
|
||||
size: size,
|
||||
fill: fill,
|
||||
tracking: 0.14em,
|
||||
)[#body]
|
||||
|
||||
/// 章节编号
|
||||
#let section-tech-id(..nums) = {
|
||||
let n = nums.pos()
|
||||
let id = if n.len() == 1 {
|
||||
let num = n.first()
|
||||
if num < 10 { "0" + str(num) } else { str(num) }
|
||||
} else if n.len() == 2 {
|
||||
str(n.at(0)) + "." + str(n.at(1))
|
||||
} else {
|
||||
str(n.at(0)) + "." + str(n.at(1)) + "." + str(n.at(2))
|
||||
}
|
||||
box(fill: color-neon, inset: (x: 5pt, y: 2pt))[
|
||||
#text(font: mono-font, size: 7pt, weight: "bold", fill: color-ink)[#id]
|
||||
]
|
||||
}
|
||||
@ -18,7 +18,7 @@
|
||||
stroke: 1pt + color-brand,
|
||||
)
|
||||
content((x + w / 2, 0.5), align(center + horizon)[
|
||||
#text(font: body-font, size: text-xs, fill: color-body)[#label]
|
||||
#text(font: body-font, size: 8pt, fill: color-body)[#label]
|
||||
])
|
||||
if i < labels.len() - 1 {
|
||||
line(
|
||||
43
feasibility/data/glossary.typ
Normal file
@ -0,0 +1,43 @@
|
||||
#import "@preview/glossarium:0.5.10": make-glossary, register-glossary, print-glossary, gls-long, gls-short
|
||||
#import "theme.typ": *
|
||||
|
||||
#let glossary-entries = (
|
||||
(
|
||||
key: "hsi",
|
||||
short: "HSI",
|
||||
long: "高光谱成像",
|
||||
description: "Hyperspectral Imaging,获取矿石连续波段光谱信息。",
|
||||
),
|
||||
(
|
||||
key: "onnx",
|
||||
short: "ONNX",
|
||||
long: "开放神经网络交换格式",
|
||||
description: "Open Neural Network Exchange,用于跨平台模型推理部署。",
|
||||
),
|
||||
(
|
||||
key: "as-ratio",
|
||||
short: "A/S",
|
||||
long: "铝硅比",
|
||||
description: "精矿品质评价的关键指标之一。",
|
||||
),
|
||||
)
|
||||
|
||||
#let init-glossary(doc) = {
|
||||
show: make-glossary
|
||||
doc
|
||||
}
|
||||
|
||||
#let register-report-glossary() = {
|
||||
register-glossary(glossary-entries)
|
||||
}
|
||||
|
||||
#let print-glossary-block() = {
|
||||
pagebreak(weak: true)
|
||||
block(width: 100%, above: space-chapter)[
|
||||
#box(width: 100%, fill: color-neon, inset: (x: 10pt, y: 6pt))[
|
||||
#text(font: heading-font, size: size-h1, weight: "black", fill: color-ink)[术语与缩写]
|
||||
]
|
||||
#v(space-block)
|
||||
#print-glossary(glossary-entries, show-all: true)
|
||||
]
|
||||
}
|
||||
148
feasibility/data/layout.typ
Normal file
@ -0,0 +1,148 @@
|
||||
#import "theme.typ": *
|
||||
#import "logo.typ": grelin-logo, cover-index-badge
|
||||
#import "decor.typ": tech-dots, tech-barcode, tech-label
|
||||
|
||||
#let format-cover-date(date) = {
|
||||
let parts = date.split("-")
|
||||
if parts.len() == 3 {
|
||||
parts.at(0) + "." + parts.at(1) + "." + parts.at(2)
|
||||
} else {
|
||||
date
|
||||
}
|
||||
}
|
||||
|
||||
#let cover-meta-strip(meta) = box(
|
||||
width: 100%,
|
||||
fill: color-ink,
|
||||
inset: (x: 12pt, y: 8pt),
|
||||
)[
|
||||
#grid(
|
||||
columns: (1fr, auto, 1fr, auto, 1fr),
|
||||
column-gutter: 12pt,
|
||||
align: horizon,
|
||||
tech-label("VERSION", fill: color-neon, size: 6.5pt),
|
||||
text(font: mono-font, size: 8pt, fill: white)[#meta.version],
|
||||
tech-label("DATE", fill: color-neon, 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)
|
||||
],
|
||||
)
|
||||
]
|
||||
|
||||
#let cover-block(meta) = {
|
||||
pagebreak(weak: true)
|
||||
block(width: 100%, below: space-chapter)[
|
||||
#box(width: 100%, height: cover-block-height, fill: white)[
|
||||
#place(top + left)[#grelin-logo()]
|
||||
#place(top + right)[#cover-index-badge("01")]
|
||||
|
||||
#place(left + top, dy: 52pt)[#tech-barcode(14pt, 120pt, bars: 5)]
|
||||
#place(right + top, dy: 72pt)[
|
||||
#rotate(-90deg, reflow: true)[
|
||||
#tech-label("FEASIBILITY REPORT", fill: color-caption, size: 6.5pt)
|
||||
]
|
||||
]
|
||||
|
||||
#place(left + top, dx: 28pt, dy: 100pt)[
|
||||
#box(width: 88%, height: 130pt, clip: true)[#tech-dots(width: 100%, height: 100%, step: 11pt)]
|
||||
]
|
||||
|
||||
#place(left + top, dx: 24pt, dy: 168pt)[
|
||||
#box(width: 92%, fill: color-neon, inset: (x: 16pt, y: 18pt))[
|
||||
#text(
|
||||
font: heading-font,
|
||||
size: size-cover-title,
|
||||
weight: "black",
|
||||
fill: color-ink,
|
||||
hyphenate: false,
|
||||
)[#meta.title]
|
||||
]
|
||||
]
|
||||
|
||||
#place(left + bottom, dy: -36pt)[
|
||||
#box(width: 100%)[#cover-meta-strip(meta)]
|
||||
]
|
||||
|
||||
#place(left + bottom, dy: -8pt)[
|
||||
#tech-barcode(100%, 10pt, bars: 48)
|
||||
]
|
||||
]
|
||||
]
|
||||
pagebreak()
|
||||
}
|
||||
|
||||
#let accent-line() = box(width: 100%, height: 2pt, fill: color-ink)
|
||||
|
||||
#let summary-block(meta) = {
|
||||
if meta.summary != "" {
|
||||
block(width: 100%, above: space-block, below: space-chapter)[
|
||||
#box(
|
||||
width: 100%,
|
||||
fill: white,
|
||||
stroke: 1.5pt + color-ink,
|
||||
inset: summary-inset,
|
||||
)[
|
||||
#box(width: 100%, fill: color-neon, inset: (x: 10pt, y: 5pt))[
|
||||
#tech-label("ABSTRACT", fill: color-ink, size: 7pt)
|
||||
]
|
||||
#v(10pt)
|
||||
#text(font: heading-font, size: size-h2, weight: "black", fill: color-ink)[摘要]
|
||||
#v(space-block)
|
||||
#set par(leading: leading-summary, justify: true)
|
||||
#set text(size: size-body, fill: color-body)
|
||||
#meta.summary
|
||||
#v(space-section)
|
||||
#grid(
|
||||
columns: (auto, 1fr, auto, 1fr),
|
||||
column-gutter: 8pt,
|
||||
align: horizon,
|
||||
tech-label("DATE", size: 6.5pt),
|
||||
text(font: mono-font, size: size-meta, fill: color-body)[#meta.date],
|
||||
tech-label("ORG", size: 6.5pt),
|
||||
text(font: mono-font, size: size-meta, fill: color-body)[#meta.company],
|
||||
)
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
#let page-footer() = context {
|
||||
grid(
|
||||
columns: (auto, 1fr, auto),
|
||||
align: horizon,
|
||||
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)[
|
||||
#counter(page).display("1")
|
||||
#h(0.12em)
|
||||
#sym.slash
|
||||
#h(0.12em)
|
||||
#counter(page).final().first()
|
||||
]
|
||||
],
|
||||
)
|
||||
}
|
||||
|
||||
#let page-accent-bar() = place(
|
||||
left + top,
|
||||
tech-barcode(page-accent-bar-width, 100%, bars: 4),
|
||||
)
|
||||
|
||||
#let page-header(meta) = [
|
||||
#grid(
|
||||
columns: (auto, 1fr, auto),
|
||||
column-gutter: 8pt,
|
||||
align: horizon,
|
||||
box(fill: color-neon, 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),
|
||||
align(right)[
|
||||
#text(font: mono-font, size: 7pt, fill: color-caption)[#meta.title]
|
||||
],
|
||||
)
|
||||
#v(6pt)
|
||||
#accent-line()
|
||||
]
|
||||
37
feasibility/data/logo.typ
Normal file
@ -0,0 +1,37 @@
|
||||
#import "theme.typ": *
|
||||
#import "decor.typ": tech-label
|
||||
|
||||
/// Logo:霓虹绿块 + 白色折线图形 + GreLin | Tech
|
||||
#let grelin-logo(
|
||||
primary: "GreLin",
|
||||
secondary: "Tech",
|
||||
) = grid(
|
||||
columns: (auto, auto),
|
||||
column-gutter: 10pt,
|
||||
align: horizon,
|
||||
box(width: 34pt, height: 34pt, fill: color-neon)[
|
||||
#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))
|
||||
#place(left + top, dx: 18pt, dy: 17pt, box(width: 3pt, height: 11pt, fill: white))
|
||||
],
|
||||
grid(
|
||||
columns: (auto, auto, auto),
|
||||
column-gutter: 7pt,
|
||||
align: horizon,
|
||||
text(font: heading-font, size: 12pt, weight: "black", fill: color-ink, tracking: 0.04em)[#primary],
|
||||
box(width: 1.2pt, height: 1em, fill: color-ink),
|
||||
text(font: heading-font, size: 12pt, weight: "black", fill: color-ink, tracking: 0.16em)[#secondary],
|
||||
),
|
||||
)
|
||||
|
||||
#let cover-index-badge(index) = box(
|
||||
width: 58pt,
|
||||
height: 58pt,
|
||||
stroke: 2pt + color-ink,
|
||||
fill: white,
|
||||
)[
|
||||
#align(center + horizon)[
|
||||
#text(font: mono-font, size: size-cover-index, weight: "black", fill: color-ink)[#index]
|
||||
]
|
||||
]
|
||||
@ -1,40 +1,7 @@
|
||||
#import "@preview/cmarker:0.1.8": render-with-metadata
|
||||
#import "config.typ": *
|
||||
#import "theme.typ": *
|
||||
|
||||
#let underline-accent(body) = underline(
|
||||
body,
|
||||
stroke: 1.5pt + color-primary,
|
||||
offset: 4pt,
|
||||
evade: true,
|
||||
)
|
||||
|
||||
#let text-highlight(body) = highlight(
|
||||
body,
|
||||
fill: color-accent-surface,
|
||||
top-edge: "ascender",
|
||||
bottom-edge: "descender",
|
||||
radius: tw(0.5),
|
||||
)
|
||||
|
||||
#let parse-report-date(raw) = {
|
||||
if type(raw) == datetime {
|
||||
raw
|
||||
} else if type(raw) == str {
|
||||
let parts = raw.split("-")
|
||||
if parts.len() == 3 {
|
||||
datetime(
|
||||
year: int(parts.at(0)),
|
||||
month: int(parts.at(1)),
|
||||
day: int(parts.at(2)),
|
||||
)
|
||||
} else {
|
||||
none
|
||||
}
|
||||
} else {
|
||||
none
|
||||
}
|
||||
}
|
||||
#import "styling.typ": underline-accent
|
||||
|
||||
#let source-dir(path) = {
|
||||
let parts = path.split("/")
|
||||
@ -90,7 +57,6 @@
|
||||
smart-punctuation: true,
|
||||
html: (
|
||||
u: (_, body) => underline-accent(body),
|
||||
mark: (_, body) => text-highlight(body),
|
||||
),
|
||||
scope: (
|
||||
image: (source, alt: none) => resolve-image(source-path, source, alt: alt),
|
||||
160
feasibility/data/styling.typ
Normal file
@ -0,0 +1,160 @@
|
||||
#import "theme.typ": *
|
||||
#import "decor.typ": section-tech-id, tech-label
|
||||
|
||||
#let underline-accent(body) = underline(
|
||||
body,
|
||||
stroke: underline-stroke,
|
||||
offset: underline-offset,
|
||||
evade: true,
|
||||
)
|
||||
|
||||
#let heading-number(it) = {
|
||||
if it.numbering != none {
|
||||
counter(heading).display(it.numbering)
|
||||
h(heading-number-gap)
|
||||
}
|
||||
}
|
||||
|
||||
#let report-heading-numbering(..nums) = {
|
||||
let n = nums.pos()
|
||||
if n.len() == 1 {
|
||||
numbering("1.", n.first())
|
||||
} else if n.len() == 2 {
|
||||
numbering("1.1", n.at(0), n.at(1))
|
||||
} else {
|
||||
numbering("1.1.1", ..n)
|
||||
}
|
||||
}
|
||||
|
||||
#let grelin-h1(it) = block(
|
||||
width: 100%,
|
||||
above: space-chapter,
|
||||
below: space-block,
|
||||
)[
|
||||
#grid(
|
||||
columns: (auto, 1fr),
|
||||
column-gutter: 8pt,
|
||||
align: horizon,
|
||||
context section-tech-id(..counter(heading).get()),
|
||||
box(width: 100%, fill: color-neon, inset: (x: 8pt, y: 4pt))[
|
||||
#text(font: heading-font, size: size-h1, weight: "black", fill: color-ink)[
|
||||
#heading-number(it)
|
||||
#it.body
|
||||
]
|
||||
],
|
||||
)
|
||||
]
|
||||
|
||||
#let grelin-h2(it) = block(width: 100%, above: space-section, below: space-inline)[
|
||||
#grid(
|
||||
columns: (auto, 1fr),
|
||||
column-gutter: 8pt,
|
||||
align: horizon,
|
||||
box(width: 3pt, height: 1em, fill: color-ink),
|
||||
text(font: heading-font, size: size-h2, weight: "bold", fill: color-ink)[
|
||||
#heading-number(it)
|
||||
#it.body
|
||||
],
|
||||
)
|
||||
]
|
||||
|
||||
#let grelin-h3(it) = block(width: 100%, above: space-block, below: space-micro)[
|
||||
#grid(
|
||||
columns: (auto, 1fr),
|
||||
column-gutter: 6pt,
|
||||
align: horizon,
|
||||
tech-label("///", size: 6.5pt),
|
||||
text(font: heading-font, size: size-h3, weight: "bold", fill: color-ink)[
|
||||
#heading-number(it)
|
||||
#it.body
|
||||
],
|
||||
)
|
||||
]
|
||||
|
||||
#let grelin-image(it) = block(
|
||||
width: 100%,
|
||||
above: space-figure-before,
|
||||
below: space-figure-after,
|
||||
)[
|
||||
#align(center)[
|
||||
#box(width: image-max-width, stroke: 1pt + color-ink)[
|
||||
#set image(width: 100%, fit: "contain")
|
||||
#it
|
||||
]
|
||||
]
|
||||
]
|
||||
|
||||
#let grelin-table(it) = block(
|
||||
width: 100%,
|
||||
above: space-figure-before,
|
||||
below: space-figure-after,
|
||||
)[
|
||||
#it
|
||||
]
|
||||
|
||||
#let grelin-figure(it) = block(
|
||||
width: 100%,
|
||||
above: space-figure-before,
|
||||
below: space-figure-after,
|
||||
)[
|
||||
#align(center)[
|
||||
#set image(width: image-max-width, fit: "contain")
|
||||
#set text(size: size-caption, fill: color-caption)
|
||||
#it
|
||||
]
|
||||
]
|
||||
|
||||
#let grelin-blockquote(it) = block(
|
||||
width: 100%,
|
||||
above: space-block,
|
||||
below: space-block,
|
||||
inset: (left: blockquote-inset),
|
||||
stroke: (left: blockquote-stroke),
|
||||
fill: white,
|
||||
)[
|
||||
#set par(leading: leading-body, justify: true)
|
||||
#set text(fill: color-quote)
|
||||
#it
|
||||
]
|
||||
|
||||
#let grelin-inline-code(it) = box(
|
||||
fill: code-inline-fill,
|
||||
inset: code-inline-inset,
|
||||
stroke: 0.8pt + color-ink,
|
||||
)[
|
||||
#set text(font: mono-font, size: size-body, fill: color-code-inline)
|
||||
#it
|
||||
]
|
||||
|
||||
#let apply-report-styling(body) = {
|
||||
set heading(numbering: report-heading-numbering)
|
||||
set text(size: size-table)
|
||||
set table(
|
||||
stroke: (x, y) => (
|
||||
top: if y == 0 { 1.5pt + color-ink } else { none },
|
||||
bottom: if y == 0 { 0.8pt + color-ink } else { none },
|
||||
),
|
||||
inset: table-inset,
|
||||
align: (col, row) => if col == 0 { left + horizon } else { center + horizon },
|
||||
fill: (col, row) => {
|
||||
if row == 0 {
|
||||
table-header-fill
|
||||
} else if calc.rem(row, 2) == 0 {
|
||||
table-zebra-fill
|
||||
} else {
|
||||
white
|
||||
}
|
||||
},
|
||||
)
|
||||
show heading.where(level: 1): grelin-h1
|
||||
show heading.where(level: 2): grelin-h2
|
||||
show heading.where(level: 3): grelin-h3
|
||||
show image: grelin-image
|
||||
show table.cell: set text(fill: table-data-text)
|
||||
show table.cell.where(y: 0): set text(weight: "bold", fill: color-ink)
|
||||
show table: grelin-table
|
||||
show figure: grelin-figure
|
||||
show quote.where(block: true): grelin-blockquote
|
||||
show raw.where(block: false): grelin-inline-code
|
||||
body
|
||||
}
|
||||
102
feasibility/data/theme.typ
Normal file
@ -0,0 +1,102 @@
|
||||
#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-line = color-ink
|
||||
#let color-divider = rgb(205, 205, 205)
|
||||
#let color-caption = rgb(110, 110, 110)
|
||||
#let color-quote = rgb(90, 90, 90)
|
||||
#let color-code-lang = rgb(90, 90, 90)
|
||||
#let color-code-inline = color-ink
|
||||
#let color-header = color-ink
|
||||
#let color-page = rgb(238, 238, 238)
|
||||
#let color-bar-bg = rgb(248, 248, 248)
|
||||
#let color-grid = rgb(220, 220, 220)
|
||||
|
||||
// 代码块语法高亮
|
||||
#let code-token-keyword = color-ink
|
||||
#let code-token-comment = rgb(130, 130, 130)
|
||||
#let code-token-string = rgb(40, 40, 40)
|
||||
#let code-token-number = rgb(70, 70, 70)
|
||||
#let code-token-function = color-ink
|
||||
#let code-token-operator = rgb(100, 100, 100)
|
||||
|
||||
#let heading-font = ("Microsoft YaHei", "Segoe UI", "Segoe UI Emoji")
|
||||
#let body-font = ("Microsoft YaHei UI", "Microsoft YaHei", "Segoe UI", "Segoe UI Emoji")
|
||||
#let mono-font = ("Consolas", "Cascadia Mono", "Microsoft YaHei UI")
|
||||
|
||||
// =====================================================================
|
||||
// GreLin Feasibility Report · Design Tokens
|
||||
// =====================================================================
|
||||
|
||||
// --- 字号 ---
|
||||
#let size-title = 22pt
|
||||
#let size-cover-title = 34pt
|
||||
#let size-cover-index = 52pt
|
||||
#let size-h1 = 14pt
|
||||
#let size-h2 = 12pt
|
||||
#let size-h3 = 11pt
|
||||
#let size-body = 10.5pt
|
||||
#let size-meta = 9pt
|
||||
#let size-table = 9pt
|
||||
#let size-caption = size-meta
|
||||
|
||||
// --- 行距 ---
|
||||
#let leading-body = 12.5pt
|
||||
#let leading-summary = leading-body
|
||||
|
||||
// --- 间距 ---
|
||||
#let space-none = 0pt
|
||||
#let space-micro = 4pt
|
||||
#let space-inline = 6pt
|
||||
#let space-block = 10pt
|
||||
#let space-section = 12pt
|
||||
#let space-chapter = 18pt
|
||||
#let space-figure-before = space-block
|
||||
#let space-figure-after = space-section
|
||||
#let space-cover-line = 3pt
|
||||
#let space-cover-title = 3pt
|
||||
#let space-cover-meta = 6pt
|
||||
#let cover-block-height = 19.5cm
|
||||
|
||||
// --- 线条 / 边框 ---
|
||||
#let underline-stroke = 2pt + color-neon
|
||||
#let underline-offset = 5pt
|
||||
#let heading-number-gap = 0.35em
|
||||
#let stroke-accent = 1.5pt + color-ink
|
||||
#let summary-radius = 0pt
|
||||
#let summary-inset = 14pt
|
||||
|
||||
// --- 页面 ---
|
||||
#let page-margin = (
|
||||
top: 2.5cm,
|
||||
bottom: 2.5cm,
|
||||
left: 2.5cm,
|
||||
right: 2.5cm,
|
||||
)
|
||||
#let page-header-ascent = 1.0cm
|
||||
#let page-footer-descent = 0.8cm
|
||||
#let page-accent-bar-width = 10pt
|
||||
|
||||
// --- 表格 ---
|
||||
#let table-zebra-fill = rgb(245, 255, 228)
|
||||
#let table-header-fill = color-neon
|
||||
#let table-data-text = rgb(50, 50, 50)
|
||||
#let table-inset = (x: 10pt, y: 6pt)
|
||||
|
||||
// --- 图片 ---
|
||||
#let image-max-width = 100%
|
||||
|
||||
// --- 代码 ---
|
||||
#let code-block-inset = 10pt
|
||||
#let code-block-radius = 0pt
|
||||
#let code-block-fill = rgb(255, 255, 255)
|
||||
#let code-inline-fill = rgb(255, 255, 255)
|
||||
#let code-inline-inset = (x: 5pt, y: 0.12em)
|
||||
#let code-inline-radius = 0pt
|
||||
|
||||
// --- 引用 ---
|
||||
#let blockquote-inset = 10pt
|
||||
#let blockquote-stroke = 3pt + color-neon
|
||||
53
feasibility/report.typ
Normal file
@ -0,0 +1,53 @@
|
||||
#import "data/config.typ": *
|
||||
#import "data/theme.typ": *
|
||||
#import "data/glossary.typ": init-glossary, print-glossary-block, register-report-glossary, gls-long, gls-short
|
||||
#import "data/diagrams.typ": ore-sorting-flow
|
||||
#import "data/code.typ": codly-init-rule, codly-config, code-token-highlight-init
|
||||
#import "data/styling.typ": apply-report-styling
|
||||
#import "data/layout.typ": cover-block, summary-block, page-header, page-footer, page-accent-bar
|
||||
#import "data/md.typ": load-report-md
|
||||
|
||||
#show: codly-init-rule
|
||||
#show: code-token-highlight-init
|
||||
#show: init-glossary
|
||||
#codly-config
|
||||
|
||||
#register-report-glossary()
|
||||
|
||||
#let report = load-report-md(
|
||||
read(content-path),
|
||||
source-path: content-path,
|
||||
extra-scope: (
|
||||
ore-sorting-flow: ore-sorting-flow,
|
||||
gls-long: gls-long,
|
||||
gls-short: gls-short,
|
||||
),
|
||||
)
|
||||
#let meta = report.metadata
|
||||
|
||||
#set page(
|
||||
paper: "a4",
|
||||
margin: page-margin,
|
||||
header-ascent: page-header-ascent,
|
||||
footer-descent: page-footer-descent,
|
||||
fill: color-page,
|
||||
background: page-accent-bar(),
|
||||
header: context {
|
||||
if counter(page).get().first() > 1 {
|
||||
page-header(meta)
|
||||
}
|
||||
},
|
||||
footer: context {
|
||||
if counter(page).get().first() > 1 {
|
||||
page-footer()
|
||||
}
|
||||
},
|
||||
)
|
||||
|
||||
#set text(font: body-font, lang: "zh", size: size-body, fill: color-body)
|
||||
#set par(leading: leading-body, justify: true)
|
||||
|
||||
#cover-block(meta)
|
||||
#summary-block(meta)
|
||||
#apply-report-styling(report.body)
|
||||
#print-glossary-block()
|
||||
5909
feasibility/sample.pdf
Normal file
@ -1,22 +0,0 @@
|
||||
# Presentation · PPT 演示模板
|
||||
|
||||
GreLin 16:9 演示文稿 Typst 模板(占位,待完善)。
|
||||
|
||||
入口:`deck.typ` · 内容:`data/config.typ` · 样式:`data/theme.typ`
|
||||
|
||||
## 目录结构
|
||||
|
||||
```
|
||||
presentation/
|
||||
├── deck.typ # 入口
|
||||
├── data/
|
||||
│ ├── config.typ # ★ 标题、作者、幻灯片内容
|
||||
│ └── theme.typ # 设计 token
|
||||
└── assets/ # 图片等资源
|
||||
```
|
||||
|
||||
## 编译
|
||||
|
||||
```bash
|
||||
typst compile --root . presentation/deck.typ presentation/sample.pdf
|
||||
```
|
||||
@ -1,16 +0,0 @@
|
||||
#let meta = (
|
||||
title: "GreLin 演示标题",
|
||||
subtitle: "副标题 / 日期 / 演讲者",
|
||||
author: "GreLin",
|
||||
)
|
||||
|
||||
#let slides = (
|
||||
(
|
||||
title: "章节一",
|
||||
body: "在此编写第一页正文。",
|
||||
),
|
||||
(
|
||||
title: "章节二",
|
||||
body: "在此编写第二页正文。",
|
||||
),
|
||||
)
|
||||
@ -1,23 +0,0 @@
|
||||
#import "/brand/colors.typ": *
|
||||
|
||||
#let color-primary = color-brand
|
||||
#let color-heading = color-ink
|
||||
#let color-text = color-body
|
||||
#let color-text-light = color-muted
|
||||
|
||||
#let body-font = ("Segoe UI", "Microsoft YaHei UI", "Microsoft YaHei")
|
||||
#let heading-font = body-font
|
||||
|
||||
#let size-title = 36pt
|
||||
#let size-subtitle = 18pt
|
||||
#let size-body = 16pt
|
||||
#let size-section = 24pt
|
||||
|
||||
#let leading-body = size-body * 1.5
|
||||
|
||||
#let slide-margin = (
|
||||
top: 2cm,
|
||||
bottom: 2cm,
|
||||
left: 2.5cm,
|
||||
right: 2.5cm,
|
||||
)
|
||||
@ -1,32 +0,0 @@
|
||||
#import "data/config.typ": *
|
||||
#import "data/theme.typ": *
|
||||
|
||||
#set page(
|
||||
paper: "presentation-16-9",
|
||||
margin: slide-margin,
|
||||
fill: color-page,
|
||||
)
|
||||
|
||||
#set text(
|
||||
font: body-font,
|
||||
size: size-body,
|
||||
fill: color-text,
|
||||
lang: "zh",
|
||||
)
|
||||
|
||||
#set par(leading: leading-body, justify: false)
|
||||
|
||||
#align(center + horizon)[
|
||||
#text(font: heading-font, size: size-title, weight: "bold", fill: color-primary)[#meta.title]
|
||||
#v(0.8em)
|
||||
#text(size: size-subtitle, fill: color-text-light)[#meta.subtitle]
|
||||
]
|
||||
|
||||
#pagebreak()
|
||||
|
||||
#for slide in slides [
|
||||
#text(font: heading-font, size: size-section, weight: "bold", fill: color-heading)[#slide.title]
|
||||
#v(1em)
|
||||
#slide.body
|
||||
#pagebreak()
|
||||
]
|
||||
@ -1,98 +0,0 @@
|
||||
# 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`,姓名与区块标题会自动上色。
|
||||
|
||||
## 内容建议
|
||||
|
||||
- **简介**:一两句话
|
||||
- **工作经历**:2–3 段,每段 2–3 条 bullet
|
||||
- **项目**:2–3 个,各一行 `intro`
|
||||
- **教育**:通常只保留最高学历
|
||||
|
||||
`bullets` 用字符串元组,不要手写 `-` 列表语法。
|
||||
|
||||
## 设计 token(Tailwind 灰稿)
|
||||
|
||||
规范来源:[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` 注释。
|
||||
@ -1,2 +0,0 @@
|
||||
# 占位:将证件照命名为 profile.jpeg 放在此目录
|
||||
# 或在 data/config.typ 的 profile.photo-path 中指定其他相对路径
|
||||
|
Before Width: | Height: | Size: 847 KiB |
@ -1,57 +0,0 @@
|
||||
#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()
|
||||
]
|
||||
],
|
||||
)
|
||||
@ -1,121 +0,0 @@
|
||||
// =====================================================================
|
||||
// 示例内容 · 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 无障碍、攀岩、滑雪、科幻与奇幻小说、《塞尔达传说:旷野之息》与《王国之泪》"
|
||||
@ -1,145 +0,0 @@
|
||||
#import "theme.typ": *
|
||||
#import "config.typ": *
|
||||
|
||||
// =====================================================================
|
||||
// GreLin 求职简历 · Layout(Tailwind 灰稿)
|
||||
// 双栏共用 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]
|
||||
]
|
||||
}
|
||||
}
|
||||
@ -1,122 +0,0 @@
|
||||
// =====================================================================
|
||||
// GreLin 求职简历 · Design Tokens(Tailwind 灰稿)
|
||||
// 规范:Tailwind CSS 默认 theme(font-size · spacing · gray palette)
|
||||
// 印刷:px × 0.75 → pt(Tailwind 默认 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 // 职位行 → bullet:1 行职位行高
|
||||
#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
|
||||
@ -1,8 +1,6 @@
|
||||
# Resume BP · 融资团队简历
|
||||
# Resume · 团队简历模板
|
||||
|
||||
GreLin 双栏中文简历 Typst 模板,用于融资 BP data room 附录。内容偏完整,含证件照、详细经历与可选研究成果。
|
||||
|
||||
入口:`cv.typ` · 内容编辑:`data/config.typ`
|
||||
GreLin 双栏中文简历 Typst 模板,用于融资 BP data room 附录。
|
||||
|
||||
## 照片
|
||||
|
||||
@ -28,7 +26,16 @@ GreLin 双栏中文简历 Typst 模板,用于融资 BP data room 附录。内
|
||||
|
||||
#let skills = (
|
||||
tags: ("Rust", "Python"),
|
||||
notes: (),
|
||||
notes: (), // 可选:侧栏技能补充列表
|
||||
// 可选:能力进度条(有数据时自动显示「能力」子区块)
|
||||
// abilities: (
|
||||
// (name: "全栈开发", level: 0.9),
|
||||
// ),
|
||||
// language: (
|
||||
// name: "英语",
|
||||
// level: 0.75,
|
||||
// label: "读写",
|
||||
// ),
|
||||
)
|
||||
|
||||
#let education = (
|
||||
@ -37,10 +44,12 @@ GreLin 双栏中文简历 Typst 模板,用于融资 BP data room 附录。内
|
||||
school: "西北大学",
|
||||
period: "2022 – 2025",
|
||||
location: "西安",
|
||||
notes: "",
|
||||
notes: "", // 可选:GPA、主修课程等一段说明
|
||||
),
|
||||
)
|
||||
|
||||
#let awards = () // 可选:主栏获奖经历
|
||||
|
||||
#let experiences = (
|
||||
(
|
||||
company: "某某科技",
|
||||
|
Before Width: | Height: | Size: 326 B After Width: | Height: | Size: 326 B |
|
Before Width: | Height: | Size: 318 B After Width: | Height: | Size: 318 B |
|
Before Width: | Height: | Size: 637 B After Width: | Height: | Size: 637 B |
|
Before Width: | Height: | Size: 294 B After Width: | Height: | Size: 294 B |
|
Before Width: | Height: | Size: 285 B After Width: | Height: | Size: 285 B |
|
Before Width: | Height: | Size: 326 B After Width: | Height: | Size: 326 B |
|
Before Width: | Height: | Size: 480 B After Width: | Height: | Size: 480 B |
|
Before Width: | Height: | Size: 394 B After Width: | Height: | Size: 394 B |
|
Before Width: | Height: | Size: 340 B After Width: | Height: | Size: 340 B |
|
Before Width: | Height: | Size: 256 B After Width: | Height: | Size: 256 B |
|
Before Width: | Height: | Size: 320 B After Width: | Height: | Size: 320 B |
|
Before Width: | Height: | Size: 238 B After Width: | Height: | Size: 238 B |
|
Before Width: | Height: | Size: 261 B After Width: | Height: | Size: 261 B |
|
Before Width: | Height: | Size: 841 KiB After Width: | Height: | Size: 841 KiB |
@ -1,9 +1,9 @@
|
||||
#import "../../brand/colors.typ": *
|
||||
|
||||
#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-icon = color-muted
|
||||
#let color-accent-bright = color-body
|
||||
#let color-accent = color-muted
|
||||
#let color-skill-bar = color-muted
|
||||
#let color-divider = color-muted.lighten(68%)
|
||||
#let color-text-light = color-muted.lighten(32%)
|
||||
|
||||
@ -844,24 +844,24 @@ uUL
|
||||
endstream
|
||||
endobj
|
||||
116 0 obj
|
||||
<</Length 4816/Filter/FlateDecode>>
|
||||
<</Length 4808/Filter/FlateDecode>>
|
||||
stream
|
||||
xœÝ]ùÇmÿ<6D>ÅöJøÌ<>VUó.¶qâ´®˜Ä‰í46Å%Ÿiâÿ¾Ÿïìùø–CQOKñCéÃy»Ø9° | ||||