我与 Typst 的 2024

很早之前就读过了 mgt 大佬的 我与 typst 的 2023, 觉得很酷, 于是决定自己也写一个. 不过当时是年初, 那时候我还只是一个普普通通的 Typst user, 没什么能说的出来的贡献. 时间一晃就到了现在, 我也总算是做了一点微薄的贡献, 可以拿出来说一说了.

2023-9 到 2024-2: 故事的开始

我大概就是这个时候知道 Typst 的. 那时候在几位前辈的努力下, Typst 的编写体验已经非常完美, 尤其是实时预览直接把写 Typst 的幸福度提高到把 LaTeX 甩到没影.

当时主要吸引我的就是他的数学公式语法, 不用一直 \{} 真的爽太多, 正好我需要一个写数学作业的软件, 于是就这样用上了 Typst.

说来也算是缘分吧, 最开始我只是把 Typst 拿来写数学作业, 又恰好是英文写, 所以我直接拿官网的默认模板就开写了. 也正是因为这样, 初期的各种中文问题我一点都没碰上, 因为调整排版也不多, 所以虽然不怎么懂其他方面的 Typst 用法, 也用了几个月.

2024-3 到 2024-6: 一个 Typst 信徒的诞生

这段时间我突然有了写实验报告的需求, 因为这个实验报告对格式的要求并不严格, 所以我就简单手搓了一个模板来写.

实验报告怎么也沾点学术排版的边了, 这下总算是把 Typst 里面各种东西怎么用, 什么地方有什么坑都搞了一遍. 虽然说官方文档还是没完整读过, 小蓝书也没完整看过, 但是总算是能用 Typst 正常排版了.

这段时间我逐渐变成 Typst 狂热粉丝, 在学校里见人就推销 Typst, 还把 Typst Introduction in One Page 改了一份印在了衣服上(不知道会不会侵权), 基本上天天穿着. 有次看到教室里的同学居然在安装 LaTeX, 马上向他安利, 并且亲手帮他把 LaTeX 卸载(现在想来真是太逆天了). 甚至英语课的 Poster Speech 都在安利 Typst.

我的狂热确实是有用的, 我恐怕是我小圈子里第一个开始用 Typst 的, 经过我这一年的软磨硬泡, 现在至少有五个人拜入 Typst 神教了.

2024-7 到 2024-8: Typst 公式 OCR, Typress

从这里开始总算对我狂热的社区有了一点贡献.

其实做 Typst 公式 OCR 的想法很早就有了. 我记得是 4 月, 本来打算做一个 Typst 的公式 OCR 当课程作业交, 但是当时的想法太简单了, 随手拿了个 pandoc 转了点 LaTeX 公式就开始训练. 最开始我只是想先试试水, 就拿了 GitHub 上星星比较多的 LaTeX-OCR 没改动就开始嗯训了, 但是最后结果毫无疑问是一大坨, 也就暂时放弃了这个想法.

但是我一直很想做, 于是在放暑假之后和 @sjfhsjfh 又重新开始了这个项目.

其实公式 OCR 已经没什么秘密了. HuggingFace 上 TrOCR 嗯造出效果很好的 LaTeX OCR 模型有三四个. 但是他们有数据, 而 Typst 没有.

所以我和 sjfhsjfh 兵分两路, 想先解决数据的问题.

eq_query_rec

我们首先想到的就是从真人手里拿数据. 但是当时大家普遍都有自己定义的小 snippets, 或者在使用各种第三方包(尤其是 physica), 我们不想让数据包含这些内容, 但是直接筛掉的话绝大多数数据都没有了, 所以写了这样的一个工具来提取公式.

得益于 Typst 的强大功能, sjfhsjfh 写了 eq_query_rec, 他可以编译 Typst 文档, 然后从里面查找出所有公式, 再根据公式编译好的内容重组出标准化后的公式(去除了第三方包, 用户自己的函数, 并同时完成公式形式的标准化).

这在初期帮了我们大忙. 我们最开始仅有的 8K 条数据全都是小圈子里几个 Typst user 用这个工具提取的.

tex2typ

Typst user 的数量太有限了, 而且大群(指 Typst 非官方中文交流群)的群友也不是很乐意搭理我的数据乞讨, 而另一边, LaTeX OCR 模型的训练数据量有 M 级别, 所以要解决数据问题最后还是要靠转的.

其实转公式的工具已经有很多了, 就我而言, 我至少知道四个工具能达成这个任务. 但是 pandoc 效果太烂, mitex 比较专注视觉效果一致, 公式本身不像人写的, 还包含很多他自己定义的函数, 其他的效果也很一般. 我真正想要的是转出来的公式不仅视觉效果要一样, 还得必须"像人写的", 尤其是"像 Typst 用户"写的.

所以最后我借用 KaTeX 的 parser 写了这个名字很豪的 tex2typ, 但是当时写的时候太急, 回过来味的时候发现已经写成史山了. 不过好在我们并不要求所有公式都能转, 毕竟是数据集, 大部分还在就 OK, 最终我们用这种方法获得了(疑似是)首个 100K 级别和 M 级别的 Typst 公式数据集.

Typress

我一直记得有一个群友抱怨 “没人想要抄写这一串东西(很长的公式)”, 所以当第一版效果还行的模型训练出来之后(大概是七月中), 我就去群里报喜了. 没想到最激动的是群主, 不知道我有没有辜负他的期待(.

Typress 发出来是七月底的事情了, 当时只配了一个 GPT 生成的简陋网页前端, 不过好在能用, 效果也还行.

在那之后就是慢慢改善模型对 mat, cases 之类长难句的识别以及写更好的前端, 修代码里的小 bug 了, 不过现在我手里还有一版对手写支持更好(比原本模型好太多)的权重没有发布, 或许等到寒假再优化一下再发?

2024-9 到 2024-10: tinymist-nightly

那时候的 Typst, 虽然开发还在积极推进, 但是已经有很久没发版了, v0.11.1 是五月中, 到九月已经足足有四个月, 这可是三分之一年.

当时群里有很多 Frequent asked questions, 比如 breakable equations, performance, layout issue 等等, 都是已经修了但还没发版的状态.

很多普通用户不会自己编译 Typst, 所以我最开始就想要不维护个 typst-nightly 的仓库, 写个定时的 action 自动发版. 但是我转念一想, 这样的帮助并不大: 我们使用的时候都是 tinymist 负责编译, 要是用到了新特性可能干脆就编译错误, 然后 preview 也不能正常更新, 或者预览效果和预期并不一致. 总不能看着旧版的 preview 写, 最后用 nightly 的 typst 来编译吧, 这完全没意义, 所以我就想干脆把 tinymist 适配到最新 Typst 算了.

其实我一开始以为就是改个依赖版本就好了, 没想到 Typst 在这几个月里面做了这么多 API 变动. 再加上这一套工具全都是群友科技, tinymist 依赖的 typst.ts, typstyle 也要一并修改, 所以我干脆就全都给适配到最新 Typst 了.

我把这个发到群里的时候, tinymist 作者纸夜大神提出可以做一个 typst-shim 包, 来减少 tinymist-nightly 和主线的摩擦, 然后我一个 Rust 小白就这样混上了 tinymist contributor. 后来纸夜大神又提出可以把一部分版本号给 tinymist-nightly, 然后我这个分支就成功转正, 进入了官方 tinymist 的仓库.

再后来, 我的名字也被加到了 MAINTAINERS.typ 里面, 虽然好久没干活了(心虚), 预计寒假再开始工作.

2024-11: Typress 的公式检测

当时手头各种工作告一段落, 就抽了点时间借用其他公式 OCR 软件的公式检测模型给 Typress 用. 同时也在前端支持了手动调整剪裁公式(虽然大部分代码都是 LLM 代劳). 现在使用 Typress 终于不需要截图时手动框选公式了.

2024-11 到 ∞: 我还在继续 Typst

其实这些工作是穿插在上面的时间线中的.

自从 Typst 有了官方论坛, 我就开始在上面疯狂答题, 目前也是成功收获 Guidance Counsellor 称号(贡献 Solutions 23个). 我想大概论坛的活跃用户都认识我这个 ID 了.

另外, 还用 Typst 搓了一堆小玩意, 但是都是小群内部偷偷用, 没有公开出来, 可能寒假会看看, 比如红头文件模板, p5 预告信之类的.

我的日常学习已经和 Typst 完全融合了, 这学期我所有有必要做笔记的科目都用 Typst 写了笔记(虽然大部分抄书). 另外, 还充分发挥了 https://typst.app 的多人编辑优势, 把 Typst 作为打比赛时团队管理的有效工具. 我多个科目的作业也都用 Typst 撰写.

希望明年的 Typst 和我继续变强!

留言评论

0条搜索结果。