从 HTMLBook 到 PDF 与 Mobi:官方三套 CSS 样式表的应用全攻略
【免费下载链接】HTMLBookLet's write books in HTML!项目地址: https://gitcode.com/gh_mirrors/ht/HTMLBook
HTMLBook 是一个开源的、基于 XHTML5 的电子书写作与出版标准,项目口号是"Let's write books in HTML!"。它允许你只维护一份 HTML 源文件,借助官方自带的 CSS 样式表与 XSLT 转换脚本,就能同时产出 EPUB、Mobi(Kindle)与 PDF 三种主流格式。本文为你梳理官方三套 CSS 样式表的职责分工、核心排版要点与接入 XSLT 流水线的完整方法,让新手也能快速上手。
一、HTMLBook 是什么:一次编写,多渠道出版
HTMLBook 的核心理念有三个:书籍是永恒的、HTML 是未来可预见的标记语言、单一来源的多格式输出永远有价值。因此 HTMLBook 被设计为:
- XHTML5 的子集:所有 HTMLBook 都是 XHTML5,但并非所有 XHTML5 都是 HTMLBook;
- 语义化图书结构:通过
data-type属性表达chapter、part、appendix、titlepage等图书语义,例如section[data-type="chapter"]; - 可用 XML Schema 校验:主 Schema 文件是 schema/htmlbook.xsd,配合
xmllint即可在命令行完成校验。
而样式层面,HTMLBook 官方直接采用CSS 编写样式表,这正是本文的主角——stylesheets/目录下的三套官方样式表。
二、官方三套 CSS 样式表速览:epub、mobi、pdf 各司其职
项目在 stylesheets/ 目录下按输出格式拆分为三个子目录:
| 样式表 | 路径 | 行数 | 面向场景 |
|---|---|---|---|
| EPUB | stylesheets/epub/epub.css | 约 520 行 | 通用电子书阅读器 |
| Mobi | stylesheets/mobi/mobi.css | 约 565 行 | Amazon Kindle 设备 |
| stylesheets/pdf/pdf.css | 约 167 行 | 分页排版(配合 PrinceXML / AntennaHouse) |
三者的定位差异很大:EPUB 与 Mobi 样式表聚焦「流式排版」,处理段落缩进、扉页分页、目录样式;而 PDF 样式表则聚焦「分页排版」,处理@page规则、页码计数器与页眉页脚。下面逐一讲解。
三、EPUB 样式表应用:epub.css 排版要点
epub.css 是 EPUB 阅读器的首选样式,几个值得注意的设计:
- 不内嵌字体:样式表头部明确注释「不包含任何
@font-face处理」,完全依赖阅读设备自带的 serif 与 sans-serif 系统字体,避免字体文件撑大 EPUB 体积; - 正文段落风格:
p, dd统一设置text-indent: 20px的首行缩进,同时通过h1 + p选择器让「标题后的首段不缩进」,符合传统书籍排版习惯; - 前置页面分页:
section[data-type="titlepage"]、copyright-page、dedication均设置page-break-after: always,保证每个前置页独立成页; - 目录嵌套列表:目录被设计为
nav[data-type="toc"]内的一系列嵌套li,并通过list-style-type: none去掉列表符号。
如果你的书以段落文本为主、希望阅读器端有更好的兼容性,直接用这套官方样式即可。
四、Mobi 样式表应用:为 Kindle 优化
stylesheets/mobi/mobi.css 与 EPUB 版共享大量基础规则(正文缩进、前置页分页、目录样式),但它针对 Kindle 设备的渲染特性做了更多补充,总行数也更多。典型差异包括:
- 针对 Kindle 旧设备的 HTML 结构兼容处理,例如将部分
<section>降级为<div>以保证渲染稳定; - 更细化的列表、引用与代码块样式,适配 Kindle 较窄的屏幕宽度;
- 保留标题层级(
sect1–sect3)的选择器写法,确保各级标题在 Kindle 上层次清晰。
实操建议:转换 Mobi 时,将 EPUB 生成的 XHTML 与mobi.css一起打包进 Kindle 转换工具(如 KindleGen / Calibre),即可获得更贴近纸质书的阅读体验。
五、PDF 样式表应用:pdf.css 的分页排版艺术
pdf.css 是三套中结构最「硬核」的,它面向的是分页排版工具(如PrinceXML或AntennaHouse),核心手法包括:
- 页面尺寸:
@page { size: 7in 9in; margin: 0.75in 1in; }定义默认纸张规格; - 命名页:为
titlepage、copyright、toc、foreword、preface、chapter、appendix、glossary、index等图书板块分别声明命名页,例如section[data-type="chapter"] { page: chapter; page-break-before: always; }; - 页码计数器:利用
@page chapter:right { @bottom-right-corner { content: counter(page) } }在右页右下角输出页码,目录与前言使用小写罗马数字lower-roman; - 正文细节:
body[data-type="book"]开启hyphens: auto自动断词,章节标题关闭断词,图片max-width: 100%防止溢出页面。
六、把样式表接入 XSLT 转换流水线
样式表不会自动生效,需要借助htmlbook-xsl目录下的 XSLT 脚本把它接进转换流程。理解这条链路很关键:
- htmlbook.xsl是主模板,导入
common.xsl并包含 param.xsl、tocgen.xsl、indexgen.xsl、xrefgen.xsl,负责目录、索引、交叉引用的自动生成; - param.xsl集中了全部参数,其中
css.filename参数会把指定的 CSS 以<link>形式嵌入输出 HTML 的<head>——这正是接入三套样式表的入口; - epub.xsl专用于生成 EPUB,它导入 chunk.xsl 做分章拆分,并包含 ncx.xsl 与 opf.xsl 生成 EPUB 的导航与元数据文件。
最快的配置方法:在调用 XSLT 时把css.filename指向stylesheets/epub/epub.css或stylesheets/pdf/pdf.css,转换出的 HTML 即会自动引用对应样式表。
七、快速上手:用官方示例跑通全流程
想最快看到效果,可以直接使用项目自带的示例图书 samples/htmlbook.html。这份示例完整展示了从封面、扉页、版权页、献词、目录到章节、附录的完整图书结构,是验证三套样式表的最佳素材。项目还附带 samples/markdown/open_government_sample.md 及其 HTML 版本,可以对照学习从 Markdown 到 HTMLBook 的写作方式。
示例中这张穿黄色雨衣的卡通企鹅插图(位于 samples/images/rain_penguin.png)正是用来测试图片在 EPUB、Mobi 与 PDF 三种输出中的排版效果——你可以用它快速验证img { max-width: 100% }等图片规则是否生效。
八、常见问题与最佳实践
Q1:三套样式表可以混用吗?不建议。EPUB 与 Mobi 属于流式排版,PDF 属于分页排版,混用会导致@page规则在阅读器上失效。
Q2:想自定义样式怎么办?最优雅的方式是复制官方 CSS 后做增量修改,而不是直接改动官方文件——这样升级项目时不会丢失自定义样式。
Q3:PDF 输出需要什么工具?pdf.css依赖支持 CSS Paged Media 的排版引擎,官方注释中明确提到 AntennaHouse 与 PrinceXML,普通浏览器直接打开无法获得分页效果。
最佳实践总结:源文件始终维护一份 HTMLBook;EPUB 用 epub.css,Kindle 用 mobi.css,纸质印刷用 pdf.css + 分页引擎;用 schema/htmlbook.xsd 校验源文件,用 param.xsl 的css.filename参数完成样式接入。掌握这套组合拳,你的 HTML 书稿就能轻松走向所有主流阅读渠道。
【免费下载链接】HTMLBookLet's write books in HTML!项目地址: https://gitcode.com/gh_mirrors/ht/HTMLBook
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考