# 标点全规则 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. **第一步**：检查标点能否通过"宽度挤压"塞回前行末
   - 行末全宽标点 → 半宽
   - 连续标点 → 拿掉相邻一侧的空隙
   - 中西间距 1/4 em → 1/8 em
2. **第二步**：仍塞不下，从前行末字推入下行
3. **第三步**：前行多出的空间按拉伸优先级处理
4. **第四步**：最后才平均加大字间距

**口诀**：**挤进只需腾半字宽，推出至少动一字宽；正文排版应尽量少调**。

### 推出后救济：均排（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. 码位优先级
1. **U+2E3A** TWO EM DASH `⸺` —— 正式码位，占 2 字一体，**首选**
2. **U+2014** EM DASH `—` × 2 —— 事实标准，思源字体通过 `ccmp` 替换为长横，**主用**
3. ❌ U+2015 HORIZONTAL BAR `―` —— 简中字库多数会断开
4. ❌ U+2500 BOX DRAWINGS LIGHT HORIZONTAL `─` —— 语义错误（制表符）
5. ❌ U+30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK `ー` —— 日文长音符
6. ❌ U+FF0D FULLWIDTH HYPHEN-MINUS `－` —— 半宽连接符
7. ❌ U+002D HYPHEN-MINUS `-` —— ASCII 连字符

### 2. 字体推荐（破折号正确实现）

**推荐**：
- 思源黑体 / 思源宋体（通过 OpenType `ccmp` 把连续两个 U+2014 替换为整段长横，再用 `locl` 在 CJK 语言下切换为字框居中字形）
- 苹方 PingFang
- HarmonyOS Sans / MiSans

**雷区**（破折号断开 / 顶格 / 下沉）：
- 中易宋体、中易仿宋（破折号"无论如何接不上"）
- 旧版微软雅黑（破折号下沉且双连超过两字宽）
- 华文黑体（破折号顶格不居中）
- 兰亭黑（破折号顶格且不居中）

### 3. 字体优先级陷阱（CSS）

❌ **错误**：
```css
font-family: "Helvetica", "PingFang SC";   /* 英文字体在前 */
```
连续两个 `—` 会优先取 Helvetica 字形，导致下沉、断开、双横之间留白。

✅ **正确（方案 A）**：删掉英文字体，用系统中文字体
```css
font-family: "PingFang SC", "Microsoft YaHei", sans-serif;
```

✅ **正确（方案 B）**：用 `unicode-range` 拆 `@font-face`
```css
@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
<html lang="zh-CN">
```

### 4. 防破折号中间断开

**InDesign**：
1. 段落面板 → "禁止断字" 勾选（默认开）
2. 避头尾规则集 → "禁止分开的字符" → 加入 `U+2014`、`U+2015`、`U+2500`
3. 不要只勾"不换行"（那只是局部手动）

**Word**：
- 中文版"后置标点"里的 `―` 实际是 U+2015，不是 U+2014
- 要让 U+2014 也避头尾，须手动加进"自定义后置标点"
- 终极保险：选中单个 `—`，格式→字体→字符间距→缩放 200%，硬把单 em dash 变成两字宽（来自《排版与校对规范》）

**CSS**：
```html
<!-- 两个 em dash 之间禁止断行 -->
他说—&#8288;—我不去了。
```

### 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+）

```css
.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 字宽间距？
