main
1#import "@preview/modern-xmu-thesis:0.2.2": documentclass
2
3#let (
4 // 布局函数
5 twoside,
6 doc,
7 preface,
8 mainmatter,
9 appendix,
10 // 页面函数
11 cover,
12 integrity,
13 acknowledgement,
14 abstract,
15 abstract-en,
16 outline-page,
17 outline-page-en,
18 bilingual-bibliography,
19) = documentclass(
20 twoside: true, // 双面模式,会加入空白页,便于打印
21 info: (
22 title: ("基于 Typst 的", "厦门大学本科毕业论文模板"),
23 title-en: "An XMU Undergraduate Thesis Template\nPowered by Typst",
24 grade: "20XX",
25 student-id: "1234567890",
26 author: "张三",
27 department: "某学院",
28 major: "某专业",
29 supervisor: ("李四", "教授"),
30 // supervisor-outside: ("王五", "副教授"),
31 submit-date: datetime.today(),
32 ),
33)
34
35#show: doc
36
37// 封面页
38#cover()
39
40// 诚信承诺书
41#integrity()
42
43// ====== 前言 ======
44#show: preface
45
46
47// 致谢
48#acknowledgement()[
49 致谢语应以简短的文字对课题研究与论文撰写过程中曾直接给予帮助的人员(例如指导教师、答疑教师及其他人员)表示自己的谢意。如果本模板对你有所帮助,你也可以将其作为致谢的一部分。
50
51 /// 蓝色的超链接,一般文章中不需要用到,可以直接删掉。
52 #let hyperlink(dest, body) = link(
53 dest,
54 text(
55 fill: blue,
56 box(stroke: (bottom: 0.5pt + blue), outset: (bottom: 0.175em), body),
57 ),
58 )
59
60 感谢 #hyperlink("https://qm.qq.com/q/NAtT7gF5ys", [Typst 非官方中文交流群])的群友们在作者编写本模板时提供的帮助,让我在编写模板时少走了很多弯路。
61]
62
63// 中文摘要
64#abstract(
65 keywords: ("本科毕业论文", "厦门大学", "Typst"),
66 // outlined: true,
67 // outline-title: "中文摘要",
68 // outline-title-en: "Abstract (Chinese Ver.)",
69)[
70 // 导入 LaTeX 图标。如果你不需要,可以直接删掉。
71 #import "@preview/metalogo:1.2.0": LaTeX
72
73 本模板参考#link("https://github.com/nju-lug/modern-nju-thesis")[南京大学学位论文模板 modern-nju-thesis]与#link("https://github.com/F5Soft/xmu-template")[厦门大学本科毕业论文 #LaTeX 模版],并根据《厦门大学本科毕业论文(设计)规范》@XMUThesisStandard 进行制作。
74
75 本模版提供高清封面、诚信承诺书、中英文摘要环境、中英文目录自动生成、附录环境、参考文献环境、致谢环境等。本模板通过 Typst
76 字体 fallback 功能,适配了 Windows 和 macOS 系统的字体,将以思源黑体/宋体、Windows 自带黑体/宋体、macOS
77 自带黑体/宋体的优先级使用编译环境中存在的字体。
78
79 建议使用前先完整浏览本模板中的所有内容,以完整地了解使用模板的方法与 Typst 的基础用法。
80]
81
82// 英文摘要
83
84#abstract-en(
85 keywords: ("Undergraduate Thesis", "Xiamen University", "Typst"),
86 // outlined: true,
87 // outline-title: "英文摘要",
88 // outline-title-en: "Abstract (English Ver.)",
89)[
90 // 导入 LaTeX 图标
91 #import "@preview/metalogo:1.2.0": LaTeX
92
93 This template is based on #link("https://github.com/nju-lug/modern-nju-thesis")[modern-nju-thesis] template and #link("https://github.com/F5Soft/xmu-template")[Xiamen University Undergraduate Thesis #LaTeX Template], and is created according to the _Xiamen University Undergraduate Dissertation (Design) Specification_@XMUThesisStandard.
94
95 This template provides high-resolution cover, integrity commitment letter, Chinese and English abstract environments, automatic generation of Chinese and English tables of contents, appendix environment, reference environment, acknowledgment environment, etc. Through Typst's font fallback feature, this template adapts fonts for Windows and macOS systems, using Source Han Sans/Serif, Windows built-in Sans/Serif, and macOS built-in Sans/Serif fonts in order of priority based on what fonts are available in the compilation environment.
96
97 It is recommended to fully browse all the content in this template before use to fully understand how to use the template and the basic usage of Typst.
98]
99
100// 中文目录页
101#outline-page()
102
103// 英文目录页
104// 此处可以传入 `entry-numbering` 参数,用于设置英文版目录中,各级标题的前缀
105#outline-page-en()
106
107// ====== 正文部分 ======
108#show: mainmatter
109
110// 所有标题都应该满足如下的格式
111// =...= 中文#metadata((en: "英文标题"))
112= 使用说明#metadata((en: "Introduction"))
113
114== 环境配置#metadata((en: "Environment Setup"))
115
116首先,需要配置好 Typst 环境,这里推荐使用 Web APP#footnote[https://typst.app/ ,中国大陆地区可以正常访问。] 在线编辑或 VSCode + Tinymist 插件本地编辑。
117
118=== 在线编辑#metadata((en: "Editing Online"))
119
120Web App 有些类似于 Overleaf,提供了在线编辑和编译的功能,适合不想在本地安装 VSCode 的用户。但是 Web App 并没有安装本地 Windows 或 MacOS 所拥有的字体,所以字体上可能存在差异,需要自行手动上传用到的字体。并且 Web App 是全英文页面,因此更推荐本地编辑。
121
122只需在 Web App 中选择 「Start from template」,在弹出窗口中选择「modern-xmu-thesis」,即可在线创建模板并使用。
123
124=== 本地编辑#metadata((en: "Editing Locally"))
125
126VSCode + Tinymist 需要先在官网#footnote[https://code.visualstudio.com/download]上下载安装 VSCode,随后在右侧的「扩展/Extension」中搜索 Tinymist 进行安装。
127
128在 VSCode 中按下「Ctrl + Shift + P」打开命令界面,输入「Typst: Show available Typst templates (gallery) for picking up a template」打开 Tinymist 提供的模板列表,然后从里面找到 modern-xmu-thesis,点击「+」号即可创建对应的论文模板。
129
130最后用 VS Code 打开生成的目录,打开 thesis.typ 文件,并按下「Ctrl + K, V」进行实时编辑和预览。
131
132== 编译#metadata((en: "Compiling"))
133
134在 Web App 中,编辑完毕后,点击左上角的「File」按钮,选择「Export」中的「PDF」,即可下载编译得到的 PDF 文件。
135
136在 VSCode 中,编辑完毕后,按下「Ctrl + Shift + P」打开命令界面,输入「Typst: Export the Opened File as PDF」,即可导出编译得到的 PDF 文件。
137
138== 使用模板#metadata((en: "Using the Template"))
139
140本模版根据《厦门大学本科毕业论文(设计)规范》@XMUThesisStandard 制作,使用时无需考虑各种格式指令,只需设置好章节标题,填充摘要、附录、参考文献、致谢等内容即可。
141
142如果需要自定义部分样式,目前需要阅读源码中的注释来对一些函数传入的参数进行修改。如果有一定 Typst 基础,也可以 Fork 本模板的仓库,进行本地修改和编译。
143
144= 使用示例#metadata((en: "Usage Examples"))
145
146== 二级标题#metadata((en: "Section (English Ver.)"))
147
148一级标题(章)总会另起一页。
149
150=== 三级标题#metadata((en: "Subsection (English Ver.)"))
151
152#import "@preview/zebraw:0.6.3": zebraw // 导入代码块美化包
153
154使用@lst:创建各级标题 来创建带英文元数据的各级标题。
155
156#figure(
157 zebraw(lang: false)[
158 ```typst
159 = 一级标题#metadata((en: "Chapter"))
160 == 二级标题#metadata((en: "Section"))
161 === 三级标题#metadata((en: "Subsection"))
162 ```
163 ],
164 kind: raw,
165 caption: [创建各级标题],
166) <创建各级标题>
167
168==== 四级标题#metadata((en: "Subsubsection (English Ver.)"))
169
170《厦门大学本科毕业论文(设计)规范》中要求一般不使用四级标题,因此如果未设置 `outline-page` 中的 depth 参数,四级标题将不会显示在目录中。
171
172== 列表#metadata((en: "List"))
173
174=== 有序列表#metadata((en: "Ordered List"))
175
176+ 有序列表项一
177+ 有序列表项二
178 + 有序子列表项一
179 + 有序子列表项二
180
181=== 无序列表#metadata((en: "Unordered List"))
182
183- 无序列表项一
184- 无序列表项二
185 - 无序子列表项一
186 - 无序子列表项二
187
188=== 术语列表#metadata((en: "Glossary List"))
189
190/ 术语一: 术语解释
191/ 术语二: 术语解释
192
193== 图表#metadata((en: "Figures and Tables"))
194
195引用@tbl:timing,引用@tbl:timing-tlt,以及@fig:xmu-logo。引用图表时,表格和图片分别需要加上 `tbl:`和`fig:` 前缀才能正常显示编号。
196
197#align(
198 center,
199 (
200 stack(dir: ltr)[
201 #figure(
202 table(
203 align: center + horizon,
204 columns: 4,
205 [t], [1], [2], [3],
206 [y], [0.3s], [0.4s], [0.8s],
207 ),
208 caption: [常规表#footnote[《厦门大学本科毕业论文(设计)规范》中要求表格应优先采用三线表]],
209 ) <timing>
210 ][
211 #h(50pt)
212 ][
213 #figure(
214 table(
215 columns: 4,
216 stroke: none,
217 table.hline(stroke: 1pt),
218 [t], [1], [2], [3],
219 table.hline(stroke: .75pt),
220 [y], [0.3s], [0.4s], [0.8s],
221 table.hline(stroke: 1pt),
222 ),
223 caption: [三线表],
224 ) <timing-tlt>
225 ]
226 ),
227)
228
229#figure(
230 image("images/xmu-logo.svg", width: 20%),
231 caption: [厦门大学校徽],
232) <xmu-logo>
233
234=== 数学绘图#metadata((en: "Plotting"))
235
236一般而言,建议将绘图部分放在 Python 或 MATLAB 或其他软件中进行,在论文中使用其导出的图像。Typst 也有一些合适的包用于绘图,例如较老的「cetz-plot#footnote[https://typst.app/universe/package/cetz-plot]」与较新的「lilaq#footnote[https://typst.app/universe/package/lilaq]」包。此处用 lilaq 包进行简单的绘图演示。
237
238#figure(
239 {
240 import "@preview/lilaq:0.3.0" as lq
241 let x = lq.linspace(0, 10)
242 lq.diagram(
243 title: [$sin x$ 的函数图像],
244 xlabel: $x$,
245 ylabel: $y$,
246
247 lq.plot(x, x.map(x => calc.sin(x))),
248 )
249 },
250 caption: [数学绘图示例],
251)
252
253=== 画图#metadata((en: "Drawing"))
254
255对于复杂的图形,建议使用「所见即所得」式的绘图工具绘制图形并导入到论文中。Typst 有一些用于画图的包,最基础的是「cetz#footnote[https://typst.app/universe/package/cetz]」,类似于 LaTeX 中的 tikz 包;此外还有专注于流程图绘制的「fletcher#footnote[https://typst.app/universe/package/fletcher]」包。此处用 fletcher 包进行简单的画图演示。
256
257#figure(
258 {
259 import "@preview/fletcher:0.5.8": diagram, edge, node
260 diagram(
261 cell-size: 15mm,
262 $
263 G edge(f, ->) edge("d", pi, ->>) & im(f) \
264 G slash ker(f) edge("ur", tilde(f), "hook-->")
265 $,
266 )
267 },
268 caption: [流程图示例],
269)
270
271== 公式#metadata((en: "Formulas"))
272
273可以像 Markdown 一样写行内公式 $x + y$,以及带编号的行间公式:
274
275$ phi.alt := (1 + sqrt(5)) / 2. $ <ratio>
276
277#h(-2em) 引用数学公式需要加上 `eqt:` 前缀,则由@eqt:ratio,我们有:
278
279$ F_n = floor(1 / sqrt(5) phi.alt^n). $
280
281#h(-2em) 我们也可以通过 `<->` 标签来标识该行间公式不需要编号
282
283$ y = integral_1^2 x^2 dif x, $ <->
284
285#h(-2em) 而后续数学公式仍然能正常编号:
286
287$ F_n = floor(1 / sqrt(5) phi.alt^n). $
288
289比较不幸的是,由于 Typst 的排版结构问题,如果你不想在行间公式后新起一段,你需要手动在行间公式的后一行开头添加负缩进。你也可以使用目前#footnote[指 2025 年 5 月 17 日]尚不完善且未正式发布的改进版 indenta 包#footnote[https://github.com/ParaN3xus/typst-snippets/tree/main/indenta]来实现如下的效果:
290
291#zebraw(lang: false)[
292 ```typst
293 $ sin^2 x + cos^2 x = 1 $
294 这段不会首行缩进。
295
296 $ sin^2 x + cos^2 x = 1 $
297
298 与上面的行间公式间有空行,这段会首行缩进。
299 ```
300]
301
302== 代码与伪代码#metadata((en: "Codes and Pseudocodes"))
303
304如果只是简单地展示代码,只需要使用 「\`\`\`」将代码进行包裹即可,这与 Markdown 的语法一致。Typst 的代码块支持语法高亮,就像@lst:code 一样。引用时需要加上 `lst:` 前缀。如果需要对代码块进行一定美化,就像@lst:创建各级标题 一样,则可以使用「zebraw#footnote[https://typst.app/universe/package/zebraw]」包进行美化。
305
306#figure(
307 ```py
308 def add(x, y):
309 return x + y
310 ```,
311 caption: [代码块示例],
312) <code>
313
314对于展示算法使用的伪代码,可以使用「lovelace#footnote[https://typst.app/universe/package/lovelace]」包绘制。
315
316#figure(
317 kind: "algorithm",
318 supplement: [算法],
319 {
320 import "@preview/lovelace:0.3.0": *
321 pseudocode-list(booktabs: true)[
322 - *Function* DFS(G, $v$)
323 - Input: 图 G = (V, E) 和起始顶点 $v$
324 - Output: 图 G 的深度优先遍历序列
325 + 标记顶点 $v$ 为已访问
326 + 将 $v$ 加入遍历序列
327 + *for* *each* 顶点 $w in$ Adj[$v$] *do*
328 + *if* $w$ 未被访问 *then*
329 + 递归调用 DFS(G, $w$)
330 + *end* *if*
331 + *end* *for*
332 ]
333 },
334 caption: [伪代码示例],
335)
336
337== 参考文献#metadata((en: "References"))
338
339参考文献使用 BibTeX 格式的 .bib 文件,根据规范使用 GB/T 7714-2005《文后参考文献著录规则》进行编排。
340
341你可以像引用其他标签一样引用参考文献,例如`@Madje_Typst`@Madje_Typst。
342
343// ====== 附录 ======
344// 手动分页
345#if twoside {
346 set page(header: none, footer: none)
347 pagebreak(weak: true, to: "odd")
348}
349
350// 参考文献
351// 默认使用 gb-7714-2005-numeric 样式
352#bilingual-bibliography(bibliography: bibliography.with("ref.bib"))
353
354// 手动分页
355#if twoside {
356 set page(header: none, footer: none)
357 pagebreak(weak: true, to: "odd")
358}
359
360#show: appendix
361
362= 附录#metadata((en: "Appendix"))
363
364== 附表#metadata((en: "Tables"))
365
366这里放一些附录的内容,例如表格或其他说明。如@tbl:appendix-table。制作模板时间精力有限,因此附录不会自动编号。如需编号为「附录 A」,请手动添加。
367
368#figure(
369 table(
370 columns: 4,
371 stroke: none,
372 table.hline(stroke: 1pt),
373 [t], [1], [2], [3],
374 table.hline(stroke: .75pt),
375 [y], [0.3s], [0.4s], [0.8s],
376 table.hline(stroke: 1pt),
377 ),
378 caption: [附录表格示例],
379) <appendix-table>
380
381附录中图表和公式编号均以大写字母开头,区别于正文部分的编号。
382
383$
384 1 / pi = (2 sqrt(2)) / (99^2) sum_(k=0)^oo ((4k)!) / (k!^4) (26390k + 1103) / (396^(4k))
385$
386
387== 厦门大学本科毕业论文(设计)规范摘要#metadata((en: "Abstract of Xiamen University Undergraduate Dissertation (Design) Specification"))
388
389- 毕业论文(设计)一般包括:前置部分、正文、参考文献、附录 4 个部分。
390
391- 题目应简洁、明确、有概括性,避免使用不常见的缩略词、缩写字。中文题目一般不宜超过 20 个字,必要时可增加副标题。英文题目应与中文题目内容相同。
392
393- 主修专业毕业论文(设计)封面使用 160g 白色双胶纸,辅修封面为 160g 浅黄色皮纹纸。内页均为 A4 规格 80g 双胶纸。
394
395- 章的标题占2行,标题以外的文字为1.5倍行距。
396
397- 上边距和左边距应留 25mm 以上间隙,下边距和右边距应分别留 20mm 以上间隙。
398
399- 每页须加“页眉”和“页码”。奇数页页眉内容为当前章名,如“第一章 绪论”。偶数页页眉内容为论文题目。学位论文的页码,正文、参考文献、附录部分用阿拉伯数字连续编码并居中,前置部分用罗马数字单独连续编码居中(封面除外)。
400
401- 封面中文标题:二号黑体
402
403- 封面英文标题:三号 Times New Roman 加粗
404
405- 中文摘要标题:小三号黑体
406
407- 中文关键词标题:小四号黑体
408
409- 中文摘要、关键词内容:小四号宋体
410
411- 英文摘要标题:小三号 Times New Roman 加粗
412
413- 英文关键词标题:小四号 Times New Roman 加粗
414
415- 英文摘要、关键词内容:小四号 Times New Roman
416
417- 中文目录标题:小三号黑体
418
419- 中文目录中章的标题:四号黑体
420
421- 中文目录中节的标题:小四号黑体
422
423- 中文目录中三级标题:小四号宋体
424
425- 英文目录标题:小三号 Times New Roman 加粗
426
427- 英文目录中章的标题:四号 Times New Roman 加粗
428
429- 英文目录中节的标题:小四号 Times New Roman 加粗
430
431- 英文目录中三级标题:小四号 Times New Roman
432
433- 章的标题:小三号黑体
434
435- 节的标题:四号黑体
436
437- 三级标题:小四号黑体
438
439- 正文:小四号宋体
440
441- 页眉:小五号宋体
442
443- 页码:小五号 Times New Roman
444
445- 注释内容:小五号宋体
446
447- 表格、图的标题、单位、表头:五号宋体加粗
448
449- 表格内容:五号宋体
450
451- 表格、图的资料来源:小五号宋体
452
453- 参考文献标题:小三号黑体
454
455- 中文参考文献表:五号宋体
456
457- 英文参考文献表:五号 Times New Roman
458
459- 附录标题:小三号黑体
460
461- 致谢标题:小三号黑体
462
463- 致谢内容:小四号宋体
464
465对于中英文混杂的内容,中文的字体若是用宋体,英文的字体则采用 Times New Roman;中文的字体若是黑体,英文的字体则采用 Arial。