diff --git a/packages/preview/modern-zuel-beamer/0.1.0/LICENSE b/packages/preview/modern-zuel-beamer/0.1.0/LICENSE new file mode 100644 index 0000000000..f5802e1e73 --- /dev/null +++ b/packages/preview/modern-zuel-beamer/0.1.0/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 hxy23 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/preview/modern-zuel-beamer/0.1.0/README.md b/packages/preview/modern-zuel-beamer/0.1.0/README.md new file mode 100644 index 0000000000..1c4140b21d --- /dev/null +++ b/packages/preview/modern-zuel-beamer/0.1.0/README.md @@ -0,0 +1,145 @@ +# Modern ZUEL Beamer + +中南财经政法大学风格的 **Typst 演示文稿模板**,面向毕业论文**开题答辩**。蓝 + 金端庄风,支持 beamer 式分步显示。 + +## 特性 + +- 🎓 五类页面:封面 / 目录(自动汇总章节)/ 章节分隔 / 内容 / 结束 +- ⏯️ 分步显示:基于 [Polylux](https://polylux.dev) 0.4.0 引擎(`uncover` / `only` / `one-by-one` / `item-by-item`) +- 🧭 页眉圆点导航:每章一点,当前高亮,**点击跳转**到对应章节页 +- 📖 讲义模式:`handout: true` 一键折叠所有分步,便于打印/导出讲义 +- 🎨 蓝金端庄主题 + 6 种莫兰迪语义色块(定义 / 注意 / 示例 / 定理 / 重点 / 说明) +- 📐 设计 token 集中在 [`src/theme.typ`](src/theme.typ),改一处变全局 +- 🖼️ 封面校园线描水印(`watermark: none` 可关闭) +- 📊 技术路线图用 [cetz](https://cetz-package.github.io) 原生绘制 +- 📄 自动页脚:左作者 · 中标题 · 右页码 + +## 预览 + +| 封面(校徽 + 对齐信息表 + 水印) | 内容页(页眉圆点导航 + 语义色块) | +| :--: | :--: | +| ![封面](preview/cover.png) | ![内容页](preview/content.png) | +| **技术路线图(cetz 原生绘制)** | **进度安排表** | +| ![技术路线](preview/roadmap.png) | ![进度表](preview/timeline.png) | + +组件示例(多栏布局 · 金句块 · 图片题注): + +![组件](preview/component.png) + +## 环境要求 + +| 依赖 | 版本 | 说明 | +| --- | --- | --- | +| Typst | 0.15.0 | 本机 `/usr/local/bin/typst` | +| 中文字体 | Noto Serif/Sans CJK SC | 系统已装 | +| Polylux | 0.4.0 | 首次编译联网自动拉取 | +| cetz | 0.4.0 | 仅技术路线图用,联网自动拉取 | + +## 快速开始 + +```bash +# 在项目根目录编译示例(注意 --root 指向项目根,否则 ../lib.typ 会被判越界) +typst compile --root . example/example.typ out.pdf + +# 实时预览 +typst watch --root . example/example.typ out.pdf +``` + +## 目录结构 + +``` +modern-zuel-beamer/ +├── lib.typ # 入口:import 这一个即可 +├── typst.toml # 包元数据 +├── asset/ # logo / 背景图 +├── src/ +│ ├── theme.typ # ★ 设计 token(颜色/字体/字号/间距) +│ ├── setup.typ # 全局装配(页面/字体/文档信息) +│ ├── slide.typ # 五类页面函数 + 标题栏 + 页眉圆点 + 页脚 +│ ├── overlay.typ # 接 Polylux 分步引擎 + 讲义模式 +│ ├── block.typ # 莫兰迪语义色块 +│ └── component.typ # 多栏 / 题注 / 金句 / 编号定理 +└── example/ + ├── example.typ # 完整可填充示例 + └── quick_check.typ # 各组件用法参考 +``` + +## API 速查 + +```typst +#import "../lib.typ": * + +// 1) 装配(相当于 documentclass) +#show: zuel-beamer.with( + title: "...", subtitle: "...", + author: "...", student-id: "...", supervisor: "...", + major: "...", school: "...", date: datetime.today(), + // logo: image("自定义.png", height: 2cm), // 可选 + // watermark: none, // 关闭封面水印 + // handout: true, // 讲义模式:去掉分步动画 +) + +#title-slide() // 封面 +#outline-slide() // 目录(自动收集所有 section) + +#section("研究背景与意义") // 章节分隔页(驱动目录与页脚) + +#slide(title: "选题背景")[ // 内容页(= beamer 的 frame) + - 第一点 + #uncover("2-")[- 第二步才出现] + #definition-block(title: "研究问题")[ ... ] // 语义色块 +] + +#end-slide(message: "敬请各位老师批评指正!") +``` + +**分步显示**(Polylux 0.4.0 无 `#pause`,用下列函数): + +| 函数 | 效果 | +| --- | --- | +| `uncover(2)[...]` | 第 2 步起出现(占位保留)| +| `uncover("2-")[...]` | 第 2 步起一直显示 | +| `only(3)[...]` | 仅第 3 步出现(不占位)| +| `one-by-one[A][B][C]` | A、B、C 逐步出现 | +| `item-by-item[列表]` | 列表项逐条出现 | + +**语义色块**:`note-block` / `definition-block` / `alert-block` / `example-block` / `theorem-block` / `highlight-block`,均支持 `title:` 参数。 + +**更多组件**(见 [`example/quick_check.typ`](example/quick_check.typ)): + +| 组件 | 用法 | 说明 | +| --- | --- | --- | +| 多栏布局 | `#cols[左][右]`、`#cols(widths: (2fr, 1fr))[宽][窄]` | 文字+图、左右对照 | +| 图片题注 | `#fig(image("x.png", width: 70%), caption: [说明])` | 自动「图 N」,题注样式统一 | +| 金句/引用块 | `#quote-block(by: "来源")[内容]` | 左金条 + 斜体引文 | +| 编号定理 | `#theorem(title: "可选")[...]`、`#lemma[...]`、`#corollary[...]`、`#definition-thm[...]` | 各类独立自动编号 | + +## 自定义外观 + +所有可调参数集中在 [`src/theme.typ`](src/theme.typ):`color`(配色)、`font`(字体)、`size`(字号)、`layout`(间距/线条)。改这里即可整体换装,无需动组件代码。 + +## 架构 + +```mermaid +flowchart TD + U["你的 .typ 文件"] -->|#import| LIB["lib.typ 入口"] + LIB --> SETUP["setup.typ 全局装配"] + LIB --> SLIDE["slide.typ 页面组件"] + LIB --> BLOCK["block.typ 莫兰迪块"] + LIB --> OV["overlay.typ 分步"] + LIB --> TH["theme.typ 设计 token"] + OV -->|依赖| POLY[("Polylux 0.4.0")] + SLIDE --> SETUP + SLIDE --> OV + SLIDE --> TH + SETUP --> TH + BLOCK --> TH +``` + +## 关于流程图 + +模板内的流程图(如技术路线图)用 **cetz** 原生绘制,矢量清晰、随主题变色、零外部构建步骤。本文档与设计沟通中的流程图用 **mermaid** 表达(如上方架构图);Typst 编译期不渲染 mermaid,故不在幻灯片内使用。 + +## 许可 + +MIT diff --git a/packages/preview/modern-zuel-beamer/0.1.0/asset/ZUELlogo.png b/packages/preview/modern-zuel-beamer/0.1.0/asset/ZUELlogo.png new file mode 100644 index 0000000000..769027b3b2 Binary files /dev/null and b/packages/preview/modern-zuel-beamer/0.1.0/asset/ZUELlogo.png differ diff --git a/packages/preview/modern-zuel-beamer/0.1.0/asset/background.png b/packages/preview/modern-zuel-beamer/0.1.0/asset/background.png new file mode 100644 index 0000000000..f1df5f8bce Binary files /dev/null and b/packages/preview/modern-zuel-beamer/0.1.0/asset/background.png differ diff --git a/packages/preview/modern-zuel-beamer/0.1.0/asset/logo.svg b/packages/preview/modern-zuel-beamer/0.1.0/asset/logo.svg new file mode 100644 index 0000000000..352a6b64f9 --- /dev/null +++ b/packages/preview/modern-zuel-beamer/0.1.0/asset/logo.svg @@ -0,0 +1,15 @@ + + + Created with Pixso. + + + + + + + + + + + + diff --git a/packages/preview/modern-zuel-beamer/0.1.0/example/example.typ b/packages/preview/modern-zuel-beamer/0.1.0/example/example.typ new file mode 100644 index 0000000000..88aec1a766 --- /dev/null +++ b/packages/preview/modern-zuel-beamer/0.1.0/example/example.typ @@ -0,0 +1,213 @@ +// ============================================================================ +// 开题答辩 · 完整示例(照此填充即可) +// 编译: typst compile --root .. 开题答辩-示例.typ 开题答辩-示例.pdf +// 或在项目根目录: typst compile --root . example/开题答辩-示例.typ out.pdf +// ============================================================================ + +#import "../lib.typ": * +#import "@preview/cetz:0.4.0" as cetz + +// --------------------------------------------------------------------------- +// 文档信息(改这里) +// --------------------------------------------------------------------------- +#show: zuel-beamer.with( + title: "基于深度学习的企业财务风险预警研究", + subtitle: "硕士学位论文开题报告", + author: "张三", + student-id: "202400000001", + supervisor: "李四 教授", + major: "应用经济学", + school: "信息与安全工程学院", + date: datetime(year: 2026, month: 6, day: 27), +) + +// =========================================================================== +// 封面 + 目录 +// =========================================================================== +#title-slide() + +#outline-slide() + +// =========================================================================== +// 一、研究背景与意义 +// =========================================================================== +#section("研究背景与意义") + +#slide(title: "选题背景")[ + 近年来,企业财务风险事件频发,传统预警模型存在以下局限: + + - 依赖人工设定的财务指标,*特征表达能力*有限 + #uncover("2-")[- 难以刻画风险的*非线性、时序性*演化规律] + #uncover("3-")[- 对公告、舆情等*非结构化数据*利用不足] + + #uncover("3-")[ + #definition-block(title: "研究问题")[ + 如何融合多源异构数据,构建更准确、更可解释的企业财务风险预警模型? + ] + ] +] + +#slide(title: "研究意义")[ + #one-by-one[ + + *理论意义*:拓展财务风险预警的方法论边界,丰富深度学习在财务领域的应用。 + ][ + + *现实意义*:为监管部门防范系统性风险、投资者识别风险标的提供决策支持。 + ] +] + +// =========================================================================== +// 二、国内外研究现状 +// =========================================================================== +#section("国内外研究现状") + +#slide(title: "国外研究现状")[ + - *统计模型阶段*:Altman(1968)Z-Score、Ohlson(1980)Logit 模型。 + - *机器学习阶段*:SVM、随机森林等提升了非线性刻画能力。 + - *深度学习阶段*:LSTM / Transformer 开始用于财务时序与文本风险识别。 +] + +#slide(title: "国内研究现状")[ + - 早期以*财务比率 + 判别分析*为主,样本多集中于 ST 公司。 + - 近年引入*文本挖掘*(年报 MD&A、问询函)刻画风险信号。 + - 多源数据融合与*模型可解释性*仍是薄弱环节。 +] + +#slide(title: "研究述评")[ + 现有研究在多源融合与可解释性上存在明显缺口: + + #highlight-block(title: "研究空白")[ + 缺乏一个能*同时*融合结构化财务数据与非结构化文本、并兼顾*时序建模*与 + *可解释性*的统一预警框架——这正是本研究切入点。 + ] +] + +// =========================================================================== +// 三、研究内容与目标 +// =========================================================================== +#section("研究内容与目标") + +#slide(title: "研究内容")[ + #item-by-item[ + + 多源财务风险数据集的构建与预处理方法; + + 结构化指标与文本特征的*融合表示*学习; + + 基于深度时序模型的*风险预警*方法; + + 模型*可解释性*分析与实证检验。 + ] +] + +#slide(title: "研究目标")[ + - 构建一套*多源异构*财务风险预警数据集; + - 提出融合时序与文本的*预警模型*,AUC 较基线提升 ≥ 5%; + - 给出风险驱动因子的*可解释*归因,形成政策建议。 +] + +// =========================================================================== +// 四、研究方法与技术路线 +// =========================================================================== +#section("研究方法与技术路线") + +#slide(title: "研究方法")[ + #example-block(title: "方法组合")[ + 实证研究法 + 机器学习建模 + 对比实验。以*公开上市公司数据*为样本, + 采用*留出法 + 时间序列交叉验证*评估,主指标 AUC / KS / F1。 + ] +] + +// —— 技术路线图:用 cetz 原生绘制(约束 #6) —— +// 节点文案改 stages 即可;颜色取自模板主题 color.* +#let tech-roadmap = cetz.canvas(length: 1cm, { + import cetz.draw: * + let bw = 7.4 // 框宽 + let bh = 1.25 // 框高 + let gap = 0.5 // 框间距 + let stages = ( + "① 多源数据采集与预处理", + "② 财务 · 文本 · 舆情 特征融合", + "③ 深度时序风险预警模型构建", + "④ 实证分析 · 对比 · 调优", + "⑤ 风险预警应用与政策建议", + ) + for (i, s) in stages.enumerate() { + let top = -i * (bh + gap) + let bottom = top - bh + rect( + (-bw / 2, bottom), (bw / 2, top), + fill: color.primary.lighten(86%), + stroke: 1pt + color.primary, + radius: 0.12, + ) + content((0, top - bh / 2), text(fill: color.primary-dark, weight: "bold", size: 15pt, s)) + if i > 0 { + let prev-bottom = -(i - 1) * (bh + gap) - bh + line( + (0, prev-bottom), (0, top), + mark: (end: ">", fill: color.gold), + stroke: 1.4pt + color.gold, + ) + } + } +}) + +#slide(title: "技术路线")[ + #align(center, tech-roadmap) +] + +// =========================================================================== +// 五、研究计划与进度安排 +// =========================================================================== +#section("研究计划与进度安排") + +#slide(title: "进度安排")[ + #set text(size: size.small) + #table( + columns: (auto, 1fr, 1.4fr), + inset: (x: 0.8em, y: 0.6em), + align: (center + horizon, center + horizon, left + horizon), + stroke: 0.5pt + color.gray-light, + table.header( + ..("阶段", "时间", "主要任务").map(h => table.cell( + fill: color.primary, + text(fill: white, weight: "bold", h), + )), + ), + [第一阶段], [2026.07 – 2026.09], [文献调研、数据采集与清洗], + [第二阶段], [2026.10 – 2026.12], [特征融合与模型构建], + [第三阶段], [2027.01 – 2027.03], [实证分析、对比实验与调优], + [第四阶段], [2027.04 – 2027.05], [撰写论文、修改完善与答辩], + ) +] + +// =========================================================================== +// 六、预期成果与创新点 +// =========================================================================== +#section("预期成果与创新点") + +#slide(title: "预期成果")[ + - 完成硕士学位论文一篇; + - 形成可复现的*多源财务风险预警*数据集与代码; + - 拟投稿*核心期刊*论文 1 篇。 +] + +#slide(title: "创新点")[ + #alert-block(title: "创新点一")[结构化指标与非结构化文本的*统一融合表示*。] + #alert-block(title: "创新点二")[引入*可解释*机制,输出风险驱动因子归因。] +] + +// =========================================================================== +// 七、参考文献 +// =========================================================================== +#section("参考文献") + +#slide(title: "主要参考文献")[ + #set text(size: size.small) + #set enum(numbering: "[1]") + + Altman E I. Financial ratios, discriminant analysis and the prediction of corporate bankruptcy. _Journal of Finance_, 1968. + + Ohlson J A. Financial ratios and the probabilistic prediction of bankruptcy. _Journal of Accounting Research_, 1980. + + Vaswani A, et al. Attention is all you need. _NeurIPS_, 2017. + + 张某某, 李某某. 基于深度学习的上市公司财务风险预警研究. 《会计研究》, 2023. +] + +// =========================================================================== +// 致谢 +// =========================================================================== +#end-slide() diff --git a/packages/preview/modern-zuel-beamer/0.1.0/example/quick_check.typ b/packages/preview/modern-zuel-beamer/0.1.0/example/quick_check.typ new file mode 100644 index 0000000000..dbb5e80c0f --- /dev/null +++ b/packages/preview/modern-zuel-beamer/0.1.0/example/quick_check.typ @@ -0,0 +1,69 @@ +// ============================================================================ +// quick_check —— 演示模板提供的各类组件用法 +// 编译: typst compile --root . example/quick_check.typ out.pdf +// ============================================================================ + +#import "../lib.typ": * + +#show: zuel-beamer.with( + title: "Modern ZUEL Beamer quick_check", + subtitle: "色块 · 分步 · 多栏 · 题注 · 金句 · 定理", + author: "模板使用者", + date: datetime.today(), +) + +#title-slide() +#outline-slide() + +// --------------------------------------------------------------------------- +#section("内容块与分步") + +#slide(title: "六种莫兰迪色块")[ + #cols[ + #note-block(title: "说明")[note-block] + #definition-block(title: "定义")[definition-block] + #alert-block(title: "注意")[alert-block] + ][ + #example-block(title: "示例")[example-block] + #theorem-block(title: "定理")[theorem-block(非编号)] + #highlight-block(title: "重点")[highlight-block] + ] +] + +#slide(title: "分步显示")[ + 逐条出现: + #item-by-item[ + + 第一条(第 1 步) + + 第二条(第 2 步) + + 第三条(第 3 步) + ] + #uncover("3-")[#alert-block(title: "提示")[第 3 步才出现的整块内容。]] +] + +// --------------------------------------------------------------------------- +#section("布局与图文") + +#slide(title: "多栏 + 金句 + 题注")[ + #cols(widths: (1.1fr, 1fr))[ + 左右分栏常用于「文字 + 图」对照。 + + #quote-block(by: "Altman, 1968")[财务比率对企业破产具有显著预测力。] + ][ + #fig(image("../asset/ZUELlogo.png", width: 55%), caption: [校徽示意]) + ] +] + +// --------------------------------------------------------------------------- +#section("编号定理环境") + +#slide(title: "定理 / 引理 / 推论(各类独立编号)")[ + #cols[ + #theorem(title: "融合可分性")[在温和假设下,多源特征融合表示线性可分。] + #lemma[引理自动编号为 1。] + ][ + #theorem[第二个定理自动编号为 2。] + #corollary[推论自动编号为 1。] + ] +] + +#end-slide(message: "组件用法见 README") diff --git "a/packages/preview/modern-zuel-beamer/0.1.0/example/\345\274\200\351\242\230\347\255\224\350\276\251-\347\244\272\344\276\213.typ" "b/packages/preview/modern-zuel-beamer/0.1.0/example/\345\274\200\351\242\230\347\255\224\350\276\251-\347\244\272\344\276\213.typ" new file mode 100644 index 0000000000..88aec1a766 --- /dev/null +++ "b/packages/preview/modern-zuel-beamer/0.1.0/example/\345\274\200\351\242\230\347\255\224\350\276\251-\347\244\272\344\276\213.typ" @@ -0,0 +1,213 @@ +// ============================================================================ +// 开题答辩 · 完整示例(照此填充即可) +// 编译: typst compile --root .. 开题答辩-示例.typ 开题答辩-示例.pdf +// 或在项目根目录: typst compile --root . example/开题答辩-示例.typ out.pdf +// ============================================================================ + +#import "../lib.typ": * +#import "@preview/cetz:0.4.0" as cetz + +// --------------------------------------------------------------------------- +// 文档信息(改这里) +// --------------------------------------------------------------------------- +#show: zuel-beamer.with( + title: "基于深度学习的企业财务风险预警研究", + subtitle: "硕士学位论文开题报告", + author: "张三", + student-id: "202400000001", + supervisor: "李四 教授", + major: "应用经济学", + school: "信息与安全工程学院", + date: datetime(year: 2026, month: 6, day: 27), +) + +// =========================================================================== +// 封面 + 目录 +// =========================================================================== +#title-slide() + +#outline-slide() + +// =========================================================================== +// 一、研究背景与意义 +// =========================================================================== +#section("研究背景与意义") + +#slide(title: "选题背景")[ + 近年来,企业财务风险事件频发,传统预警模型存在以下局限: + + - 依赖人工设定的财务指标,*特征表达能力*有限 + #uncover("2-")[- 难以刻画风险的*非线性、时序性*演化规律] + #uncover("3-")[- 对公告、舆情等*非结构化数据*利用不足] + + #uncover("3-")[ + #definition-block(title: "研究问题")[ + 如何融合多源异构数据,构建更准确、更可解释的企业财务风险预警模型? + ] + ] +] + +#slide(title: "研究意义")[ + #one-by-one[ + + *理论意义*:拓展财务风险预警的方法论边界,丰富深度学习在财务领域的应用。 + ][ + + *现实意义*:为监管部门防范系统性风险、投资者识别风险标的提供决策支持。 + ] +] + +// =========================================================================== +// 二、国内外研究现状 +// =========================================================================== +#section("国内外研究现状") + +#slide(title: "国外研究现状")[ + - *统计模型阶段*:Altman(1968)Z-Score、Ohlson(1980)Logit 模型。 + - *机器学习阶段*:SVM、随机森林等提升了非线性刻画能力。 + - *深度学习阶段*:LSTM / Transformer 开始用于财务时序与文本风险识别。 +] + +#slide(title: "国内研究现状")[ + - 早期以*财务比率 + 判别分析*为主,样本多集中于 ST 公司。 + - 近年引入*文本挖掘*(年报 MD&A、问询函)刻画风险信号。 + - 多源数据融合与*模型可解释性*仍是薄弱环节。 +] + +#slide(title: "研究述评")[ + 现有研究在多源融合与可解释性上存在明显缺口: + + #highlight-block(title: "研究空白")[ + 缺乏一个能*同时*融合结构化财务数据与非结构化文本、并兼顾*时序建模*与 + *可解释性*的统一预警框架——这正是本研究切入点。 + ] +] + +// =========================================================================== +// 三、研究内容与目标 +// =========================================================================== +#section("研究内容与目标") + +#slide(title: "研究内容")[ + #item-by-item[ + + 多源财务风险数据集的构建与预处理方法; + + 结构化指标与文本特征的*融合表示*学习; + + 基于深度时序模型的*风险预警*方法; + + 模型*可解释性*分析与实证检验。 + ] +] + +#slide(title: "研究目标")[ + - 构建一套*多源异构*财务风险预警数据集; + - 提出融合时序与文本的*预警模型*,AUC 较基线提升 ≥ 5%; + - 给出风险驱动因子的*可解释*归因,形成政策建议。 +] + +// =========================================================================== +// 四、研究方法与技术路线 +// =========================================================================== +#section("研究方法与技术路线") + +#slide(title: "研究方法")[ + #example-block(title: "方法组合")[ + 实证研究法 + 机器学习建模 + 对比实验。以*公开上市公司数据*为样本, + 采用*留出法 + 时间序列交叉验证*评估,主指标 AUC / KS / F1。 + ] +] + +// —— 技术路线图:用 cetz 原生绘制(约束 #6) —— +// 节点文案改 stages 即可;颜色取自模板主题 color.* +#let tech-roadmap = cetz.canvas(length: 1cm, { + import cetz.draw: * + let bw = 7.4 // 框宽 + let bh = 1.25 // 框高 + let gap = 0.5 // 框间距 + let stages = ( + "① 多源数据采集与预处理", + "② 财务 · 文本 · 舆情 特征融合", + "③ 深度时序风险预警模型构建", + "④ 实证分析 · 对比 · 调优", + "⑤ 风险预警应用与政策建议", + ) + for (i, s) in stages.enumerate() { + let top = -i * (bh + gap) + let bottom = top - bh + rect( + (-bw / 2, bottom), (bw / 2, top), + fill: color.primary.lighten(86%), + stroke: 1pt + color.primary, + radius: 0.12, + ) + content((0, top - bh / 2), text(fill: color.primary-dark, weight: "bold", size: 15pt, s)) + if i > 0 { + let prev-bottom = -(i - 1) * (bh + gap) - bh + line( + (0, prev-bottom), (0, top), + mark: (end: ">", fill: color.gold), + stroke: 1.4pt + color.gold, + ) + } + } +}) + +#slide(title: "技术路线")[ + #align(center, tech-roadmap) +] + +// =========================================================================== +// 五、研究计划与进度安排 +// =========================================================================== +#section("研究计划与进度安排") + +#slide(title: "进度安排")[ + #set text(size: size.small) + #table( + columns: (auto, 1fr, 1.4fr), + inset: (x: 0.8em, y: 0.6em), + align: (center + horizon, center + horizon, left + horizon), + stroke: 0.5pt + color.gray-light, + table.header( + ..("阶段", "时间", "主要任务").map(h => table.cell( + fill: color.primary, + text(fill: white, weight: "bold", h), + )), + ), + [第一阶段], [2026.07 – 2026.09], [文献调研、数据采集与清洗], + [第二阶段], [2026.10 – 2026.12], [特征融合与模型构建], + [第三阶段], [2027.01 – 2027.03], [实证分析、对比实验与调优], + [第四阶段], [2027.04 – 2027.05], [撰写论文、修改完善与答辩], + ) +] + +// =========================================================================== +// 六、预期成果与创新点 +// =========================================================================== +#section("预期成果与创新点") + +#slide(title: "预期成果")[ + - 完成硕士学位论文一篇; + - 形成可复现的*多源财务风险预警*数据集与代码; + - 拟投稿*核心期刊*论文 1 篇。 +] + +#slide(title: "创新点")[ + #alert-block(title: "创新点一")[结构化指标与非结构化文本的*统一融合表示*。] + #alert-block(title: "创新点二")[引入*可解释*机制,输出风险驱动因子归因。] +] + +// =========================================================================== +// 七、参考文献 +// =========================================================================== +#section("参考文献") + +#slide(title: "主要参考文献")[ + #set text(size: size.small) + #set enum(numbering: "[1]") + + Altman E I. Financial ratios, discriminant analysis and the prediction of corporate bankruptcy. _Journal of Finance_, 1968. + + Ohlson J A. Financial ratios and the probabilistic prediction of bankruptcy. _Journal of Accounting Research_, 1980. + + Vaswani A, et al. Attention is all you need. _NeurIPS_, 2017. + + 张某某, 李某某. 基于深度学习的上市公司财务风险预警研究. 《会计研究》, 2023. +] + +// =========================================================================== +// 致谢 +// =========================================================================== +#end-slide() diff --git "a/packages/preview/modern-zuel-beamer/0.1.0/example/\347\273\204\344\273\266\351\200\237\346\237\245.typ" "b/packages/preview/modern-zuel-beamer/0.1.0/example/\347\273\204\344\273\266\351\200\237\346\237\245.typ" new file mode 100644 index 0000000000..90c9a48a82 --- /dev/null +++ "b/packages/preview/modern-zuel-beamer/0.1.0/example/\347\273\204\344\273\266\351\200\237\346\237\245.typ" @@ -0,0 +1,69 @@ +// ============================================================================ +// 组件速查 —— 演示模板提供的各类组件用法 +// 编译: typst compile --root . example/组件速查.typ out.pdf +// ============================================================================ + +#import "../lib.typ": * + +#show: zuel-beamer.with( + title: "Modern ZUEL Beamer 组件速查", + subtitle: "色块 · 分步 · 多栏 · 题注 · 金句 · 定理", + author: "模板使用者", + date: datetime.today(), +) + +#title-slide() +#outline-slide() + +// --------------------------------------------------------------------------- +#section("内容块与分步") + +#slide(title: "六种莫兰迪色块")[ + #cols[ + #note-block(title: "说明")[note-block] + #definition-block(title: "定义")[definition-block] + #alert-block(title: "注意")[alert-block] + ][ + #example-block(title: "示例")[example-block] + #theorem-block(title: "定理")[theorem-block(非编号)] + #highlight-block(title: "重点")[highlight-block] + ] +] + +#slide(title: "分步显示")[ + 逐条出现: + #item-by-item[ + + 第一条(第 1 步) + + 第二条(第 2 步) + + 第三条(第 3 步) + ] + #uncover("3-")[#alert-block(title: "提示")[第 3 步才出现的整块内容。]] +] + +// --------------------------------------------------------------------------- +#section("布局与图文") + +#slide(title: "多栏 + 金句 + 题注")[ + #cols(widths: (1.1fr, 1fr))[ + 左右分栏常用于「文字 + 图」对照。 + + #quote-block(by: "Altman, 1968")[财务比率对企业破产具有显著预测力。] + ][ + #fig(image("../asset/ZUELlogo.png", width: 55%), caption: [校徽示意]) + ] +] + +// --------------------------------------------------------------------------- +#section("编号定理环境") + +#slide(title: "定理 / 引理 / 推论(各类独立编号)")[ + #cols[ + #theorem(title: "融合可分性")[在温和假设下,多源特征融合表示线性可分。] + #lemma[引理自动编号为 1。] + ][ + #theorem[第二个定理自动编号为 2。] + #corollary[推论自动编号为 1。] + ] +] + +#end-slide(message: "组件用法见 README") diff --git a/packages/preview/modern-zuel-beamer/0.1.0/lib.typ b/packages/preview/modern-zuel-beamer/0.1.0/lib.typ new file mode 100644 index 0000000000..ab213eb66e --- /dev/null +++ b/packages/preview/modern-zuel-beamer/0.1.0/lib.typ @@ -0,0 +1,29 @@ +// ============================================================================ +// Modern ZUEL Beamer —— 主入口 +// 中南财经政法大学风格 · Typst 演示文稿模板(开题答辩) +// 用户只需: #import "../lib.typ": * +// ============================================================================ + +// 装配(documentclass 等价物) +#import "src/setup.typ": zuel-beamer + +// 页面组件 +#import "src/slide.typ": title-slide, outline-slide, section, slide, end-slide + +// 内容块 +#import "src/block.typ": ( + note-block, definition-block, alert-block, + example-block, theorem-block, highlight-block, +) + +// 补充组件:多栏 / 题注 / 金句 / 编号定理 +#import "src/component.typ": ( + cols, fig, quote-block, + theorem, lemma, corollary, definition-thm, +) + +// 分步显示(Polylux 0.4.0 引擎) +#import "src/overlay.typ": uncover, only, one-by-one, item-by-item, later, alternatives + +// 设计 token(需要微调外观时可直接取用) +#import "src/theme.typ": color, font, size, layout diff --git a/packages/preview/modern-zuel-beamer/0.1.0/preview/component.png b/packages/preview/modern-zuel-beamer/0.1.0/preview/component.png new file mode 100644 index 0000000000..4858ba7488 Binary files /dev/null and b/packages/preview/modern-zuel-beamer/0.1.0/preview/component.png differ diff --git a/packages/preview/modern-zuel-beamer/0.1.0/preview/content.png b/packages/preview/modern-zuel-beamer/0.1.0/preview/content.png new file mode 100644 index 0000000000..33093fee50 Binary files /dev/null and b/packages/preview/modern-zuel-beamer/0.1.0/preview/content.png differ diff --git a/packages/preview/modern-zuel-beamer/0.1.0/preview/cover.png b/packages/preview/modern-zuel-beamer/0.1.0/preview/cover.png new file mode 100644 index 0000000000..06186a1d65 Binary files /dev/null and b/packages/preview/modern-zuel-beamer/0.1.0/preview/cover.png differ diff --git a/packages/preview/modern-zuel-beamer/0.1.0/preview/roadmap.png b/packages/preview/modern-zuel-beamer/0.1.0/preview/roadmap.png new file mode 100644 index 0000000000..83651eb2d7 Binary files /dev/null and b/packages/preview/modern-zuel-beamer/0.1.0/preview/roadmap.png differ diff --git a/packages/preview/modern-zuel-beamer/0.1.0/preview/timeline.png b/packages/preview/modern-zuel-beamer/0.1.0/preview/timeline.png new file mode 100644 index 0000000000..ea81fbbba5 Binary files /dev/null and b/packages/preview/modern-zuel-beamer/0.1.0/preview/timeline.png differ diff --git a/packages/preview/modern-zuel-beamer/0.1.0/src/block.typ b/packages/preview/modern-zuel-beamer/0.1.0/src/block.typ new file mode 100644 index 0000000000..2791c2e7d4 --- /dev/null +++ b/packages/preview/modern-zuel-beamer/0.1.0/src/block.typ @@ -0,0 +1,50 @@ +// ============================================================================ +// 内容块 —— beamer 的 definition / theorem / example / alert 等价物 +// 莫兰迪配色,标题栏(深)+ 正文区(浅)。 +// ============================================================================ + +#import "theme.typ": color, font, size, layout + +// --------------------------------------------------------------------------- +// 外观参数(置顶) +// --------------------------------------------------------------------------- +#let title-inset = (x: 0.8em, y: 0.4em) +#let body-inset = (x: 0.8em, top: 0.55em, bottom: 0.7em) +#let body-tint = 88% // 正文区底色 = 主色 lighten 此值 +#let block-below = 0.9em // 块与下文间距 + +// --------------------------------------------------------------------------- +// 通用块工厂 +// --------------------------------------------------------------------------- +#let _admonition(fill-color, title, body) = block( + width: 100%, + below: block-below, + radius: layout.block-radius, + clip: true, + stroke: 0.6pt + fill-color, + { + block( + width: 100%, + below: 0pt, // 紧贴正文,消除标题栏与正文间的白缝 + fill: fill-color, + inset: title-inset, + text(fill: white, font: font.sans, weight: "bold", size: size.small, title), + ) + block( + width: 100%, + fill: fill-color.lighten(body-tint), + inset: body-inset, + body, + ) + }, +) + +// --------------------------------------------------------------------------- +// 五种语义块(标题可自定义) +// --------------------------------------------------------------------------- +#let note-block(title: "说明", body) = _admonition(color.block-note, title, body) +#let definition-block(title: "定义", body) = _admonition(color.block-definition, title, body) +#let alert-block(title: "注意", body) = _admonition(color.block-alert, title, body) +#let example-block(title: "示例", body) = _admonition(color.block-example, title, body) +#let theorem-block(title: "定理", body) = _admonition(color.block-theorem, title, body) +#let highlight-block(title: "重点", body) = _admonition(color.block-highlight, title, body) diff --git a/packages/preview/modern-zuel-beamer/0.1.0/src/component.typ b/packages/preview/modern-zuel-beamer/0.1.0/src/component.typ new file mode 100644 index 0000000000..6ce9b9798c --- /dev/null +++ b/packages/preview/modern-zuel-beamer/0.1.0/src/component.typ @@ -0,0 +1,84 @@ +// ============================================================================ +// 补充组件 —— 多栏布局 / 图片题注 / 金句块 / 编号定理环境 +// ============================================================================ + +#import "theme.typ": color, font, size, layout + +// --------------------------------------------------------------------------- +// 外观参数(置顶) +// --------------------------------------------------------------------------- +#let col-gutter = 1.2em // 多栏默认间距 +#let quote-bar-width = 3pt // 金句块左侧竖条宽 +#let quote-inset = (x: 1em, y: 0.75em) // 金句块内边距 +#let quote-tint = 94% // 金句块底色 = 主色 lighten +#let thm-title-inset = (x: 0.8em, y: 0.4em) // 定理标题栏内边距 +#let thm-body-inset = (x: 0.8em, top: 0.55em, bottom: 0.7em) // 定理正文内边距 +#let thm-body-tint = 88% // 定理正文底色 lighten +#let block-below = 0.9em // 组件与下文间距 + +// --------------------------------------------------------------------------- +// 多栏布局:#cols[左][右] 或 #cols(widths: (2fr, 1fr))[宽][窄] +// --------------------------------------------------------------------------- +#let cols(..bodies, gutter: col-gutter, widths: none) = { + let items = bodies.pos() + let cw = if widths == none { items.map(_ => 1fr) } else { widths } + grid(columns: cw, column-gutter: gutter, align: top, ..items) +} + +// --------------------------------------------------------------------------- +// 图片 + 统一题注:#fig(image("x.png", width: 70%), caption: [说明]) +// 题注样式(“图 N / 表 N”、字号、颜色)由 setup.typ 的 show 规则统一控制 +// --------------------------------------------------------------------------- +#let fig(body, caption: none) = figure(body, caption: caption) + +// --------------------------------------------------------------------------- +// 金句 / 引用块:#quote-block[内容][来源] +// --------------------------------------------------------------------------- +#let quote-block(body, by: none) = block( + width: 100%, + below: block-below, + fill: color.primary.lighten(quote-tint), + inset: quote-inset, + stroke: (left: quote-bar-width + color.gold), // 左侧金色竖条(高度自动贴合内容) + { + set text(fill: color.primary-dark, style: "italic") + body + if by != none { + v(0.3em) + align(right, text(size: size.small, fill: color.muted, style: "normal", [—— #by])) + } + }, +) + +// --------------------------------------------------------------------------- +// 编号定理环境:#theorem(title: "可选")[内容] -> “定理 1(可选)” +// theorem / lemma / corollary / definition-thm,各类独立编号 +// --------------------------------------------------------------------------- +#let _thm-counter(name) = counter("zuel-thm-" + name) + +#let _thm-env(name, fill, title, body) = { + let c = _thm-counter(name) + c.step() + block( + width: 100%, + below: block-below, + radius: layout.block-radius, + clip: true, + stroke: 0.6pt + fill, + { + block(width: 100%, below: 0pt, fill: fill, inset: thm-title-inset, context { + let n = c.get().first() + text( + fill: white, font: font.sans, weight: "bold", size: size.small, + [#name #n#if title != none [(#title)]], + ) + }) + block(width: 100%, fill: fill.lighten(thm-body-tint), inset: thm-body-inset, body) + }, + ) +} + +#let theorem(title: none, body) = _thm-env("定理", color.block-theorem, title, body) +#let lemma(title: none, body) = _thm-env("引理", color.block-theorem, title, body) +#let corollary(title: none, body) = _thm-env("推论", color.block-theorem, title, body) +#let definition-thm(title: none, body) = _thm-env("定义", color.block-definition, title, body) diff --git a/packages/preview/modern-zuel-beamer/0.1.0/src/overlay.typ b/packages/preview/modern-zuel-beamer/0.1.0/src/overlay.typ new file mode 100644 index 0000000000..a498af2278 --- /dev/null +++ b/packages/preview/modern-zuel-beamer/0.1.0/src/overlay.typ @@ -0,0 +1,22 @@ +// ============================================================================ +// 分步显示 —— 直接复用 Polylux 0.4.0 的 logic 引擎 +// 我们只借它「同页按步重复渲染」的能力,外观全部自己画。 +// 0.4.0 没有 beamer 的 #pause;用下列函数表达「第几步出现」: +// uncover(2)[...] 第 2 步起出现(占位保留) +// only(3)[...] 仅第 3 步出现(不占位) +// uncover("2-")[...] 第 2 步起一直显示 +// one-by-one[A][B][C] A、B、C 逐步出现 +// item-by-item[列表] 列表项逐条出现 +// later[...] 比当前点更晚出现 +// ============================================================================ + +#import "@preview/polylux:0.4.0": ( + slide as _engine-slide, // 底层多子页渲染引擎,供 slide.typ 包装 + uncover, + only, + one-by-one, + item-by-item, + later, + alternatives, + enable-handout-mode, // 讲义模式:折叠所有分步,每页只出一次 +) diff --git a/packages/preview/modern-zuel-beamer/0.1.0/src/setup.typ b/packages/preview/modern-zuel-beamer/0.1.0/src/setup.typ new file mode 100644 index 0000000000..bdb6b90a48 --- /dev/null +++ b/packages/preview/modern-zuel-beamer/0.1.0/src/setup.typ @@ -0,0 +1,97 @@ +// ============================================================================ +// 全局装配 —— 相当于 beamer 的 documentclass +// 用法:#show: zuel-beamer.with(title: ..., author: ...) +// 负责:注入页面尺寸 / 字体 / 段落规则,并把文档信息存入 state 供封面、页脚读取。 +// ============================================================================ + +#import "theme.typ": color, font, size, layout +#import "overlay.typ": enable-handout-mode + +// --------------------------------------------------------------------------- +// 全局状态(供各页面组件读取) +// --------------------------------------------------------------------------- +#let doc-info = state("zuel-doc-info", (:)) // 标题/作者/导师等 +#let current-section = state("zuel-current-section", none) // 当前章节名 -> 页脚 +#let section-list = state("zuel-section-list", ()) // 全部章节名 -> 目录 +#let section-locs = state("zuel-section-locs", ()) // 各章节页位置 -> 页眉圆点跳转 +#let section-counter = counter("zuel-section") // 章节序号 + +// --------------------------------------------------------------------------- +// 封面默认资源(路径相对本文件 src/) +// 覆盖方式:zuel-beamer(logo: image("你的图.png", height: 2cm)) +// --------------------------------------------------------------------------- +#let logo-height = 1.4cm +#let default-logo = image("../asset/ZUELlogo.png", height: logo-height) +// 封面底部水印(极淡校园线描图);传 watermark: none 可关闭 +#let default-watermark = image("../asset/background.png", width: 100%) + +// --------------------------------------------------------------------------- +// 主装配函数 +// --------------------------------------------------------------------------- +#let zuel-beamer( + title: "演示文稿标题", + subtitle: none, + author: none, + supervisor: none, + major: none, + student-id: none, + school: none, + date: datetime.today(), + logo: default-logo, + watermark: default-watermark, // 封面底部水印,none 关闭 + handout: false, // true = 讲义模式:去掉分步动画,便于打印/导出讲义 + body, +) = { + // 讲义模式 + if handout { enable-handout-mode(true) } + + // 存文档信息 + doc-info.update(( + title: title, + subtitle: subtitle, + author: author, + supervisor: supervisor, + major: major, + student-id: student-id, + school: school, + date: date, + logo: logo, + watermark: watermark, + )) + + // 页面 + set page( + paper: "presentation-16-9", + margin: layout.margin, + fill: color.bg, + ) + + // 文本 + set text( + font: font.serif, + size: size.body, + fill: color.text, + lang: "zh", + region: "cn", + ) + set par(justify: true, leading: layout.leading, spacing: layout.par-spacing) + + // 列表 + set list(spacing: layout.list-spacing, marker: text(fill: color.primary, [▸])) + set enum(spacing: layout.list-spacing) + + // 图/表题注统一:图 N / 表 N,小字灰色 + set figure(numbering: "1") + show figure.where(kind: image): set figure(supplement: [图]) + show figure.where(kind: table): set figure(supplement: [表]) + show figure.caption: set text(size: size.small, fill: color.muted) + + // 标题统一用黑体 + show heading: set text(font: font.sans, fill: color.primary) + + // 强调色 + show strong: set text(fill: color.primary-dark) + show link: set text(fill: color.primary) + + body +} diff --git a/packages/preview/modern-zuel-beamer/0.1.0/src/slide.typ b/packages/preview/modern-zuel-beamer/0.1.0/src/slide.typ new file mode 100644 index 0000000000..50cb7619e8 --- /dev/null +++ b/packages/preview/modern-zuel-beamer/0.1.0/src/slide.typ @@ -0,0 +1,191 @@ +// ============================================================================ +// 页面组件 —— 封面 / 目录 / 章节分隔 / 内容 / 结束 +// 每个页面都包进 Polylux 的 _engine-slide,使分步显示生效。 +// ============================================================================ + +#import "theme.typ": color, font, size, layout +#import "setup.typ": doc-info, current-section, section-list, section-locs, section-counter +#import "overlay.typ": _engine-slide + +// --------------------------------------------------------------------------- +// 局部外观参数(置顶,勿写死进函数) +// --------------------------------------------------------------------------- +#let title-underline-gap = 0.35em // 内容页标题与下划线间距 +#let title-underline-len = 100% // 内容页下划线长度 +#let footer-gap = 4pt // 页脚横线与文字间距 +#let section-rule-len = 28% // 章节分隔页装饰线长度 +#let cover-rule-len = 24% // 封面装饰线长度 +#let cover-watermark-dy = 1.6em // 封面水印下沉量(贴近页底) +#let thanks-size = 40pt // 结束页「谢谢」字号 +#let toc-num-width = 1.8em // 目录序号列宽 +#let nav-dot-radius = 3.8pt // 页眉导航圆点半径 +#let nav-dot-gap = 0.55em // 圆点间距 +#let nav-below = 0.5em // 导航栏与标题间距 +#let nav-dot-dim = 58% // 非当前圆点的淡化程度(主色 lighten) + +// --------------------------------------------------------------------------- +// 工具:日期格式化 +// --------------------------------------------------------------------------- +#let _fmt-date(d) = if type(d) == datetime { + d.display("[year]年[month padding:none]月[day padding:none]日") +} else { d } + +// --------------------------------------------------------------------------- +// 内容页标题栏 +// --------------------------------------------------------------------------- +#let _frametitle(title) = block(width: 100%, below: 0.9em, { + text(font: font.sans, size: size.frametitle, weight: "bold", fill: color.primary, title) + v(title-underline-gap, weak: true) + line(length: title-underline-len, stroke: layout.rule-bold + color.gold) +}) + +// --------------------------------------------------------------------------- +// 页脚:左作者 · 中章节 · 右页码 +// --------------------------------------------------------------------------- +#let _footer() = context { + let info = doc-info.get() + let pg = counter(page).get().first() + let total = counter(page).final().first() + set text(size: size.footer, fill: color.muted, font: font.sans) + block(width: 100%, { + line(length: 100%, stroke: layout.rule-thin + color.gold) + v(footer-gap, weak: true) + grid( + columns: (1fr, auto, 1fr), + align: (left + horizon, center + horizon, right + horizon), + info.at("author", default: ""), + info.at("title", default: ""), // 中间固定显示封面标题 + [#pg / #total], + ) + }) +} + +// --------------------------------------------------------------------------- +// 页眉导航:每章一个圆点,当前章高亮,点击跳转到该章节页 +// --------------------------------------------------------------------------- +#let _nav() = context { + let secs = section-list.final() + if secs.len() > 0 { + let locs = section-locs.final() + let cur = section-counter.get().first() - 1 + let dots = secs.enumerate().map(((i, name)) => { + let dot = circle( + radius: nav-dot-radius, + fill: if i == cur { color.gold } else { color.primary.lighten(nav-dot-dim) }, + stroke: none, + ) + if i < locs.len() { link(locs.at(i), dot) } else { dot } + }) + block(width: 100%, below: nav-below, align(right, stack(dir: ltr, spacing: nav-dot-gap, ..dots))) + } +} + +// --------------------------------------------------------------------------- +// 内容页:#slide(title: "...")[ 正文,可含 uncover/one-by-one ] +// --------------------------------------------------------------------------- +#let slide(title: none, body) = _engine-slide({ + _nav() + if title != none { _frametitle(title) } + body + place(bottom + center, _footer()) +}) + +// --------------------------------------------------------------------------- +// 封面 +// --------------------------------------------------------------------------- +#let title-slide() = _engine-slide(context { + let info = doc-info.get() + // 底部水印(在内容之下) + if info.at("watermark", default: none) != none { + place(bottom + center, dy: cover-watermark-dy, info.watermark) + } + set align(center + horizon) + block(width: 100%, { + if info.at("logo", default: none) != none { + info.logo + v(0.6em) + } + text(font: font.sans, size: size.title, weight: "bold", fill: color.primary-dark, + info.at("title", default: "")) + if info.at("subtitle", default: none) != none { + v(0.35em) + text(font: font.sans, size: size.subtitle, fill: color.gold, info.subtitle) + } + v(0.7em) + line(length: cover-rule-len, stroke: layout.rule-bold + color.gold) + v(0.7em) + set text(size: size.small, fill: color.text) + // 个人信息:两列对齐表格(左列标签右对齐,右列内容左对齐) + let pairs = ( + ("研究生", info.at("author", default: none)), + ("学 号", info.at("student-id", default: none)), + ("指导教师", info.at("supervisor", default: none)), + ("专 业", info.at("major", default: none)), + ("学 院", info.at("school", default: none)), + ).filter(p => p.last() != none) + let cells = pairs.map(p => (text(fill: color.muted)[#p.first():], [#p.last()])).flatten() + align(center, grid( + columns: 2, + column-gutter: 0.6em, + row-gutter: 0.5em, + align: (right + horizon, left + horizon), + ..cells, + )) + v(0.6em) + text(fill: color.muted, _fmt-date(info.at("date", default: none))) + }) +}) + +// --------------------------------------------------------------------------- +// 目录(汇总所有 section) +// --------------------------------------------------------------------------- +#let outline-slide(title: "目 录") = _engine-slide(context { + _frametitle(title) + v(0.4em) + let secs = section-list.final() + set text(size: size.frametitle) + for (i, name) in secs.enumerate() { + block(below: 0.85em, { + box(width: toc-num-width, text(fill: color.gold, weight: "bold", font: font.sans, [#(i + 1).])) + text(fill: color.primary-dark, name) + }) + } +}) + +// --------------------------------------------------------------------------- +// 章节分隔页:#section("研究背景与意义") +// --------------------------------------------------------------------------- +#let section(name) = { + section-counter.step() + current-section.update(name) + section-list.update(l => l + (name,)) + _engine-slide(context { + let loc = here() // 在 context 内取位置,再存入 state(供页眉圆点跳转) + section-locs.update(a => a + (loc,)) + let n = section-counter.get().first() + set align(center + horizon) + block({ + text(font: font.sans, size: size.section-num, weight: "bold", fill: color.gold-light, [#n]) + v(0.1em) + text(font: font.sans, size: size.section, weight: "bold", fill: color.primary, name) + v(0.5em) + line(length: section-rule-len, stroke: layout.rule-bold + color.gold) + }) + }) +} + +// --------------------------------------------------------------------------- +// 结束页 +// --------------------------------------------------------------------------- +#let end-slide(message: "敬请各位老师批评指正!") = _engine-slide(context { + let info = doc-info.get() + set align(center + horizon) + block({ + text(font: font.sans, size: thanks-size, weight: "bold", fill: color.primary, [谢 谢!]) + v(0.6em) + text(size: size.frametitle, fill: color.gold, message) + v(1.2em) + set text(size: size.small, fill: color.muted) + [#info.at("author", default: "") #h(1em) #_fmt-date(info.at("date", default: none))] + }) +}) diff --git a/packages/preview/modern-zuel-beamer/0.1.0/src/theme.typ b/packages/preview/modern-zuel-beamer/0.1.0/src/theme.typ new file mode 100644 index 0000000000..ec38cb178e --- /dev/null +++ b/packages/preview/modern-zuel-beamer/0.1.0/src/theme.typ @@ -0,0 +1,66 @@ +// ============================================================================ +// 设计 token —— 全局外观的唯一来源 +// 改这里 = 改全局。所有颜色 / 字体 / 字号 / 间距集中在此,组件里不写死。 +// ============================================================================ + +// --------------------------------------------------------------------------- +// 配色 —— 蓝 + 金 端庄风 +// --------------------------------------------------------------------------- +#let color = ( + // 主色(深蓝,稳重) + primary: rgb(47, 85, 151), + primary-light: rgb(75, 115, 185), + primary-dark: rgb(30, 55, 100), + // 点缀(金,典雅) + gold: rgb(184, 134, 11), + gold-light: rgb(218, 165, 32), + // 中性 + text: rgb(51, 51, 51), // 正文(深灰,比纯黑柔和) + muted: rgb(120, 120, 120), // 次要文字 / 页脚 + gray-light: rgb(128, 128, 128), + gray-dark: rgb(64, 64, 64), + bg: white, // 页面底色 + // 莫兰迪块色(用于 5 种内容块) + block-note: rgb(100, 110, 125), // 通用 —— 莫兰迪蓝灰 + block-definition: rgb(160, 145, 130), // 定义 —— 莫兰迪米褐 + block-alert: rgb(145, 110, 100), // 警告 —— 莫兰迪红褐 + block-example: rgb(110, 130, 125), // 示例 —— 莫兰迪青绿 + block-theorem: rgb(125, 115, 130), // 定理 —— 莫兰迪紫灰 + block-highlight: rgb(170, 160, 140), // 重点 —— 莫兰迪黄褐 +) + +// --------------------------------------------------------------------------- +// 字体 —— 系统已装 Noto CJK +// --------------------------------------------------------------------------- +#let font = ( + sans: ("Noto Sans CJK SC",), // 黑体:标题 / 强调 + serif: ("Noto Serif CJK SC",), // 宋体:正文 + mono: ("Noto Sans Mono CJK SC",), // 等宽:代码 +) + +// --------------------------------------------------------------------------- +// 字号 —— 16:9 演示页偏大 +// --------------------------------------------------------------------------- +#let size = ( + title: 34pt, // 封面主标题 + subtitle: 18pt, // 封面副标题 + section: 30pt, // 章节分隔页标题 + section-num: 64pt, // 章节分隔页大号数字 + frametitle: 26pt, // 内容页标题 + body: 21pt, // 正文 + small: 16pt, // 小字 / 块标题 + footer: 12pt, // 页脚 +) + +// --------------------------------------------------------------------------- +// 间距 / 线条 +// --------------------------------------------------------------------------- +#let layout = ( + margin: (x: 2.2em, top: 2.0em, bottom: 1.6em), + leading: 0.85em, // 行距 + par-spacing: 1.1em, // 段距 + list-spacing: 0.9em, // 列表项间距 + rule-thin: 0.6pt, // 细线(页脚) + rule-bold: 1.4pt, // 粗线(标题下划线) + block-radius: 4pt, // 内容块圆角 +) diff --git a/packages/preview/modern-zuel-beamer/0.1.0/template/main.typ b/packages/preview/modern-zuel-beamer/0.1.0/template/main.typ new file mode 100644 index 0000000000..b2dc814b29 --- /dev/null +++ b/packages/preview/modern-zuel-beamer/0.1.0/template/main.typ @@ -0,0 +1,73 @@ +// ============================================================================ +// 开题答辩演示文稿 —— 由 modern-zuel-beamer 模板生成 +// 编译: typst compile main.typ +// 改下面文档信息与各页内容即可。完整用法见包内 README 与 example/。 +// ============================================================================ + +#import "@preview/modern-zuel-beamer:0.1.0": * +#import "@preview/cetz:0.4.0" as cetz + +#show: zuel-beamer.with( + title: "你的论文题目", + subtitle: "硕士学位论文开题报告", + author: "你的姓名", + student-id: "学号", + supervisor: "导师 教授", + major: "专业", + school: "学院", + date: datetime.today(), + // handout: true, // 讲义模式:去掉分步动画 +) + +#title-slide() +#outline-slide() + +// ───────────────────────────────────────────── +#section("研究背景与意义") + +#slide(title: "选题背景")[ + 研究背景第一点…… + + - 现有方法的问题一 + #uncover("2-")[- 问题二(第 2 步出现)] + + #uncover("2-")[ + #definition-block(title: "研究问题")[在此提出你的核心研究问题。] + ] +] + +// ───────────────────────────────────────────── +#section("研究方法与技术路线") + +#slide(title: "技术路线")[ + #align(center, cetz.canvas(length: 1cm, { + import cetz.draw: * + let stages = ("① 数据采集", "② 方法设计", "③ 实证分析", "④ 结论建议") + let (bw, bh, gap) = (6.4, 1.2, 0.5) + for (i, s) in stages.enumerate() { + let top = -i * (bh + gap) + rect((-bw / 2, top - bh), (bw / 2, top), + fill: color.primary.lighten(86%), stroke: 1pt + color.primary, radius: 0.12) + content((0, top - bh / 2), text(fill: color.primary-dark, weight: "bold", s)) + if i > 0 { + line((0, -(i - 1) * (bh + gap) - bh), (0, top), + mark: (end: ">", fill: color.gold), stroke: 1.4pt + color.gold) + } + } + })) +] + +#slide(title: "进度安排")[ + #set text(size: size.small) + #table( + columns: (auto, auto, 1fr), + inset: (x: 0.8em, y: 0.6em), + stroke: 0.5pt + color.gray-light, + table.header(..("阶段", "时间", "任务").map(h => + table.cell(fill: color.primary, text(fill: white, weight: "bold", h)))), + [第一阶段], [2026.07 – 2026.09], [文献调研与数据采集], + [第二阶段], [2026.10 – 2026.12], [方法实现与实验], + ) +] + +#end-slide() diff --git a/packages/preview/modern-zuel-beamer/0.1.0/thumbnail.png b/packages/preview/modern-zuel-beamer/0.1.0/thumbnail.png new file mode 100644 index 0000000000..cd50b5057d Binary files /dev/null and b/packages/preview/modern-zuel-beamer/0.1.0/thumbnail.png differ diff --git a/packages/preview/modern-zuel-beamer/0.1.0/typst.toml b/packages/preview/modern-zuel-beamer/0.1.0/typst.toml new file mode 100644 index 0000000000..b5e93ae2ef --- /dev/null +++ b/packages/preview/modern-zuel-beamer/0.1.0/typst.toml @@ -0,0 +1,18 @@ +[package] +name = "modern-zuel-beamer" +version = "0.1.0" +entrypoint = "lib.typ" +authors = ["hxy23"] +license = "MIT" +description = "中南财经政法大学风格的 Typst 演示文稿模板,面向论文答辩。" +keywords = ["presentation", "beamer", "slides", "zuel", "thesis"] +categories = ["presentation"] +repository = "https://github.com/hxy2321548628/modern-zuel-beamer" +compiler = "0.15.0" +# 不把编译产物 PDF 与开发用文件打进包 +exclude = ["*.pdf", "example/*.pdf", "CLAUDE.md", ".gitignore"] + +[template] +path = "template" +entrypoint = "main.typ" +thumbnail = "thumbnail.png"