Commit fe0851d
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)
+ },
+ )
+}