分寸 · Measure

让 AI 写的中文页面,
排得有分寸。

给 Claude Code、Codex 这类编码 Agent 用的中文排版 skill,加一个离线校验器 measure-cjk:查字号、字距、行长、行高、标点和字体授权,并用浏览器实测。

装上之后,差别有多大

同一个 Agent、同一个模型,30 条中文页面提示词,装和不装 measure 各生成一次,用 measure 的完整档检查。

Codex

模型 gpt-6-astra

零 error 页面(全部规则)
0/3030/30
零 error 页面(排除 T02、T04)
0/3030/30
同一条提示词逐条比(排除 T02、T04)
更好 30,一样 0,更差 0;p < 0.0001

Claude Code

模型 claude-opus-5-5

零 error 页面(全部规则)
0/3027/30
零 error 页面(排除 T02、T04)
15/3027/30
同一条提示词逐条比(排除 T02、T04)
更好 14,一样 14,更差 2;p = 0.0042

规则示意

以下是示意,不是实验结果:同一段文字,“关”只差一条规则,“开”是按 measure 改好的版本。两版都用 measure-cjk lint --render 检查过:“关”只报这一条规则,“开”零 error。“关”的程度按实验里真实页面的情况设,不故意做得更差。

没有做示意的规则:T01(声明中文 lang)和 T13(字体栈里要有中文字体)的效果取决于浏览器和系统字体,一张图说明不了;T04(行首禁则)在 Chrome 里开不开,常用中文标点都不会落到行首,看不出差别。

T02中英文、中文与数字之间要有间距

汉字和字母、数字挤在一起,读的时候要自己找边界。measure.css 打开 text-autospace,浏览器自动留出约四分之一个字的空隙,文案里不用手打空格。

T02 示意:不按规则写的版本
关
T02 示意:按 measure 写的版本
开

T03中文语境用全角标点

半角逗号、句号、问号又小又靠下,夹在汉字中间像没打完。中文句子用全角标点,字距才均匀。

T03 示意:不按规则写的版本
关
T03 示意:按 measure 写的版本
开

T05正文行长 28–40 字

一行太长,眼睛从行尾回到下一行行首时容易串行。中文正文每行 28–40 个字最舒服,宽屏上要给正文限宽。

T05 示意:不按规则写的版本
关
T05 示意:按 measure 写的版本
开

T06正文行高不低于 1.5

汉字是方块字,字面撑满整个字身,行与行之间比西文更需要留白。行高 1.35 时上下两行已经显得挤,正文建议 1.6–1.9。

T06 示意:不按规则写的版本
关
T06 示意:按 measure 写的版本
开

T07中文字距不能为负

西文大标题常用负字距收紧,搬到中文上,笔画会碰在一起。中文标题保持默认字距,靠字重和留白拉开层次。

T07 示意:不按规则写的版本
关
T07 示意:按 measure 写的版本
开

T08中文不用斜体

中文字体没有真正的斜体,浏览器只能把字形硬生生歪过去。强调中文,用加粗、颜色或着重号。

T08 示意:不按规则写的版本
关
T08 示意:按 measure 写的版本
开

T11最小字号:正文 ≥ 14px,任何中文 ≥ 12px

西文 10px 还能辨认,汉字笔画多,10px 时笔画会糊成一团。价格说明、标签这类小字,中文也不要小于 12px。

T11 示意:不按规则写的版本
关
T11 示意:按 measure 写的版本
开

真实页面:同一条提示词,装之前和装之后

每组第一张是不装 measure 时 Agent 生成的页面,红框是完整档查到的问题,标签是规则编号和在这张截图里当场量到的值;第二张是装了 measure 后,同一条提示词生成的页面。截图窗口都是 1280px 宽:第一张截红框所在的位置(多数就在首屏),第二张截首屏。

文章页(游记) · Codex

提示词:做一篇旅行游记的网页,讲在云南大理住了两周的见闻,配几个小标题。

文章页(游记),不装 measure 时生成。红框标出 13 处 lint 查到的问题,标签是规则编号和这张截图里量到的值
不装 measure:37 处(T11(字号太小) 24 处、T05(行长) 11 处、T07(字距为负) 2 处),最小中文字号 9px
文章页(游记),装了 measure 后生成的同一条提示词的页面
装了 measure:0 处,最小中文字号 12px

价格页 · Codex

提示词:做一个设计素材网站的会员价格页,分免费版、专业版、团队版三档。

价格页,不装 measure 时生成。红框标出 15 处 lint 查到的问题,标签是规则编号和这张截图里量到的值
不装 measure:53 处(T11(字号太小) 51 处、T07(字距为负) 2 处),最小中文字号 9px
价格页,装了 measure 后生成的同一条提示词的页面
装了 measure:0 处,最小中文字号 12px

落地页 · Claude Code

提示词:做一个 AI 写作助手的产品介绍页,突出它能帮用户改周报和邮件。

落地页,不装 measure 时生成。红框标出 2 处 lint 查到的问题,标签是规则编号和这张截图里量到的值
不装 measure:9 处(T03(标点) 7 处、T07(字距为负) 2 处),最小中文字号 12.8px
落地页,装了 measure 后生成的同一条提示词的页面
装了 measure:0 处,最小中文字号 13px

文章页(随笔) · Claude Code

提示词:写一篇关于“为什么年轻人开始重新用纸质笔记本”的博客文章页面,大约 800 字。

文章页(随笔),不装 measure 时生成。红框标出 1 处 lint 查到的问题,标签是规则编号和这张截图里量到的值
不装 measure(截的是页面往下 797px 处):1 处(T08(斜体) 1 处),最小中文字号 12.8px
文章页(随笔),装了 measure 后生成的同一条提示词的页面
装了 measure:0 处,最小中文字号 14px

6 个主题

每个主题一个文件(不超过 8 KB):设计变量、字号阶梯(字号越大字重越轻)、字体栈、该做和不该做。6 个示例页用同一段文字,CSS 原样取自主题文件,都用 measure-cjk lint --render 检查过。

报刊主题的示例页截图

报刊 Broadsheet

现代报纸。报头、双线、分栏和栏线;标题宋体,正文黑体。

适合:长文、资讯、周报、newsletter。

示例页 lint:0 error,1 条 warn(T06,主题文件里写明了原因)。打开示例页

说明书主题的示例页截图

说明书 Manual

工业说明书。全黑体,编号体系(1、1.1),细线表格,单色。

适合:产品文档、快速上手、操作步骤、规范。

示例页 lint:0 error。打开示例页

档案主题的示例页截图

档案 Archive

档案馆。牛皮纸底,编目号用等宽字体,正文宋体,登记表式的线框。

适合:项目记录、版本历史、研究笔记、作品集的说明页。

示例页 lint:0 error。打开示例页

季刊主题的示例页截图

季刊 Quarterly

文艺杂志。大留白,宋体正文,标题字号大、字重轻。

适合:随笔、访谈、长读、品牌故事。

示例页 lint:0 error。打开示例页

宋刻主题的示例页截图

宋刻 Songke传统风

宋刻本。竹纸底,浓墨,仿宋或宋体,正文落在界栏里;可选竖排(示例页没有竖排示例)。

适合:古籍摘录、诗文、文化类长读、题跋。

示例页 lint:0 error,1 条 warn(T06,主题文件里写明了原因)。打开示例页

分寸主题的示例页截图

分寸 Dososo传统风

米纸、墨、青瓷、朱砂;克制、留白优先。色板取自 dososo-design-system。

适合:产品官网、展示页、个人主页、小红书卡片(卡片模板就是这套色板)。本项目的展示页用的就是这个主题。

示例页 lint:0 error。打开示例页

怎么用

校验器单独发布在 npm 上,skill 按你用的 Agent 安装:

源码、规则文档和实验数据在 GitHub。