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
16 KiB
Executable File
标点全规则 Punctuation:风格 / 挤压 / 避头尾 / 破折号
中文排版的"暗物质"。占文本面积 5%–15%,决定 95% 的"专业感"。本文按 6 个主题展开:4 种标点风格、加法/减法模式、4 级避头尾、行内挤压/拉伸优先级、破折号专题、Unicode 码位速查。
一、4 种标点风格
不要混用。一个项目锁定一种风格。
1. 全角式(Full-width)
- 所有标点占 1 个汉字宽
- 出现场景:默认网页排版(引擎不调)、《普列汉诺夫美学论文选》等老派出版
- 优点:纵横对齐严格
- 缺点:标点连用形成"白窟窿"(
"。(三符 ≈ 3 格空白) - CSS:默认行为(无需特别处理)
2. 半角式(Half-width)
- 所有标点占 0.5 个汉字宽
- 出现场景:辞典(《汉语大字典》节约空间)、苹果中国官网 2018 年(用 WebFont SF Pro SC)
- 优点:紧凑,西文混排自然
- 缺点:句末停顿感弱,影响阅读节奏
- CSS:
font-feature-settings: "halt" 1;或换用半宽字体
3. 开明式(Kaiming-style,大陆纸媒主流)
- 句末标点全宽:
。 ? !(句号、问号、叹号) - 句内标点半宽:
, 、 ; :(逗号、顿号、分号、冒号) - 出现场景:大陆纸媒、方正飞腾默认、绝大多数大陆图书
- 推荐用于大陆现代横排正文
- CSS:手动控制或用 InDesign 标点挤压预设
4. 居中式(Centered,港台主流)
- 所有标点全宽 + 字面正中
- 同时适应横排和直排(标点位置一致)
- 出现场景:港台几乎所有出版物、传统书法集
- 优点:方向无关、对纵横对齐友好
- 缺点:横排时"。"看着像浮在中间
- CSS:港台地区字体(如华康、文鼎)自带这种字面分布
选择决策表
| 项目类型 | 推荐风格 | 备注 |
|---|---|---|
| 大陆现代图书 / 杂志 / 报刊 | 开明式 | 主流选择 |
| 大陆学术论文 / 招股书 / 公文 | 开明式 | 严肃 |
| 港台繁体书籍 | 居中式 | 民国延续 |
| 字典 / 辞海 / 工具书 | 半角式 | 节约空间 |
| 网页正文(无引擎支持时) | 全角式(被迫) | 加 text-spacing-trim 可改善 |
| 现代网页 / App(有引擎) | 开明式 + text-spacing-trim |
推荐 |
| 古籍影印 / 文言 | 居中式或全角式 | 配直排 |
二、加法模式 vs 减法模式
这是认知误区的重灾区。
加法模式(Additive,专业排版的方式)
- 标点本身 = 半宽
- 加上一侧或两侧的空隙凑成全宽
- 调整对象 = 空隙(可拿掉、可缩半、可拉满)
- 采用方:InDesign、QuarkXPress、JIS、Adobe 全系
- 标点连用时:把相邻一侧的空隙拿掉
减法模式(Subtractive,大众默认认知)
- 标点本身 = 全宽
- 通过"挤压"去掉部分宽度
- 调整对象 = 标点字面本身
- 采用方:方正自家排版软件、Word 中文版部分预设
- 问题:在加法模式的字体上做减法会算错
实操判断
用 InDesign / Adobe 系统:默认加法模式。选字体时优先选标点"偏靠式"的字库(思源、华文、蒙纳);规避方正大量正文字体(方正新书宋、方正悠黑、方正宋一)—— 它们把标点摆在字面正中("居中式"),与 Adobe 算法错位。
用方正飞腾:默认减法模式,方正字库内部自洽,不会出问题。
Web / CSS:现代 text-spacing-trim: space-all 是加法模式实现。
加法模式下标点的 3 类分组
| 类别 | 标点 | 空隙 |
|---|---|---|
| 第 1 类:默认密排不加空 | 着重号、分隔号、连接号短横、日文 ?! |
0 |
| 第 2 类:一边加二分空(大陆 + 日文绝大多数) | 大陆问号 / 叹号 / 冒号 / 分号 / 逗号 / 顿号 / 句号;蝌蚪引号 ""'';圆括号 ();书名号《》 | 半宽 + 二分空 = 全宽 |
| 第 3 类:两边各加四分空(港台多数 + 日文中点) | 港台问号 / 叹号 / 冒号;日文 ・ |
半宽 + 左 1/4 + 右 1/4 = 全宽 |
三、行末半角原则(GB/T 15834-2011 §5.1.10)
强制规则:标点排在一行末尾时,若为全宽字符应占半角字符的宽度。即"行末标点 → 半宽"。
- 这是中国大陆和多数中国出版社的硬性规范
- 视觉效果:行尾对齐(不会因末标点全宽撑出视觉外凸)
- 实现:InDesign "标点挤压" → 行尾减半(自动);CSS
hanging-punctuation: allow-end让标点悬挂到版心外
四、避头尾 4 级严格度(W3C CLReq §6.1.1)
同一文档内必须统一一种严格度。
0 级:none(不处理)
- 不做任何避头尾
- 见于港台部分报刊(标点居中无突兀)
- 大陆不推荐
1 级:basic(基本处理,最低标准)
- 不可在行首:
。, 、 ; : ! ? … 》 」 』 ) 】、所有"结束"括号和引号、连接号–、间隔号·、分隔号/ - 不可在行尾:
( 【 《 「 『 " '、所有"开始"括号和引号
2 级:GB 法(大陆国标,推荐用于正式出版)
- basic 全部规则
- 加:分隔号
/也不可在行尾 - 这是中国大陆图书业的默认级别
3 级:strict(严格,推荐用于精装/正式出版)
- GB 法全部规则
- 加:破折号
——不可在行首 - 加:省略号
……不可在行首 - InDesign "简体中文避头尾" 默认即此级
完整字符表
不可出现在行首
。,、;:?!…—··――
)】〗〕〉》」』〙〗⦆
’"
%‰‱℃℉°′″
/、‧/
不可出现在行尾
(【〖〔〈《「『〘〖⦅
‘"
$¥€£¢₩₫
不可分离(不可在中间断开)
—— 破折号(2 字宽视为一体)
…… 省略号(2 字宽视为一体)
123456 阿拉伯数字内部及小数点
50% 数字 + 百分号 / 千分号 / 度数
20℃ 数字 + 单位
±5 符号 + 数字
m² 被标记词 + 上下标
①② 注释记号 + 被注词
word 西文单词(按 hyphenation)
处理顺序:"先挤进后推出"
W3C 明文规则。
- 第一步:检查标点能否通过"宽度挤压"塞回前行末
- 行末全宽标点 → 半宽
- 连续标点 → 拿掉相邻一侧的空隙
- 中西间距 1/4 em → 1/8 em
- 第二步:仍塞不下,从前行末字推入下行
- 第三步:前行多出的空间按拉伸优先级处理
- 第四步:最后才平均加大字间距
口诀:挤进只需腾半字宽,推出至少动一字宽;正文排版应尽量少调。
推出后救济:均排(justify within)
行内调整无法整齐时,按拉伸优先级把空间分配出去。详见下一节。
五、行内挤压 / 拉伸优先级(W3C CLReq §6.2.2)
这是排版引擎的内部算法表,知道了它你才知道为什么 InDesign 那样调字。
挤压优先级(从高到低)
| 优先级 | 对象 | 挤压幅度 |
|---|---|---|
| a | 行末标点 | 固定半字宽(GB/T 15834-2011 §5.1.10) |
| b | 行内西文词距 | 最小 1/4 em,多处同等量 |
| c | 间隔号 · |
从两侧同等量挤,最小到 0(结果半字宽) |
| d | 夹注符号(括号) | 开始括号前侧、结束括号后侧,最小到半字宽 |
| e | 逗号 / 顿号 / 分号 | 后侧或两侧同等量挤,最小到半字宽 |
| f | 中西间距 | 最小 1/8 em(部分风格固定 1/4 em 不允许调) |
| g | 句号 / 问号 / 叹号 | 有空间则挤到半字宽(部分风格不允许调,因句末停顿大) |
拉伸优先级(从高到低)
| 优先级 | 对象 | 拉伸幅度 |
|---|---|---|
| a | 西文词距 | 最大 1/2 em,多处同等量 |
| b | 中西间距 | 从 1/4 em 默认值起,最大 1/2 em(实际多数风格只到 1/3 em) |
| c(最后选项) | 字间距 | 同等量拉,但不可对禁则字间距拉伸;连接号、分隔号及其前后字符避免拉伸 |
关键数值速查
| 间距 | 最小 | 默认 | 最大 |
|---|---|---|---|
| 西文词距 | 1/4 em | 1/3 em | 1/2 em |
| 中西间距 | 1/8 em | 1/4 em | 1/2 em |
| 间隔号两侧 | 0 | 1/4 em | 1/4 em |
| 行末标点 | 半字宽 | 半字宽 | 半字宽(不变) |
| 连续标点共 2 字 | 1 字 | 1.5 字 | 2 字 |
六、连续标点处理(W3C CLReq §6.3.2)
最常见的灾难现场:标点连用形成"白窟窿"。
未处理:
(明)钟惺、谭元春《唐诗归》钟评后二句"二
句儿童皆诵之,然其言自足不朽"。(清)弘历
↑↑↑
"。( 三个全角占 3 格
处理后:
(明)钟惺、谭元春《唐诗归》钟评后二句"二句儿童皆
诵之,然其言自足不朽"。(清)弘历《唐宋诗醇》评
↑↑
"。( 挤压到约 1.5 字宽
规则
- 任意两个相邻标点共 2 字宽时应缩到 1.5 字宽
- 可进一步缩到 1 字(但通常不缩到 1 字,避免读者错觉两符号是一个)
- 挤压方向让开始/结束括号紧靠被夹内容
实现
- InDesign:段落 → 中文排版设置 → "标点挤压" → 选"简体中文默认"或自定义
- CSS:
text-spacing-trim: space-all(自动处理)
七、破折号专题
最容易出错的单一符号。
1. 码位优先级
- U+2E3A TWO EM DASH
⸺—— 正式码位,占 2 字一体,首选 - U+2014 EM DASH
—× 2 —— 事实标准,思源字体通过ccmp替换为长横,主用 - ❌ U+2015 HORIZONTAL BAR
―—— 简中字库多数会断开 - ❌ U+2500 BOX DRAWINGS LIGHT HORIZONTAL
─—— 语义错误(制表符) - ❌ U+30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK
ー—— 日文长音符 - ❌ U+FF0D FULLWIDTH HYPHEN-MINUS
-—— 半宽连接符 - ❌ U+002D HYPHEN-MINUS
-—— ASCII 连字符
2. 字体推荐(破折号正确实现)
推荐:
- 思源黑体 / 思源宋体(通过 OpenType
ccmp把连续两个 U+2014 替换为整段长横,再用locl在 CJK 语言下切换为字框居中字形) - 苹方 PingFang
- HarmonyOS Sans / MiSans
雷区(破折号断开 / 顶格 / 下沉):
- 中易宋体、中易仿宋(破折号"无论如何接不上")
- 旧版微软雅黑(破折号下沉且双连超过两字宽)
- 华文黑体(破折号顶格不居中)
- 兰亭黑(破折号顶格且不居中)
3. 字体优先级陷阱(CSS)
❌ 错误:
font-family: "Helvetica", "PingFang SC"; /* 英文字体在前 */
连续两个 — 会优先取 Helvetica 字形,导致下沉、断开、双横之间留白。
✅ 正确(方案 A):删掉英文字体,用系统中文字体
font-family: "PingFang SC", "Microsoft YaHei", sans-serif;
✅ 正确(方案 B):用 unicode-range 拆 @font-face
@font-face {
font-family: "Helvetica Local";
src: local("Helvetica");
unicode-range: U+0000-007F; /* 只用于 ASCII */
}
body {
font-family: "Helvetica Local", "PingFang SC", sans-serif;
}
✅ 正确(方案 C):声明 lang 激活 locl
<html lang="zh-CN">
4. 防破折号中间断开
InDesign:
- 段落面板 → "禁止断字" 勾选(默认开)
- 避头尾规则集 → "禁止分开的字符" → 加入
U+2014、U+2015、U+2500 - 不要只勾"不换行"(那只是局部手动)
Word:
- 中文版"后置标点"里的
―实际是 U+2015,不是 U+2014 - 要让 U+2014 也避头尾,须手动加进"自定义后置标点"
- 终极保险:选中单个
—,格式→字体→字符间距→缩放 200%,硬把单 em dash 变成两字宽(来自《排版与校对规范》)
CSS:
<!-- 两个 em dash 之间禁止断行 -->
他说—⁠—我不去了。
5. 国标依据
- GB/T 15834-2011 §4.10 / §5.1.4:破折号占两个字位置、上下居中、不能中间断开
八、Unicode 码位速查(W3C CLReq 推荐)
| 符号 | Unicode | 推荐 | 不推荐替代 |
|---|---|---|---|
| 句号 | U+3002 。 | ✅ | U+FF0E . / U+002E . |
| 逗号 | U+FF0C , | ✅ | U+002C , |
| 顿号 | U+3001 、 | ✅ | — |
| 分号 | U+FF1B ; | ✅ | U+003B ; |
| 冒号 | U+FF1A : | ✅ | U+003A : |
| 问号 | U+FF1F ? | ✅ | U+003F ? |
| 叹号 | U+FF01 ! | ✅ | U+0021 ! |
| 弯双引号开 | U+201C " | ✅(横排) | — |
| 弯双引号闭 | U+201D " | ✅(横排) | — |
| 直角引号开 | U+300C 「 | ✅(直排) | — |
| 直角引号闭 | U+300D 」 | ✅(直排) | — |
| 双重直角引号开 | U+300E 『 | ✅(直排) | — |
| 双重直角引号闭 | U+300F 』 | ✅(直排) | — |
| 圆括号开 | U+FF08 ( | ✅ | U+0028 ( |
| 圆括号闭 | U+FF09 ) | ✅ | U+0029 ) |
| 书名号开 | U+300A 《 | ✅ | — |
| 书名号闭 | U+300B 》 | ✅ | — |
| 单书名号开 | U+3008 〈 | ✅ | — |
| 单书名号闭 | U+3009 〉 | ✅ | — |
| 破折号 | U+2E3A ⸺ / U+2014×2 —— | ✅ | U+2015 / U+2500 / U+30FC |
| 省略号 | U+2026×2 …… | ✅ | U+22EF(横直自动居中替代) |
| 连接号短横 | U+2013 – | ✅ | — |
| 连接号一字线 | U+2014 — | ✅ | — |
| 浪纹线 | U+FF5E ~ | ✅ | U+007E ~ |
| 间隔号 | U+00B7 · | ✅ | U+30FB / U+2027 / U+2022 |
| 分隔号 | U+002F / 或 U+FF0F / | ✅ | — |
| 着重号 | U+25CF ● 或 U+2022 • | ✅ | — |
九、CSS 完整实现(现代浏览器,2024+)
.body-text {
/* 字间距:密排 */
letter-spacing: 0;
/* 标点空间挤压(加法模式实现) */
text-spacing-trim: space-all;
/* 标点悬挂到版心外(行尾标点视觉对齐) */
hanging-punctuation: allow-end;
/* 严格避头尾 */
line-break: strict;
/* 不在词中断 */
word-break: keep-all;
/* 超长 URL 允许换行 */
overflow-wrap: break-word;
/* 两端对齐 */
text-align: justify;
/* 中文字间分布 */
text-justify: inter-character;
/* 标点宽度优化(OpenType) */
font-feature-settings:
"halt" 1, /* 半宽间距 */
"palt" 1; /* 成比例排(标题用) */
}
/* 标题:不要 halt,标题密排 */
h1, h2, h3 {
font-feature-settings: "palt" 1; /* 仅成比例排 */
}
/* 网页 / H5 / 卡片正文:通常不做首行缩进 */
p {
text-indent: 0;
margin: 0 0 1em 0;
}
/* 书籍 / 公文 / 古典长文如需首行缩进,应由对应 template 明确指定 */
.book-copy p,
.official-doc p,
.classical-copy p {
text-indent: 2em;
margin: 0;
}
/* 引文段:不要斜体;缩进/边线/底色由版式决定 */
blockquote {
font-style: normal;
}
旧浏览器降级:用 <wbr> 手工断行;用脚本处理(如 kerning.js)。
十、检查清单(标点相关)
排印完成前必过:
- 标点风格(全角 / 半角 / 开明 / 居中)是否全文统一?
- 行末全宽标点是否变为半宽?
- 避头尾级别(basic / GB / strict)是否选定并启用?
- 连续标点是否被挤压到 1.5 字宽内?
- 破折号是否用了 U+2014×2(不是 4 个连字符)?
- 破折号字体是否选了思源 / 苹方而不是中易 / 旧版雅黑?
- 破折号是否被加入"禁止分开"集?
- 引号横排用弯""'',直排用直角「」『』?
- CSS
font-family是否把中文字体放在英文字体之前? - HTML 是否声明了
lang="zh-CN"或lang="zh-TW"? - 段落组织是否符合媒介:网页/卡片不机械首行缩进,书籍/公文/古典长文才按模板缩进?
- 中英混排是否有 1/4 字宽间距?