Skip to content

字体与排版

可调参数

参数范围/行为默认值
字号 fontSize10–68 pt18pt
字体 fontName系统及用户可用字体,空字符串表示跟随系统字体系统字体
行距 lineSpacingMultiplier倍数,1.0 = 单倍行距;实际行距 = fontSize * (multiplier - 1.0)1.15
段距 paragraphSpacing只应用在段落之间,单位 pt0pt
字距 letterSpacing通过 attributed string kern 控制0
首行缩进 firstLineIndent布尔开关,实际缩进量按字号动态换算(见下)开启
对齐 textAlignment / textFullJustify左对齐、两端对齐等左对齐
边距leftMargin/rightMargin/topMargin/bottomMargin 独立设置,nil 时回退到旧版 horizontalMargin/verticalMargin水平 20pt、垂直 6pt
翻页模式 pageFlipMode.slide(仿真翻页)/ .scroll(连续滚动).slide

水平边距默认 20pt 是刻意和 ReadingTheme.horizontalPadding 对齐的——早期两处默认值不一致 (16pt vs 20pt),会导致阅读页首次渲染时用一套边距分页,主题加载完成后又用另一套边距 重新分页,肉眼表现为内容突然跳动。改动排版相关默认值时,要连带检查主题系统里是否有第二 份"看起来无关但语义相同"的默认值。

首行缩进

中文“两格”不是固定像素,而是按当前字号动态换算:中文正文按 fontSize × 2.0,英文正文按 fontSize × 1.5,中英混排按 fontSize × 1.8,目录/元信息页强制不缩进。也就是说 18pt 字号 下中文首行缩进约 36pt,字号调到 24pt 后自动变成 48pt——缩进应依据当前字体/字号转换,并 作用在最终 paragraph style 的 firstLineHeadIndent。混合 CJK/Latin、系统字体替换和动态 字号下都要重新分页。

行高下限

不同语言画像有各自的最小行高倍数和段间距下限,字号/行距怎么调都不会低于这个值,避免 行距设得过小导致中文字符重叠或英文字母升降部被裁切:

画像最小行高倍数固定段间距
中文 .cjk1.424pt
英文 .english1.455pt
混排 .mixed1.424pt
目录/元信息 .contentsOrTOC1.3510pt

中文画像额外强制按字符换行(.byCharWrapping)而不是按词换行,避免整段引号、书名号 之类的标点被换行规则孤立成单独一行。

两端对齐

正文使用同一文本容器宽度进行测量和渲染,不能分页时用一个宽度、显示时再减第二次边距, 否则左右不齐或末行被裁剪。

信息栏和边距

页眉/页脚开启时,其高度从正文 viewport 中扣除;关闭时额外 chrome inset 必须为 0,正文 使用整个 reader container。用户边距独立于安全区和信息栏。

重排

字体、字号、边距、方向、窗口尺寸、信息栏显示状态变化会触发去抖重排。语义完全相同的 分页结果不应因 UUID 变化强制 remount——每次重新分页都会生成全新的页面对象(哪怕字符内容 完全没变),页面身份比较因此不能只看这个瞬时 ID,要看页面覆盖的字符范围是否真的发生了 变化,这一点在分页与连续滚动的诊断字段里也有体现。

Readori 使用与开发文档