能否用 Typst 写 UESTC 毕业论文:可行性调查与踩坑记录

写毕业论文时,我不想再用 Word 排版了。Typst 看起来是个优雅的替代方案。本文记录我对提交要求的核实、模板的使用、VS Code 的配置,以及 PDF 转 DOCX 的踩坑过程。

为什么想用 Typst

TL;DR

  1. 我不习惯 Word/WPS 的排版工作流
  2. 方便抽鞭子让 AI 干活呗

The Frustrations of Formatting in Word/WPS

毕设等稍带严肃的论文,往往都有严格的格式要求。我并不排斥排版,它本身是一个带来熵减的愉悦过程,我也在这个博客的主题上花了不少时间打磨排版。

不过,作为一个还算年轻的程序员,接触了 Ruff、Biome 这类新生代格式化工具之后,很快就习惯了自动化带来的便捷。

所谓由奢入俭难,我相信,再晚几年出生的程序员,如果有一天要手动在操作符两边加空格、手动删除行尾空格,大概也会觉得痛苦。

Word 和 WPS 的用户体验比这更让人难受。Word 至今不支持多标签页,修改页眉页脚时几乎没有任何直观的反馈,经常牵一发而动全身;标题、图表和参考文献的编号,也常常沦为打断写作流的“体力活”。

The Advantage of Markdown/Typst

早期写作时我用的也不是 Typst,而是 Markdown。它们共同的优势在于版本控制,以及更方便的 LLM 集成。LLM 带来的便捷已经属于“伟大,无需多言”了;版本控制则见仁见智,但它至少能减少“电脑关机但 DOCX 没保存”这种 case。

随着写作需求的变化,我逐渐转向了 Typst。与 Markdown 相似,Typst 是一款现代化的排版工具,但它提供了更灵活的排版控制。比如,Markdown 中的表格功能就显得较为单一,不能合并单元格。

而 Typst 不仅能够处理这种排版需求,而且社区里有相对成熟的模板,把页眉页脚、图表编号、引用文献等工作都自动化了。Markdown 可以做到大致的功能,但它的语法有限,不能包揽论文写作的所有场景。

Typst 本身的语法也比较简洁,入门成本低。这对于程序员尤其友好,因为你不再需要跳转到复杂的菜单或选项框中去修改格式,所有内容和排版都可以通过标记语法来实现。当然,真正拿它写毕业论文时,仍然需要理解模板结构、字体路径和编译入口这些工程细节。

能用吗 🤷🏻‍♂️

能否使用 Typst,本质上不是技术问题,而是政策问题,取决于你的学院是否接受 PDF 格式的毕业论文。这里只讨论软件学院的实际情况。

我尝试让 Grok 查询软院今年是否接受 PDF 提交,它 fetch 到了正确的网页[1],给出的总结却是“可以只交 PDF”。但去年的通知实际要求是 WORD 格式。这个例子提醒我:LLM 可以代替搜索引擎做初筛,但最终还是要回到原文核对。

历史上,软院对非 Word 格式并不友好。曾有学长为争取使用 LATEX,从行政老师找到院长,最终被告知支持新格式涉及大量后台工作(如查重系统适配),此事不了了之。这种先例让人对 Typst 的可行性本能地保持怀疑。

今年的情况出现了松动,但不能简单理解成“学院一定接受任意环节只交 PDF”。软院通知要求论文先通过论无忧格式检查,再提交到本科毕业设计(论文)管理系统完成知网查重。论无忧在功能介绍页面中明确说明支持 PDF;管理系统也支持 PDF,支持更推荐 docx

尽管如此,提交 docx 依然是最稳妥的选择。如果决定尝试 Typst,Use at your own risk.

怎么用 📝

以 macOS 为例,通过 Homebrew 安装 Typst:

# 安装 typst,用于将 .typ 文件编译为 .pdfbrew install typst

安装完成后,下载示例项目并编译。这里使用的是 qujihan/uestc-typst-thesis-example,其中通过 submodule 引入了 uestc-typst/thesis-template

git clone https://github.com/qujihan/uestc-typst-thesis-example.git thesiscd thesisgit submodule update --init --recursivemake build

这会生成一个名为 学位论文写作指南及例子.pdf 的文件。如文件名所示,你可以通过这份 PDF 快速入门 Typst 的论文写作规范。

Use with VS Code

首先在 VS Code 中搜索并安装 myriad-dreamin.tinymist 插件,以获得实时预览支持。

可能遇到的问题

但在实际使用中,当你编辑 /src/chapter1.typ 时,Tinymist LSP 可能会报错:label <garrett2005ajax> does not exist in the document

原因是 Tinymist LSP 默认将当前打开的单文件视为根文档进行编译。而参考文献(bibliography)的导入操作实际上是在 main.typ 中完成的,chapter1.typ 只是被引入的子文件。

因此,我们需要让 Tinymist 始终以 main.typ 作为编译入口。有两种解决方案:

  1. 在 VS Code 中打开 main.typ
  2. 打开命令面板 Cmd+Shift+P,执行 Tinymist: Pin the Main File to the Current
  3. 完成

之后切换到 chapter1.typ 等任何子章节时,LSP 都会按照 main.typ 的整体上下文进行分析。如需取消固定,再次执行 Tinymist: Unpin the Main File 即可。

  1. 安装 tinymist 命令行工具:brew install tinymist
  2. 编译项目,生成 .lock 文件:tinymist compile --save-lock main.typ --font-path ./uestc-thesis-template/fonts --root .
  3. 在 VS Code 的 settings.json 中添加:"tinymist.projectResolution": "lockDatabase" [2]
  4. 完成

这个方案的好处是能让 Tinymist 根据编译历史自动识别入口文件;代价是 lockDatabase 仍是实验性功能,tinymist.lock 的格式也可能变化。如果只是临时写论文,手动 Pin main.typ 反而更稳。

优化编辑体验的 Tips

使用 VS Code Snippets,参见该文章。下面是我常用的一组 Typst Snippet:

.vscode/typst.code-snippets
{  "Typst Heading 1": {    "prefix": "h1",    "body": [      "= ${1:Heading 1}",      "$0"    ],    "description": "Insert a Typst level 1 heading."  },  "Typst Heading 2": {    "prefix": "h2",    "body": [      "== ${1:Heading 2}",      "$0"    ],    "description": "Insert a Typst level 2 heading."  },  "Typst Heading 3": {    "prefix": "h3",    "body": [      "=== ${1:Heading 3}",      "$0"    ],    "description": "Insert a Typst level 3 heading."  },  "Typst Heading 4": {    "prefix": "h4",    "body": [      "==== ${1:Heading 4}",      "$0"    ],    "description": "Insert a Typst level 4 heading."  }}

万一要交 DOCX 文件呢 😈

如果最终确实需要提交 docx 文件,那我是没招了,可以参考 Typst 中文社区总结的几种转换方案

Opt 1. Microsoft Word

我恰好订阅了 Microsoft Office 365,打算在毕业前让它再发挥一点作用。直接用 Microsoft Word 打开 PDF,会自动将其另存为 docx 格式,转换过程很顺利,但结果完全无法接受:

Microsoft Word's pdf to docx converter
Microsoft Word's pdf to docx converter

Opt 2. WPS

目前比较可行的方案是:在闲鱼购买一天的 WPS 超级会员。WPS 的 PDF 转 Word 效果尚可,目录和参考文献都能保留。但仍有几个问题需要注意:

  • 文字通过 OCR 识别,可能存在错字。例如个人报告里的“范式”被误识别为“范怯”
  • 英文字体可以正确映射为 Times New Roman,但中文字体在该用宋体的地方被替换为了苹方 SC,具体原因未深究

WPS Convert to docx
WPS Convert to docx

无论使用哪种转换方案,最后都要重新检查一遍这些位置:

  • 目录层级和页码
  • 页眉、页脚和页码格式
  • 图、表、公式编号
  • 参考文献编号和格式
  • 中文字体、英文字体和字号
  • OCR 误识别造成的错字

所以 PDF 转 DOCX 更像是兜底方案,而不是完整工作流。它能解决“必须上传 DOCX”的格式问题,但不能保证转换后的文档仍然满足论文模板的所有细节要求。


  1. 原文要求:“请在指导教师指导下,撰写毕业论文(参照《本科毕业设计(论文)工作手册,二〇二四年十月》),论文普查评分标准见《毕业设计检查表》(附件 4)。特别说明:论文要用WORD格式(注:知网和论无忧推荐),论文正文字数至少 2 万字以上,论文摘要 300-500 字,参考文献至少 15 篇以上,翻译外文文献中文字数至少 1500 字以上。” ——关于2021级本科生毕业设计(论文)答辩工作的通知-电子科技大学信息与软件工程学院 ↩︎

  2. Project Model - Tinymist Docs ↩︎

显示设置

紧凑舒展
标准1.70

评论