PreTeXt 调研报告
PreTeXt 调研报告
一、项目概述
基本信息
| 指标 | 详情 |
|---|---|
| 项目名称 | PreTeXt |
| GitHub | https://github.com/PreTeXtBook/pretext |
| 官网 | https://pretextbook.org |
| 创建时间 | 2013-09-21 |
| 最近更新 | 2026-03-29(持续活跃) |
| Stars | 334 |
| Forks | 232 |
| Watchers | 22 |
| Open Issues | 590 |
| 总提交数 | 9,441 |
| 贡献者 | 74 |
| 仓库大小 | 95,854 KB |
| 开源协议 | GPL(核心工具),作者文档不受限 |
| 主要语言 | XSLT (75.6%), JavaScript (7.4%), Python (7.1%), CSS (5.1%), SCSS (4.6%) |
| 核心开发者 | Rob Beezer (@rbeezer), Oscar Levin, Steven Clontz |
一句话介绍
PreTeXt 是一个基于 XML 的学术文档创作与出版系统,专为数学、科学、工程等 STEM 学科设计,支持从单一源文件生成 HTML、PDF、EPUB、Jupyter Notebook、Braille 等多种输出格式。
发展历程
- 2013 年: 项目由 Rob Beezer(华盛顿大学数学系教授)创建,最初名为 "MathBook XML"
- 早期阶段: 专注于数学教材的 XML 标记语言设计,核心是 RELAX-NG 模式定义
- 2017 年: 更名为 PreTeXt(从 MathBook XML 改名),强调其超越数学的通用学术出版能力
- 早期版本: v0.01 (2014/04/30), v0.02 (2015/03/18), v0.03 (2016/04/23) 均以 MathBook XML 名称发布
- 2019-2021 年: 开发 Python CLI 工具(pretext 包),简化构建流程
- 2022-2024 年: 生态持续扩展——VS Code 扩展、Runestone 交互平台集成、EPUB 输出
- 2025-2026 年: 持续活跃开发,已有 80+ 本教材使用 PreTeXt 发布
二、核心功能
功能概览
| 功能 | 说明 | 成熟度 |
|---|---|---|
| XML 标记语言 | 专为学术文档设计的结构化标记 | ⭐⭐⭐⭐⭐ |
| 多格式输出 | HTML、PDF、EPUB、Kindle、Jupyter、Braille、RevealJS | ⭐⭐⭐⭐⭐ |
| 数学排版 | 原生 LaTeX 数学公式支持 | ⭐⭐⭐⭐⭐ |
| 交互元素 | Sage Cell、WeBWorK、GeoGebra、JSXGraph | ⭐⭐⭐⭐ |
| 无障碍访问 | 屏幕阅读器支持、结构化 HTML | ⭐⭐⭐⭐⭐ |
| CLI 工具 | Python 包,项目管理和构建 | ⭐⭐⭐⭐ |
| VS Code 扩展 | 语法高亮、代码片段、CLI 集成 | ⭐⭐⭐ |
| 在线托管 | Runestone 平台集成 | ⭐⭐⭐⭐ |
核心功能详解
1. 单源多格式发布
PreTeXt 的核心设计理念:写一次,到处发布。
┌──→ HTML(在线阅读,交互式)
│
├──→ PDF(印刷版,LaTeX 驱动)
│
├──→ LaTeX 源文件(中间产物)
│
XML 源 ──→├──→ EPUB / Kindle(电子书)
│
├──→ Jupyter Notebook(可执行计算)
│
├──→ RevealJS 幻灯片
│
├──→ Braille(盲文输出)
│
├──→ WeBWorK(在线作业)
│
└──→ Custom(自定义格式)
这种能力通过 XSLT 转换实现——仓库中 XSLT 代码占 75.6%,是整个系统的技术核心。
2. 学术文档标记语言
PreTeXt 定义了一套完整的 XML 词汇表,涵盖学术文档的所有结构元素:
<pretext>
<book xml:id="my-book">
<title>我的数学教材</title>
<frontmatter>
<preface>前言内容</preface>
</frontmatter>
<chapter xml:id="ch-intro">
<title>引言</title>
<section xml:id="sec-basics">
<title>基本概念</title>
<p>这是一个段落,可以包含
<m>x^2 + y^2 = r^2</m> 这样的数学公式。
</p>
<theorem xml:id="thm-pythagorean">
<title>勾股定理</title>
<statement>
<p>直角三角形中,<m>a^2 + b^2 = c^2</m>。</p>
</statement>
<proof>
<p>证明过程...</p>
</proof>
</theorem>
</section>
</chapter>
</book>
</pretext>
关键标记元素包括:
- 文档结构: <book>, <article>, <chapter>, <section>, <subsection>
- 数学内容: <m> (行内), <me> (行间公式), <men> (编号公式)
- 证明结构: <theorem>, <proof>, <lemma>, <corollary>
- 练习系统: <exercise>, <hint>, <answer>, <solution>
- 交叉引用: <xref> 自动生成编号和链接
- 多媒体: <image>, <video>, <audio>, <interactive>
- 程序代码: <cd>, <cline> 支持语法高亮
3. 交互式元素
PreTeXt 原生支持多种交互组件,无需额外配置:
| 组件 | 用途 | 标记 |
|---|---|---|
| Knowls | 可折叠内容面板(PreTeXt 独有) | 任何块级元素可启用 |
| Sage Cell | 可执行 Python/Sage 代码 | <sage> |
| WeBWorK | 在线作业系统 | <webwork> |
| GeoGebra | 动态几何 | <geogebra> |
| JSXGraph | 交互式几何图形 | <jsxgraph> |
| Asymptote | 3D 图形 | <asymptote> |
| MyOpenMath | 在线作业系统 | <myopenmath> |
| YouTube | 视频嵌入 | <video> |
4. 无障碍设计
无障碍访问是 PreTeXt 的核心设计原则(第 11 条指导原则): - HTML 输出完全支持屏幕阅读器 - 数学公式使用 MathJax 渲染,可被辅助技术读取 - 文档结构语义化,导航清晰 - 盲文输出是原生支持的格式
三、安装配置
环境要求
| 组件 | 用途 | 是否必须 |
|---|---|---|
| Python 3.10+ | CLI 工具运行(v2.37.2) | 是 |
| TeXLive | PDF 输出 | 需要PDF时 |
| pdftoppm / Ghostscript | 图片处理 | 需要图片时 |
安装方式
# 安装 PreTeXt CLI(当前版本 2.37.2)
python -m pip install --user pretext
# 验证安装
pretext --version
# 如果 pretext 不在 PATH 中
python -m pretext --version
# 查看帮助
pretext --help
升级
# 方法1: pip 升级
python -m pip install --user --upgrade pretext
# 方法2: 使用内置升级命令
pretext upgrade
四、架构设计
整体架构
┌──────────────────────────────────────────────────────────────┐
│ PreTeXt 系统架构 │
├──────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌──────────────┐ │
│ │ Author │ │ RELAX-NG │ │ XSLT │ │
│ │ XML 源文件 │────→│ Schema │ │ 转换引擎 │ │
│ │ (.ptx) │ │ (验证器) │ │ │ │
│ └─────────────┘ └─────────────┘ └──────┬───────┘ │
│ │ │
│ ┌───────────────────┼───────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────┐ ┌────────┐ ┌──┐ │
│ │ HTML │ │ PDF │ │..│ │
│ │ 输出 │ │ 输出 │ │ │ │
│ └────┬────┘ └────────┘ └──┘ │
│ │ │
│ ┌────────┼────────┐ │
│ ▼ ▼ ▼ │
│ ┌────────┐┌────────┐┌────────┐ │
│ │ MathJax││ CSS ││ JS │ │
│ │ 数学渲染││ 样式表 ││交互组件│ │
│ └────────┘└────────┘└────────┘ │
│ │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ PreTeXt CLI (Python) │ │
│ │ 项目管理 │ 构建命令 │ 资产生成 │ 部署支持 │ │
│ └────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
核心模块
PreTeXt 采用双组件架构:
| 组件 | 仓库 | 职责 |
|---|---|---|
| PreTeXtBook/pretext(核心) | GitHub 主仓库 | XSLT 转换引擎,XML Schema 定义 |
| PreTeXtBook/pretext-cli(CLI) | 独立 Python 包 | 项目管理、构建、部署的用户界面 |
1. RELAX-NG Schema(模式定义)
位于 schema/ 目录,是 PreTeXt 的心脏。定义了所有合法的 XML 元素和属性,确保文档结构正确。
2. XSLT 转换引擎(格式转换)
位于 xsl/ 目录,占代码库 75.6%。负责将 XML 源文件转换为各种输出格式:
- pretext-html.xsl → HTML 输出
- pretext-latex.xsl → LaTeX/PDF 输出
- pretext-epub.xsl → EPUB 输出
- 其他格式转换表
3. PreTeXt CLI(命令行工具)
独立的 Python 包(v2.37.2),提供项目管理、构建、生成等功能。通过 pip install pretext 安装。
CLI 内部结构:
- pretext/cli.py — Click 框架的 CLI 入口
- pretext/project.py — 项目模型(基于 pydantic-xml 解析 project.ptx)
- pretext/constants.py — 格式、资源、常量定义
- pretext/core/ — 预取的核心 XSLT 引擎副本
- pretext/server.py — 本地 HTTP 预览服务器
- pretext/plastex.py — LaTeX → PreTeXt 转换(实验性)
核心依赖: lxml, requests, GitPython, click, PyPDF2, pyMuPDF, playwright, pydantic-xml, qrcode, plastex, jinja2
4. 前端资源
css/- HTML 输出的样式表js/- JavaScript 交互组件scss/- SCSS 源文件
数据流(构建管线)
1. 解析 project.ptx 配置
│
▼
2. (可选)生成资源(图片、交互元素等)
│
▼
3. Schema 验证 XML 合法性
│
▼
4. XSLT 转换为目标格式
│
├→ HTML: MathJax 渲染公式 + CSS 样式 + JS 交互
├→ PDF: LaTeX 中间文件 → XeLaTeX 编译
├→ EPUB: EPUB 容器打包
└→ 其他格式...
│
▼
5. 输出到配置的目录
│
▼
6. (可选)本地预览服务 或 部署到 GitHub Pages
资产生成(Asset Generation)
PreTeXt 自动从 XML 源文件中生成多种类型的资源:
| 资产类型 | 使用场景 |
|---|---|
webwork |
WeBWorK 在线练习 |
latex-image |
TikZ/PGF 绘图(HTML/EPUB 输出时需要光栅化) |
sageplot |
Sage 绘图 |
asymptote |
Asymptote 3D 图形 |
prefigure |
Prefigure 图形 |
youtube |
YouTube 视频缩略图 |
codelens |
代码步进展示 |
interactive |
交互元素静态替代 |
mermaid |
Mermaid 流程图 |
qrcode |
二维码生成 |
五、使用场景
适用场景
| 场景 | 说明 | 典型用户 |
|---|---|---|
| 数学教材编写 | 最大的使用群体 | 大学教授 |
| OER(开放教育资源) | 免费、可定制的教材 | 教育机构 |
| STEM 学术文档 | 科学、工程文档 | 研究人员 |
| 交互式教学内容 | 在线课程材料 | 在线教育平台 |
| 多格式出版 | 需要同时输出多种格式 | 出版社 |
不适用场景
- 需要 WYSIWYG 编辑的场景(PreTeXt 是纯标记语言)
- 非学术性文档(小说、博客等不适合)
- 快速原型/草稿(XML 标记较重)
- 对排版有极致精确控制需求的场景(应使用 LaTeX)
典型案例
根据 PreTeXt 官方目录(pretextbook.org/catalog),已有 80 个项目使用 PreTeXt:
| 类别 | 数量 | 代表项目 |
|---|---|---|
| 数学 | 67 | Active Calculus, Understanding Linear Algebra, A First Course in Linear Algebra |
| 计算机科学 | 2 | — |
| 工程 | 2 | — |
| 说明文 | 2 | — |
| 文档 | 3 | — |
| 其他 | 4 | 音乐、写作等 |
许可证分布: 46 CC(知识共享)、24 GFDL(GNU 自由文档)、10 All Rights Reserved
知名教材: - Active Calculus —广泛使用的微积分教材 - Understanding Linear Algebra — 线性代数教材 - Abstract Algebra: Theory and Applications — 抽象代数经典 - Mathematical Reasoning: Writing and Proof — 数学推理 - ORCCA — Open Resources for Community College Algebra
六、最佳实践
推荐做法
- 使用版本控制: 将
.ptx文件纳入 Git 管理 - 善用 CLI 工具: 使用
pretext命令管理项目,不要手动运行 XSLT - 遵循 Schema: 用支持 XML 的编辑器(VS Code + 扩展)获得自动补全
- 渐进式编写: 先搭好文档结构,再填充内容
- 利用交互元素: 对于数学教材,Sage Cell 和 WeBWorK 能极大提升教学效果
- 定期构建检查: 每完成一个章节就构建一次,及早发现结构问题
避坑指南
- 不要手动修改生成文件: HTML/PDF 是自动生成的,修改后会被覆盖
- 注意 XML 语法: XML 比 LaTeX 更严格,标签必须闭合,大小写敏感
- 公式用 LaTeX 语法: 在
<m>和<me>中使用 LaTeX 数学语法,不要用 Unicode 字符 - 不要过度嵌套: PreTeXt 有明确的文档结构层次,不要随意嵌套
- 图片资源管理: 使用
pretext generate管理图片资源,不要手动复制
七、对比分析
PreTeXt vs LaTeX
| 维度 | PreTeXt | LaTeX |
|---|---|---|
| 源格式 | XML 标记语言 | TeX 宏语言 |
| 输出格式 | HTML, PDF, EPUB, Jupyter, Braille, RevealJS | 主要 PDF |
| 数学排版 | 通过 LaTeX 语法 + MathJax | 原生,最强 |
| 在线阅读 | 原生 HTML,交互式 | 需第三方工具 |
| 无障碍 | 核心设计原则,全面支持 | 需额外工具 |
| 学习曲线 | XML 语法 + PreTeXt 词汇表 | TeX 宏语言 |
| 交互性 | 原生支持多种交互组件 | 有限 |
| 生态成熟度 | 成长中(80+ 项目) | 非常成熟(40 年历史) |
| 适用场景 | 教材、OER、多格式出版 | 论文、精确排版 |
| 编辑器支持 | VS Code 扩展 | 几乎所有编辑器 |
PreTeXt vs AsciiDoc
| 维度 | PreTeXt | AsciiDoc |
|---|---|---|
| 设计目标 | 学术/数学文档 | 通用技术文档 |
| 语法风格 | XML(显式标签) | 轻量标记 |
| 数学支持 | 原生 LaTeX 数学 | 需扩展 |
| 输出格式 | 更多(含 Braille) | HTML, PDF, EPUB 等 |
| 学习曲线 | 较高 | 较低 |
| 适用场景 | 数学/STEM 教材 | 技术文档、手册 |
PreTeXt vs Markdown + MathJax
| 维度 | PreTeXt | Markdown + MathJax |
|---|---|---|
| 文档结构 | 严格语义化 | 灵活但松散 |
| 学术元素 | 定理、证明、练习原生支持 | 需自定义 |
| 交叉引用 | 自动编号和链接 | 需工具支持 |
| 多格式 | 原生支持 | 需第三方工具 |
| 易用性 | 学习成本较高 | 非常容易 |
PreTeXt vs Bookdown / Quarto
| 维度 | PreTeXt | Bookdown / Quarto |
|---|---|---|
| 源格式 | XML | R Markdown / Markdown |
| 计算集成 | Sage, WeBWorK | R, Python, Julia(原生代码执行) |
| 输出格式 | HTML, PDF, EPUB, Braille, slides, Jupyter | HTML, PDF, EPUB, slides, DOCX, ODT |
| 交互元素 | Knowls, Sage Cell, WeBWorK | Shiny apps, 交互图表, HTML widgets |
| 数学渲染 | MathJax (HTML), LaTeX (PDF) | MathJax/KaTeX |
| 语义标记 | 深度、正式(Schema 约束) | 有限(基于 Markdown) |
| 无障碍 | 核心设计原则(含盲文) | 逐步改善但非核心关注 |
| 可重复研究 | 有限 | 强(文档内执行代码) |
| 社区规模 | 小(STEM 数学专注) | 大(R/数据科学社区) |
| 盲文输出 | 支持 | 不支持 |
选型建议
- 选择 PreTeXt: 编写数学/STEM 教材,需要多格式输出,关注无障碍
- 选择 LaTeX: 写研究论文,需要精确排版控制,已有 LaTeX 经验
- 选择 AsciiDoc: 写技术文档、手册,不需要复杂数学
- 选择 Markdown: 简单文档、博客,快速上手优先
- 选择 Bookdown/Quarto: 数据科学内容,需要代码执行(R/Python/Julia),重视可重复研究
八、总结
优势
- 单源多格式: 一次编写,多种输出,极大地降低了多格式出版的成本
- 学术语义: 标记语言直接表达学术概念(定理、证明、练习),不是格式指令
- 无障碍优先: 从设计之初就是核心原则,不是事后补充
- 交互式教学: 原生集成 Sage、WeBWorK 等教学工具,在线教育体验优秀
- 开放生态: GPL 协议,80+ 实际项目,活跃的社区
- 数学排版: 继承 LaTeX 的数学排版优势,同时获得现代 Web 能力
劣势
- 学习曲线: XML 语法 + PreTeXt 词汇表,对 LaTeX 用户需要适应
- XML 冗长: 相比 Markdown/AsciiDoc,标记较为冗长
- 生态规模: 相比 LaTeX 40 年的积累,PreTeXt 生态仍在成长
- 工具链依赖: PDF 输出需要 TeXLive,完整功能依赖较多外部工具
- 编辑器支持: 不如 LaTeX 那样有广泛的编辑器支持
- 社区规模: 334 Stars,74 贡献者,相比主流项目较小
最终建议
PreTeXt 是一个非常专注和专业的工具——它不试图成为通用文档系统,而是精确地服务于学术出版(尤其是数学教育)这个细分领域。在这个领域内,它是目前最优秀的解决方案之一:
- 推荐使用: 正在编写数学/STEM 教材、需要多格式输出、关注 OER 和无障碍的教育工作者
- 谨慎考虑: 非 STEM 文档、已有大量 LaTeX 积累的团队、需要快速上手的场景
- 值得关注: 即使当前不使用,PreTeXt 代表的"语义标记 + 多格式发布"理念值得所有技术作者学习
参考资料
- GitHub 仓库: https://github.com/PreTeXtBook/pretext
- 官方网站: https://pretextbook.org
- PreTeXt CLI: https://github.com/PreTeXtBook/pretext-cli
- VS Code 扩展: https://marketplace.visualstudio.com/items?itemName=pretext-tools.pretext-tools
- 项目目录: https://pretextbook.org/catalog.html
- 文档指南: https://pretextbook.org/doc.html
- Runestone 交互平台: https://runestone.academy