能否用 Typst 写 UESTC 毕业论文:可行性调查与踩坑记录
为什么想用 Typst
TL;DR
- 我不习惯 Word/WPS 的排版工作流
- 方便抽鞭子让 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 作为编译入口。有两种解决方案:
- 在 VS Code 中打开
main.typ - 打开命令面板 Cmd+Shift+P,执行
Tinymist: Pin the Main File to the Current - 完成
之后切换到 chapter1.typ 等任何子章节时,LSP 都会按照 main.typ 的整体上下文进行分析。如需取消固定,再次执行 Tinymist: Unpin the Main File 即可。
- 安装 tinymist 命令行工具:
brew install tinymist - 编译项目,生成
.lock文件:tinymist compile --save-lock main.typ --font-path ./uestc-thesis-template/fonts --root . - 在 VS Code 的
settings.json中添加:"tinymist.projectResolution": "lockDatabase"[2] - 完成
这个方案的好处是能让 Tinymist 根据编译历史自动识别入口文件;代价是 lockDatabase 仍是实验性功能,tinymist.lock 的格式也可能变化。如果只是临时写论文,手动 Pin main.typ 反而更稳。
优化编辑体验的 Tips
使用 VS Code Snippets,参见该文章。下面是我常用的一组 Typst Snippet:{ "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 格式,转换过程很顺利,但结果完全无法接受:
Opt 2. WPS
目前比较可行的方案是:在闲鱼购买一天的 WPS 超级会员。WPS 的 PDF 转 Word 效果尚可,目录和参考文献都能保留。但仍有几个问题需要注意:
- 文字通过 OCR 识别,可能存在错字。例如个人报告里的“范式”被误识别为“范怯”
- 英文字体可以正确映射为 Times New Roman,但中文字体在该用宋体的地方被替换为了苹方 SC,具体原因未深究
无论使用哪种转换方案,最后都要重新检查一遍这些位置:
- 目录层级和页码
- 页眉、页脚和页码格式
- 图、表、公式编号
- 参考文献编号和格式
- 中文字体、英文字体和字号
- OCR 误识别造成的错字
所以 PDF 转 DOCX 更像是兜底方案,而不是完整工作流。它能解决“必须上传 DOCX”的格式问题,但不能保证转换后的文档仍然满足论文模板的所有细节要求。
原文要求:“请在指导教师指导下,撰写毕业论文(参照《本科毕业设计(论文)工作手册,二〇二四年十月》),论文普查评分标准见《毕业设计检查表》(附件 4)。特别说明:论文要用WORD格式(注:知网和论无忧推荐),论文正文字数至少 2 万字以上,论文摘要 300-500 字,参考文献至少 15 篇以上,翻译外文文献中文字数至少 1500 字以上。” ——关于2021级本科生毕业设计(论文)答辩工作的通知-电子科技大学信息与软件工程学院 ↩︎


评论