Commit fe0851d

HPCesia <me@hpcesia.com>
2025-03-19 04:46:50
feat: 搭建基础架构
1 parent eb110d7
Changed files (5)
layouts/doc.typ
@@ -0,0 +1,28 @@
+// 文稿设置,可以进行一些像页面边距这类的全局设置
+#let doc(
+  // documentclass 传入参数
+  info: (:),
+  // 其他参数
+  fallback: false, // 字体缺失时使用 fallback,不显示豆腐块
+  lang: "zh", // 语言设置
+  margin: (x: 89pt), // 页面边距
+  it,
+) = {
+  // 1.  默认参数
+  info = ((title: ("基于 Typst 的", "厦门大学学位论文"), author: "张三") + info)
+
+  // 2.  对参数进行处理
+  // 2.1 如果是字符串,则使用换行符将标题分隔为列表
+  if type(info.title) == str {
+    info.title = info.title.split("\n")
+  }
+
+  // 3.  基本的样式设置
+  set text(fallback: fallback, lang: lang)
+  set page(margin: margin)
+
+  // 4.  PDF 元信息
+  set document(title: (("",) + info.title).sum(), author: info.author)
+
+  it
+}
layouts/preface.typ
@@ -0,0 +1,15 @@
+#let preface(
+  // documentclass 传入的参数
+  twoside: false,
+  // 其他参数
+  ..args,
+  it,
+) = {
+  // 分页
+  if twoside {
+    pagebreak() + " "
+  }
+  counter(page).update(0)
+  set page(numbering: "I")
+  it
+}
template/thesis.typ
@@ -0,0 +1,32 @@
+// #import "@preview/modern-xmu-thesis:0.0.1": documentclass // TODO: 上传至 Typst Universe 时取消本行注释
+#import "../lib.typ": documentclass // TODO: 上传至 Typst Universe 时删除本行
+
+#let (
+  // 布局函数
+  twoside,
+  doc,
+  preface,
+) = documentclass(
+  twoside: true, // 双面模式,会加入空白页,便于打印
+  info: (
+    title: ("基于 Typst 的", "厦门大学本科毕业论文模板"),
+    title-en: "An XMU Undergraduate Thesis Template\nPowered by Typst",
+    grade: "20XX",
+    student-id: "1234567890",
+    author: "张三",
+    author-en: "John Doe",
+    department: "某学院",
+    department-en: "School of XXX",
+    major: "某专业",
+    major-en: "XXX",
+    supervisor: ("李四", "教授"),
+    supervisor-en: "Professor My Supervisor",
+    // supervisor-outside: ("王五", "副教授"),
+    // supervisor-outside-en: "Professor My Supervisor",
+    submit-date: datetime.today(),
+  ),
+)
+
+#show: doc
+
+#show: preface
\ No newline at end of file
utils/style.typ
@@ -0,0 +1,63 @@
+// 取自 modern-nju-thesis
+
+#let 字号 = (
+  初号: 42pt,
+  小初: 36pt,
+  一号: 26pt,
+  小一: 24pt,
+  二号: 22pt,
+  小二: 18pt,
+  三号: 16pt,
+  小三: 15pt,
+  四号: 14pt,
+  中四: 13pt,
+  小四: 12pt,
+  五号: 10.5pt,
+  小五: 9pt,
+  六号: 7.5pt,
+  小六: 6.5pt,
+  七号: 5.5pt,
+  小七: 5pt,
+)
+
+#let 字体 = (
+  // 宋体,属于「有衬线字体」,一般可以等同于英文中的 Serif Font
+  // 这一行分别是「新罗马体(有衬线英文字体)」、「思源宋体(简体)」、「思源宋体」、「宋体(Windows)」、「宋体(MacOS)」
+  宋体: (
+    (name: "Times New Roman", covers: "latin-in-cjk"),
+    "Source Han Serif SC",
+    "Source Han Serif",
+    "Noto Serif CJK SC",
+    "SimSun",
+    "Songti SC",
+    "STSongti",
+  ),
+  // 黑体,属于「无衬线字体」,一般可以等同于英文中的 Sans Serif Font
+  // 这一行分别是「Arial(无衬线英文字体)」、「思源黑体(简体)」、「思源黑体」、「黑体(Windows)」、「黑体(MacOS)」
+  黑体: (
+    (name: "Arial", covers: "latin-in-cjk"),
+    "Source Han Sans SC",
+    "Source Han Sans",
+    "Noto Sans CJK SC",
+    "SimHei",
+    "Heiti SC",
+    "STHeiti",
+  ),
+  // 楷体
+  楷体: ((name: "Times New Roman", covers: "latin-in-cjk"), "KaiTi", "Kaiti SC", "STKaiti", "FZKai-Z03S"),
+  // 仿宋
+  仿宋: ((name: "Times New Roman", covers: "latin-in-cjk"), "FangSong", "FangSong SC", "STFangSong", "FZFangSong-Z02S"),
+  // 等宽字体,用于代码块环境,一般可以等同于英文中的 Monospaced Font
+  // 这一行分别是「Courier New(Windows 等宽英文字体)」、「思源等宽黑体(简体)」、「思源等宽黑体」、「黑体(Windows)」、「黑体(MacOS)」
+  等宽: (
+    (name: "Courier New", covers: "latin-in-cjk"),
+    (name: "Menlo", covers: "latin-in-cjk"),
+    (name: "IBM Plex Mono", covers: "latin-in-cjk"),
+    "Source Han Sans HW SC",
+    "Source Han Sans HW",
+    "Noto Sans Mono CJK SC",
+    "SimHei",
+    "Heiti SC",
+    "STHeiti",
+  ),
+)
lib.typ
@@ -0,0 +1,46 @@
+
+#import "layouts/doc.typ": doc
+#import "layouts/preface.typ": preface
+#import "utils/style.typ": 字体, 字号
+
+// 使用函数闭包特性,通过 `documentclass` 函数类进行全局信息配置,然后暴露出拥有了全局配置的、具体的 `layouts` 和 `templates` 内部函数。
+#let documentclass(
+  twoside: false, // 双面模式,会加入空白页,便于打印
+  fonts: (:), // 字体,应传入「宋体」、「黑体」、「楷体」、「仿宋」、「等宽」
+  info: (:),
+) = {
+  fonts = 字体 + fonts
+  info = (
+    title: ("基于 Typst 的", "厦门大学本科毕业论文模板"),
+    title-en: "An XMU Undergraduate Thesis Template\nPowered by Typst",
+    grade: "20XX",
+    student-id: "1234567890",
+    author: "张三",
+    author-en: "Zhang San",
+    department: "某学院",
+    department-en: "XX Department",
+    major: "某专业",
+    major-en: "XX Major",
+    field: "某方向",
+    field-en: "XX Field",
+    supervisor: ("李四", "教授"),
+    supervisor-en: "Professor Li Si",
+    supervisor-outside: (),
+    supervisor-outside-en: "",
+    submit-date: datetime.today(),
+  ) + info
+
+  return (
+    // 将传入参数再导出
+    twoside: twoside,
+    fonts: fonts,
+    info: info,
+    // 页面布局
+    doc: (..args) => {
+      doc(..args, info: info + args.named().at("info", default: (:)))
+    },
+    preface: (..args) => {
+      preface(twoside: twoside, ..args)
+    },
+  )
+}