女儿小学三年级了,开始要写作文了。

上了一个月学,已经正经写过两次作文了。

或许是看我平常写稿的习惯,所以女儿也习惯了在我的电脑上,用豆包语音输入法写初稿、润色,定稿后再打印出来,誊写在老师要求的20×20文稿纸上。

之前打印,就是用Word随便打印了一个白纸黑字普通版,国庆想着是不是能增加点仪式感,按照文稿纸打印——突然发现Mac版的Word不似Windows,并没内置稿纸功能。而外部加载的模板,不太好用。

AI时代,自己动手丰衣足食。

正好最近因为用Quarto写电子书,顺带对于Typst这个新一代排版语言也越有了解,就像用它来实现。

问Gemini,Typst下是否有稿纸插件。Gemini先后两次给我推荐了两个,结果发现都不存在——这一代Gemini文字能力没退化,但幻觉实在有点厉害。

不过将错就错,让Devin的SWE-2模型,直接帮我写了一个宏,不但可以自定义输出文稿纸,还能设定标题、日期的自动居中,正文自动空两格,外加还有每100字的里程碑标记。

把作文打印出来,满满的仪式感。

文件下载

使用方法

  1. 把 lib.typ 和 yuangao-template.typ 放在同一目录。

  2. 在 .typ 文件开头写:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    
    #import "lib.typ": *
    
    #show: yuangao.with(
      cols: 20,                   // 每行20格
      rows: 20,                   // 每页20行(共400格)
      grid-color: rgb("#70a174"), // 淡绿色方格
      title: "作文题目",           // 作文标题(自动居中排在第一行方格)
      date: "2026年10月7日",      // 日期(可选,注释掉即可)
      paper-title: "文 稿 纸",     // 顶部标题
      show-word-count: true,      // 右侧显示 100/200/300/400 字标记
      title-in-grid: true,        // 标题排在方格内(第一行)
    )
    
    这里填写第一段正文内容。每段开头会自动缩进两格,不需要手动输入空格。
    
    这里填写第二段正文内容。标点符号会自动占用一个方格,并且自动遵循行首行末避头尾排版规则。
    
  3. 本地运行 typst compile yuangao-template.typ 生成 PDF。也可以在VS code下安装Tinymist Typst插件,实时编辑预览。

特点

  • 标准 20×20 方格:一页 20 行 × 20 列 = 400 格
  • 淡绿色护眼格子:默认 rgb("#70a174"),可自定义颜色
  • 自动排版:段首缩进两格、标点避头尾禁则、双位英数合占一格(如 A4)
  • 字数统计:右侧每 5 行标注 100/200/300/400 字
  • 多页支持:超过一页自动分页并显示页码
  • 空白稿纸生成:内置 yuangao-sheet 函数可快速生成空白稿纸用于打印手写

示例效果

20×20 文稿纸排版效果

源码说明

lib.typ 是一个纯 Typst 宏包,不依赖外部包。核心逻辑包括:

  • parse-text-to-cells:把正文解析成 20×20 的格子二维数组,自动处理段落缩进和标点禁则
  • render-yuangao-page:渲染单页稿纸(标题、格子、字数标记、页脚)
  • yuangao:主入口函数,负责分页计算和整体排版
  • yuangao-sheet:空白稿纸生成函数

如果你需要调整样式(比如改格子颜色、加田字格、加班级姓名栏),直接或让AI改 lib.typ 即可。