在一台已经服役 13.5年 的老旧 PC 上,把一部4万词、120页的中篇小说从纯文本编译成排版精致的 A5 尺寸 PDF,只需要 1.6秒。德国开发者 movq 在2026年10月用行动证明,扔掉动辄占用几个 G 内存的现代编辑器,回到四十多年前的 Unix 传统排版工具 groff,写小说的反馈循环可以快到接近直觉。
他用这套工具链写完了两部不打算公开发表的中篇小说:第一部约1.5万词、50页,耗时超七个月,编译耗时 700毫秒;第二部约4万词、120页,写作只花了 10天。如果你受够了现代排版软件的卡顿,这套方案在编译速度和底层控制力上几乎是降维打击;但如果你指望它像现代软件那样自动处理好所有版面细节,它简陋的底层机制会让你在页眉页脚和断行上交足学费。
3个宏与页面触发器:极简背后的手工代价
groff 是 GNU 版本的 troff,大多数程序员只在 Linux 终端翻看手册页(man pages)时见过它,但早年的计算机圣经《C程序设计语言》和《UNIX环境高级编程》全是用这套系统排出来的真书。小说排版不需要复杂的图表、代码高亮或交叉引用,movq 索性连现成的宏包都没用,自己手写了 3个基础宏:.SH 负责章节标题,.PP 负责德语书籍惯用的首行缩进段落,.LP 负责时间线跳跃时的段落空行。
真正暴露 groff 老派底色的是它的分页控制。它默认连页码都没有,直接改 A5 纸张尺寸还会导致页面最后一行文字掉出纸面边界;要加上页眉页脚,必须动用底层的页面位置触发器(traps)。
- 结论.用
.wh和.ch命令在距离页底特定位置埋下触发器,当文本流淌到该坐标时强制切换环境(Environment),才能在不打断正文的缓冲区状态印出页码。
这种写法极其考验对排版引擎状态机的理解。比如在触发器里换页必须用单引号前缀的 'bp 而不是点号前缀的 .bp,坐标计算稍有偏差就会触发死循环。至于德语复杂的连字符断词,则是直接挂载 groff 内置的 de.tmac 和 den.tmac 词库了事,再配合 Vim 编辑器、专注插件 Goyo 和 Git 做版本控制,整套写作流水线没有任何多余的图形界面。
逐行合成的硬伤:为什么它赢了速度却输给 LaTeX
看着 1.6 秒排完 120 页的数字,很容易让人产生用 groff 替代一切的冲动。但把视线从个人玩具拉回专业出版工业就会发现,快是有代价的,代价就藏在段落合成算法里。

算力翻了千倍,我们等待光标响应的时间却没有缩短一毫秒。
以 LuaLaTeX 为代表的现代专业排版系统,继承了高德纳设计的全局段落优化算法,会把整个段落通盘计算后再决定在哪里断行,配合 microtype 插件还能对字距做肉眼难辨的微米级压缩与扩展,版面灰度极其均匀。groff 走的是古老的 逐行合成 路线,读一行排一行,遇到窄版面的小说排版时,很容易出现单词间距忽大忽小的情况,而且缺乏现代小说排版必需的孤行与寡行(widows/orphans)自动控制,后期往往需要作者肉眼校对、手动微调。
这也是我不太买账把 groff 捧成通用写作神器的原因。问题不在工具的新旧,而在创作者把精力花在哪一头。
《庄子·天地》里讲过一个抱瓮丈人的故事,宁可抱着瓦罐一趟趟打水,也不用省力的桔槔,理由是用了机械就会生出机心。顶尖工程师偏爱退回石器时代的工具链写小说,本质上也是在逃避现代软件的机心。今天的商用文字处理软件塞满了云同步、AI 助手和繁琐的样式面板,就像主人在所说的,在现代软件里打字如同在泥浆里跋涉;而用 groff 配合脚本,十天写出四万词的背后,是敲下命令一秒出结果的确定感。
- 风险.独立作者若盲目跟风这套极简工作流,一旦书稿涉及复杂插图、多栏混排或严苛的印刷字距要求,排查底层寄存器和触发器 Bug 的时间会迅速吞噬掉编译省下的那几秒钟。
对于 Linux 极客来说,movq 给出的是一套可以直接抄作业的极速文本玩具;但对于只想安静写书的普通创作者,新兴的 Typst 在增量编译速度和现代自动化排版之间已经找到了更温和的平衡点。接下来真正值得观察的,不是有多少人会去背诵 groff 那套晦涩的双字母命令,而是当 Markdown 已经成为绝对主流,开源社区会不会基于这些古老的高性能内核,封装出专门针对纯文学写作的零配置宏集。
