Real IMAP connection via imapflow library: - Connects to IMAP server (IMAPFlow, TLS on port 993) - Fetches recent messages (configurable limit, default 20) - Extracts: from, fromEmail, subject, date, snippet (200 chars) - Thread-to-contact matching (PRD §6.1): 1. Match sender email against persons table 2. If no person match, extract domain and match against company.website 3. Returns matchedCompany + matchedPerson for each email - Audit-logged (action: crm.mailsync:imap) - Zod validated (host, port, user, password, folder, limit) - 502 on IMAP connection failure with detail - 400 on validation failure Tested: invalid creds → 502 'IMAP connection failed', missing host → 400
13 KiB
Executable File
文本排印细节 Text Typesetting Details
「最基础的美学,易忽略的细节与阅读」——很多看似高级的版面,其实只是把这些"小事"全做对了。
本文专注:字号 / 字重 / 字距 / 行距 / 段落 / 灰度 / 中英混排 / 孤行孤字 / Ruby 注音。 标点专题(避头尾 / 破折号 / 4 种风格 / 加法减法模式 / 挤压拉伸优先级)见
punctuation.md。 断行专题(标题断句 / 不可分离禁则)见title-and-breaking.md。
一、版心(Type area):决定阅读心理压力
版心位置和页边距对比强烈到能"潜移默化影响读者审美"。
- 太满(每行 48 字、每页 30 行、四周边距小)→ 文字"扑面而来",回行困难,疲劳
- 舒展(每行 17–25 字、页边距按比例递增)→ 优美、轻松、愉悦
每行字数太多的版面,会让读者阅读时心理压力较大,回行时不易找到下一行的起头,增加视觉疲劳。
横排页边距三大法则
- 内紧外松:订口(书脊)< 切口(外)。视觉重心向外。
- 上紧下松:天头 < 地脚。视觉重心略往上。
- 比例递增:常用 2 : 3 : 5 : 8 或 3 : 5 : 8 : 13(费氏数列)
最常用配比(横排书籍):
订口 : 切口 : 天头 : 地脚 = 3 : 5 : 8 : 13
即 L3 + R5 + O8 + U13 (字数)
Web/H5 边距换算
设计稿 375px 宽 H5:
- 屏宽 375,左右各 20–24px,正文版心 327–335px
- 上 24–32px,下 32–48px
- 模块间距用 16/24/32(4 的倍数)
二、字间距 字距
核心法则:正文密排,不动字距。
字面率(Face ratio)
字符在方框内实际占多少。现代字体:
- 汉仪玄宋:92%
- 方正雅宋:94%
- 汉仪书宋:~96%
- 方正书宋:96%
- 思源黑体:~95%
字面率 < 100% 意味着两个字紧贴排版时已经天然有间距,不需要再额外加字距。
字距规则
- 正文:letter-spacing 0,密排
- 标题(≥ 24pt):可加 0.05–0.1em 增加从容感
- 超大字号(≥ 40pt 海报):可加 0.1–0.2em
- Logo / 单字装饰:字距按设计意图
4 种字距模式(W3C 术语)
| 模式 | 字距 | 用途 |
|---|---|---|
| 密排 | 0 | 默认正文 |
| 疏排 | 1/4 em / 1/3 em / 1/2 em / 1 em | 标题求平衡、图说短文求平衡、短诗词、儿童读物 |
| 均排 | 由算法均摊 | 禁则处理后凑齐行长;列表中并列项目求体例一致 |
| 紧排 | 负值 | 杂志标题、广告文案多字时凑一行(不适用于书籍标题与正文) |
CSS 注意:
/* 正文区,不要碰 */
.body { letter-spacing: 0; }
/* 大标题可以稍加 */
.headline { letter-spacing: 0.05em; }
/* 不要这样 */
.body-bad { letter-spacing: 1px; } /* 破坏字号节奏 */
三、行间距 行距
比例区间
| 比例(字号:行距) | 体感 | 用途 |
|---|---|---|
| 1 : 1.0 | 密排、铅字时代标准 | 字典、报纸(每行字少时) |
| 1 : 1.33 | 紧凑 | 杂志、新闻 |
| 1 : 1.5 | 现代标准 | 网页正文、商务文档 |
| 1 : 1.7 | 舒适 | 长文阅读、技术文档 |
| 1 : 2.0 | 疏朗 | 文学、诗歌、画册说明 |
| 1 : 2.5+ | 飘散,章节断裂感 | 避免 |
W3C 规定:行距(行间空白)= 字号的 50%–100%;对应行高(含字本身)= 字号的 1.5–2 倍。超出 100% 不增易读性。
铅活字时代的优美版面(如 1918 年前后的期刊正文),字号 : 行距比约在 1:1 ~ 4:3 之间,是经典优美范例。
实操值
- 印刷正文 9pt → 行距 12–18pt(默认 18pt = 1:2 雍容)
- 印刷正文 10.5pt → 行距 14–18pt
- 屏幕 16px → line-height 1.5–1.7(= 24–27px)
- 屏幕 14px → line-height 1.6–1.8
所有行距必须是模数整数倍。 否则跨语种/跨字号无法行对齐。
行间标点行距加成(W3C)
- 行间有专名号(﹏)、甲式书名号(﹏)、着重号时:
- 单面装行距 ≥ 1/2 字号
- 双面装行距 ≥ 5/8 字号
- 直排带注音时:行距 ≥ 1.5 × 基字
四、字重与字号
字重与对比度的关系
- 字重塑造文字与载体(纸/屏)的对比度
- 小字 + 重字重 > 小字 + 轻字重(小字更需对比度)
- 大字 + 轻字重 可显优雅,大字也禁得起轻字重
实例:薄而透的纸张上用大字重宋体作正文,文字的黑与纸张的白构成易于阅读的对比关系,大字重还能反向突出纸张的"透"。
字重选用矩阵
| 字号 | 屏幕 | 印刷 | 推荐字重 |
|---|---|---|---|
| 极小 | < 12px | < 6pt | Medium / Bold(55S–65S) |
| 小 | 12–14px | 6–7.5pt | Regular / Medium(45S–55S) |
| 中 | 14–18px | 8–10pt | Regular(45S–55S) |
| 大 | 18–24px | 10–14pt | Regular / Light(35S–45S) |
| 极大 | > 24px | > 14pt | Light / Thin 可选(25S–45S) |
层级用字重不用字体
不同字号 × 不同字重,常常会形成灰度近似的面,从而拉开与其他元素的空间关系。例如:大字号正文用较细字重,小字号辅文用中等字重,它们灰度接近,但通过字号自然分出层级。
层级关系优先级:字号 > 字重 > 颜色 > 字体。前两个搞不定再考虑后两个。
五、段落与体例
段落组织:不要把 2 字缩进当成通用默认
- 书籍、古典文本、公文、长篇正式印刷物:可以采用首行缩进,常见为 2 字;短栏可减弱为 1 字
- 网页、H5、小红书、Dashboard、PPT、卡片:通常不使用首行缩进,优先用段间距、分组、标题层级来组织文本
- 引文可使用整段缩进或边线/底色/卡片区分;不要机械套 4 字缩进
- 列表项无需首行缩进
- 同一作品只选择一种段落组织方式,不要“首行缩进 + 大段间距”同时堆叠
段落 4 种缩排模式(W3C CLReq §6.2.1)
| 模式 | 做法 | 适用 |
|---|---|---|
| 1. 全部段落首行缩排 | 所有段落首行空 2 字 | 书籍、古典文本、公文、正式印刷物 |
| 2. 首段不缩排,其余缩排 | 首段顶格,其余段缩 2 字 | 长篇文章、英译中、跨文化项目 |
| 3. 所有段落不缩排 + 段间距 | 段首顶格,段间空一定行距 | 现代网页、技术文档、H5、PPT、卡片、Markdown 渲染 |
| 4. 语气未完段断行不缩排 | 段断而语气未完时,下一段顶格 | 散文、诗、剧本 |
凸排(Hanging Indent)
首行不缩、次行起缩。用于:
- 剧本对白
- Q&A 问答
- 法条
- 词典词条
- 人名列表(花名册)
李白:床前明月光,
疑是地上霜。
杜甫:好雨知时节,
当春乃发生。
CSS:
.hanging {
text-indent: -4em; /* 首行向左凸 4 字 */
padding-left: 4em; /* 整段左缩 4 字 */
}
段落缩排(Block Indent)
行首侧统一缩进,用于引文、诗词、副标题。字号同正文,可换字体或加段间距,段间距应为正文行的整数倍。
blockquote {
margin: 1em 4em 1em 4em; /* 左右各缩 4 字 */
font-style: normal; /* 中文不要斜体 */
}
小标题处理
经典示范:用同一字体同一字号,仅用空字格区分体例。
- 引文:段首不空格,用整段缩进、边线、底色或卡片区分;具体缩进量由版式决定
- 小标题:段首空 6 字(向右推),与正文不空行
- 正文:按所选段落组织方式处理;书籍/公文可首行缩进,网页/卡片/UI 通常顶格并用段间距分组
这种"用空间代替字号"的处理,是高级排版的标志——信息层级不靠强对比,靠空间秩序。
单行对齐 4 种(W3C)
- 居中:标题、署名、独立元素
- 行首:列表项(左对齐于行首)
- 行尾:日期、署名、价格(右对齐于行尾)
- 均排:禁则处理后凑齐 / 列表并列项体例一致;段落末行 / 段落只有一行时不用均排
六、文本灰度均匀
排版的至高理想:文字在版心内形成极致均匀的灰,使塑造文本的型变得容易。
灰度均匀的敌人:
- 标点未挤压 → 局部白块
- 中英文混排无字距 → 字宽不均
- 多字重混用 → 黑白对比跳跃
- 行末参差不齐(左对齐)→ 右侧灰度断
- 大量繁体字夹杂简体 → 局部更黑
灰度均匀的盟友:
- 启用两端对齐(justify)
- 启用中英文混排自动间距
- 同段内字重统一
- 标点挤压 + 避头尾
- 行距足够稳定
CSS 实现
.body {
text-align: justify;
text-justify: inter-character; /* 中文字间分布 */
text-spacing-trim: space-all;
line-break: strict;
}
七、中英文混排
- 中英文之间自动加 1/4 字宽空隙(盘古之白)
- Web:
<span>中文</span> <span>english</span>之间留半个空格;或用text-autospace(IE 老规范)/CSS Text Module Level 4 的text-spacing - Markdown 写作:手工在中英之间空格
- Web:
- 西文标点(半角)和中文字符之间也要加空格
- 数字与中文之间同样要加:
第 3 章,不要第3章 - 单位与数字之间不空:
30px9pt,不要30 px
间距 W3C 规则
- 横排西文字母用比例字体;数字用比例或等宽字体
- 汉字与西文字母/数字间空隙 ≤ 1/4 em(默认 1/4 em,最小 1/8 em,最大 1/2 em)
- 西文/数字在行首行尾时不加空白
- 中文点号前后、中文开始夹注符号之后、结束夹注符号之前的西文/数字不调整字距、不加空白
八、孤行孤字(Widow & Orphan)救济
排版的"末页综合症"。详见 title-and-breaking.md §五。
孤字不成行(Orphan)
段落最后一行只有 1 字 + 1 标点。
救济顺序:
- 挤进上行(首选):标点宽度调整、中西间距压缩、字距均压
- 删字回前行:与作者商议删 1–2 字
- 加字补足:补 1 字让末行≥3 字
- 均排末行(次选):仅适用于诗歌对联
孤行不成页(Widow)
页首是前段的最后一行。
救济顺序:
- 孤行回前页:超出版心 1 行接前段
- 前页末段取 1 行:修改前段提前结束
- 删字:删本段开头让孤行不孤
- 加字:补 1 行字数
CSS:
p {
orphans: 2; /* 段末至少留 2 行 */
widows: 2; /* 段首至少留 2 行 */
}
九、Ruby 注音 / 拼音(W3C CLReq §5.5)
注音符号(Bopomofo,台湾用)
- 横排 / 直排原则上都置基字右侧
- 注文字号 : 基字 = 3 : 10
- 调号同字号;轻声符 = 1 : 15
- 声调位置:
- 平上去入声:标在末符号右上方
- 入声:右下方
- 轻声:标在前方
- 直排向上回返半个符号位、横排向右突出半个符号位
汉语拼音
- 仅横排
- 常放在基字上方(部分场景下方)
- 注文字号 = 基字字号的 1/2
- 相邻注文间距 ≥ 西文词间空格 ≈ 1/4 字宽
- 字形:用 a / g 单层、二声调下粗上细的无衬线体(出版/教育界惯例,无国标)
两种用法:
- 单字标音:注文总在上方、汉字间字距大、全小写
- 分词连写标音:注文常在下方、词间约 1/2 字宽空、句首/专名大写、标点跟左侧注文
HTML5 Ruby
<!-- 单字标音 -->
<ruby>
汉<rt>hàn</rt>语<rt>yǔ</rt>拼<rt>pīn</rt>音<rt>yīn</rt>
</ruby>
<!-- 整词标音 -->
<ruby>
汉语拼音<rt>Hànyǔ Pīnyīn</rt>
</ruby>
<!-- 含括号回退 -->
<ruby>
汉<rp>(</rp><rt>hàn</rt><rp>)</rp>
</ruby>
CSS:
ruby {
ruby-position: over; /* 注文在上 */
/* ruby-position: under; // 注文在下(分词连写法)*/
}
rt {
font-size: 0.5em; /* 拼音 = 基字 1/2 */
font-family: "Source Sans Pro", "Inter", sans-serif;
line-height: 1;
}
注意:CSS Ruby 各浏览器支持不一致;Apple Books 字体选择较全。Web 上稳定方案是手动用 <sup> 模拟。
十、检查清单(排印完成前必过)
- 正文行长 17–40 字(最多 48 横排 / 55 直排)?
- 行距是字号 1.5–2 倍?
- 行距是模数整数倍?
- 所有字号都在模数体系内?
- 内 < 外 < 上 < 下 的页边距?
- 正文 letter-spacing 是 0?
- 段落组织方式是否符合媒介(网页/卡片不机械使用首行缩进,书籍/公文再按模板设置)?
- 一段内字重统一?
- 中英文之间有 1/4 字宽空格?
- 段末是否有"孤字 + 标点"?
- 页首是否有"孤行"?
- 整页放远看文本灰度均匀?
- 段落是否选定 4 种缩排模式中的一种并贯穿全文?
任何一项不过关,先修这一项再说"美学"。