3.2 KiB
3.2 KiB
Emacs-KP: Knuth-Plass 排版算法 Emacs 实现
Emacs-kp 实现了 Knuth-Plass 最优断行算法,并扩展支持 CJK(中日韩)与拉丁文混合排版。
演示
特性
- 全局最优断行:使用 Knuth-Plass 算法寻找段落的全局最优布局。
- CJK 支持:完美支持中日韩与拉丁文的混合排版。
- 连字符断词:使用 Frank Liang 算法和特定语言词典。
- 属性保留:排版后保留字体、颜色等所有 Emacs 文本属性。
- C 模块加速:可选的多线程 C 模块提供 16-29 倍性能提升。
- 自动字体处理:根据实际字体度量自动计算间距参数。
用户指南
快速开始
-
安装依赖: 建议安装 C 编译器以构建高性能模块。
-
配置与使用:
(add-to-list 'load-path "/path/to/emacs-kp")
(require 'ekp)
;; 基本用法:将文本按 600 像素宽度对齐
(ekp-pixel-justify "这是一段测试文本..." 600)
;; 范围对齐:寻找 400-800 像素范围内的最优宽度
(ekp-pixel-range-justify "测试文本" 400 800)
配置详情
语言设置
ekp-latin-lang (默认: "en_US")
用于断词的主要拉丁语言。支持的语言位于 dictionaries/ 目录:
en_US,en_GB- 英语de_DE- 德语fr- 法语es- 西班牙语- 等等...
(setq ekp-latin-lang "de_DE")
间距参数
使用 ekp-param-set 配置间距(像素)。若不设置,将根据字体自动计算。
(ekp-param-set lws-ideal lws-stretch lws-shrink
mws-ideal mws-stretch mws-shrink
cws-ideal cws-stretch cws-shrink)
| 参数组 | 说明 |
|---|---|
lws-* |
拉丁词间距 (Latin Word Space) |
mws-* |
中西文间距 (Mixed Word Space) |
cws-* |
CJK 字符间距 (CJK Word Space) |
K-P 算法参数
| 变量 | 默认值 | 说明 |
|---|---|---|
ekp-line-penalty |
10 | 每行断行的基础惩罚 |
ekp-hyphen-penalty |
50 | 连字符断词的惩罚 |
ekp-adjacent-fitness-penalty |
100 | 相邻行松紧度不一致的惩罚 |
ekp-last-line-min-ratio |
0.5 | 末行最小填充比例 |
ekp-looseness |
0 | 目标行数偏移(±n 行) |
C 动态模块 (推荐)
对于长文本,建议使用 C 模块以获得显著的性能提升。
构建
cd ekp_c
make
要求:C11 编译器,Emacs 27.1+
加载
(require 'ekp-utils)
;; 加载并初始化 C 模块
(ekp-c-module-load)
;; 可选:为 C 模块加载断词字典
(ekp-c-load-dictionary "en_US")
加载后,ekp-use-c-module 默认为 t,所有排版函数将自动使用 C 模块进行加速。
算法与架构
关于内部架构、算法细节和 API 参考的详细说明,请参阅 开发者指南。
致谢
- 核心算法: "Breaking Paragraphs into Lines" by Donald E. Knuth and Michael F. Plass (1981)
- 断词算法: 改编自 Pyphen,使用 Liang 算法
- 词典: Hunspell 断词模式