Appearance
字体与排版
可调参数
| 参数 | 范围/行为 | 默认值 |
|---|---|---|
字号 fontSize | 10–68 pt | 18pt |
字体 fontName | 系统及用户可用字体,空字符串表示跟随系统字体 | 系统字体 |
行距 lineSpacingMultiplier | 倍数,1.0 = 单倍行距;实际行距 = fontSize * (multiplier - 1.0) | 1.15 |
段距 paragraphSpacing | 只应用在段落之间,单位 pt | 0pt |
字距 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、系统字体替换和动态 字号下都要重新分页。
行高下限
不同语言画像有各自的最小行高倍数和段间距下限,字号/行距怎么调都不会低于这个值,避免 行距设得过小导致中文字符重叠或英文字母升降部被裁切:
| 画像 | 最小行高倍数 | 固定段间距 |
|---|---|---|
中文 .cjk | 1.42 | 4pt |
英文 .english | 1.45 | 5pt |
混排 .mixed | 1.42 | 4pt |
目录/元信息 .contentsOrTOC | 1.35 | 10pt |
中文画像额外强制按字符换行(.byCharWrapping)而不是按词换行,避免整段引号、书名号 之类的标点被换行规则孤立成单独一行。
两端对齐
正文使用同一文本容器宽度进行测量和渲染,不能分页时用一个宽度、显示时再减第二次边距, 否则左右不齐或末行被裁剪。
信息栏和边距
页眉/页脚开启时,其高度从正文 viewport 中扣除;关闭时额外 chrome inset 必须为 0,正文 使用整个 reader container。用户边距独立于安全区和信息栏。
重排
字体、字号、边距、方向、窗口尺寸、信息栏显示状态变化会触发去抖重排。语义完全相同的 分页结果不应因 UUID 变化强制 remount——每次重新分页都会生成全新的页面对象(哪怕字符内容 完全没变),页面身份比较因此不能只看这个瞬时 ID,要看页面覆盖的字符范围是否真的发生了 变化,这一点在分页与连续滚动的诊断字段里也有体现。
