
Pretext这个名字常写作PreTeXt在中文技术写作圈里提到得还不算多。但如果你正在写教材、讲义、技术文档或者需要把同一套内容同时输出成网页版、PDF版和电子书版那这个开源的文本排版引擎就值得你花几分钟认真了解一下。它不是Word那种“所见即所得”也不是LaTeX那种纯排版语言而是走了一条更“结构化”的路用一套带语义的源文件驱动不同的引擎生成不同形态的文档。我第一次在别人的项目里看到Pretext生成的网页教材时感受很深页面左侧有清晰章节导航数学公式能缩放定理和例题可以交叉引用代码块还有高亮更关键的是同一份源文件还能直接构建出一本排版规矩的PDF。这意味着写完一份内容再也不用为了不同输出平台反复复制粘贴、改格式。这篇文章我就来把Pretext的概念、原理、上手流程和踩坑经验一次讲清楚。1. 先搞清楚Pretext解决的是写作中的哪种痛1.1 写作与排版的两难为什么常规工具总差一口气平时写技术内容或教学材料我们常用的方案无非几种要么开一个Word文档边写边调字号、行距、页眉页脚要么选择Markdown用轻量语法把内容先写下来等最后再想办法转成PDF或者网页要么直接用LaTeX把排版控制做到极致。这几种路线各有各的难受之处。Word的排版能力很强但“内容”和“呈现”绑得太死我这几年折腾下来最大的感受是Word文件一旦要换一套样式或换成另一份文档等于从头来一遍而且多人协同修改时格式冲突能把人逼疯。Markdown虽然轻快但它的结构表达非常有限写写博客没问题一旦要表达“这是一道例题”“这是一个定理”“这是本章要掌握的概念”它就无能为力了。LaTeX确实专业但文档里到处是\begin{...}和\end{...}写多了容易陷入版式细节而且同一份内容想输出成网页版时还得另起炉灶。Pretext的出发点就是想在这几类工具之间找到一个平衡内容作者不必关心最终长什么样但同时又比Markdown更“懂”文章结构。1.2 单一内容来源多格式输出Pretext的设计哲学这个文本排版引擎的核心设计思路行业里叫single-source publishing翻译过来就是“单一内容来源多格式输出”。你只维护一份源文件剩下的HTML网页、PDF打印版、EPUB电子书都通过编译流程自动生成。这个理念听起来好像不算稀奇Pandoc也能做类似的事。但Pretext和普通转换工具不太一样的地方在于它的源文件是用一套专门设计的XML标签写的。什么意思呢就是你在写作时不是在写“加粗”“居中”“字号小二”而是在写“这一段是定理”“这个是交叉引用”“这里放一张带题注的图”。排版引擎拿到这些语义标签后会针对不同输出格式自动套用合适的样式。对我这种经常需要维护多份版本的人来说这个特性简直救命。以前我更新一章内容要同步去改网页、Word和PDF改漏一处就出乱子。现在只需要改一遍.ptx源文件再跑一次构建命令就能得到所有目标格式。1.3 不吹不黑哪些人适合用Pretext每个工具都有它的适用范围Pretext不是万能药。从我的使用经验看下面这些人可能会很受益高校教师、培训机构讲师需要持续更新讲义和教材。数学、物理、计算机等理工科内容的写作者因为有大量公式、定理、习题需要自动编号和交叉引用。想要做开源技术书籍、且希望网站和PDF同时保持一致的作者。对无障碍阅读、网页可访问性有要求的出版项目。反过来如果你只是随手记点笔记、写个非结构化的博客文章或者需要做出海报、宣传册这类极度依赖视觉设计的内容Pretext的“结构化”反而会成为负担不如直接用Markdown或InDesign来得痛快。2. 核心细节拆解PTX源文件与排版引擎的运作方式2.1 PTX标签的本质你在写结构不是在调格式很多人第一次打开.ptx文件看到密密麻麻的XML标签会被吓一跳觉得这比Markdown复杂多了。我的看法是不要把PTX当成“复杂版Markdown”而要把它理解成“一本书的骨架说明书”。举个例子。你在写普通Markdown时一段内容可能就是**定理1勾股定理** 在直角三角形中两直角边的平方和等于斜边的平方。而如果在Pretext里描述同样的内容思路会完全不同theorem title勾股定理/title statement p在直角三角形中两直角边的平方和等于斜边的平方。/p /statement /theorem表面上看起来是变复杂了但关键信息变多了机器能认出这是个“定理”而且引擎会自动帮你编号。你不用操心它到底是“定理1”还是“定理2.3”只要引用它的逻辑位置即可。Pretext的源文件其实是一种高度语义化的XML语言完整名称是PreTeXt Markup简称PTX。这里的每个标签都有明确的出版含义比如book代表一本书chapter代表章section代表节theorem代表定理exercise代表习题figure代表图表对象。排版引擎不会把文字直接“倒”进页面而是先理解结构然后决定如何呈现。2.2 一个最小PTX文档的结构演示为了让你对Pretext有直观体感我给一个极简的、符合实际写法的源文件片段。正式使用时命名空间的版本号以官方模板为准我们这里主要理解结构?xml version1.0 encodingUTF-8? book xml:langzh-CN xmlnshttps://pretextbook.org/v0.8 title我的第一本Pretext小册子/title preface title写在前面/title p这是一段前言文字。/p /preface chapter title第一个章节/title section title从零开始/title p这是正文段落。你可以在这里写任何想表达的内容。/p /section /chapter /book看到没这里完全没有“样式”层面的东西没有颜色、没有字号、没有行距、没有页边距。有的只是文字结构和层次关系。至于最终显示成什么样那是Pretext在编译时根据输出格式自动决策的。这个设计解决了另一个长期让我头疼的问题内容里面混进样式之后换主题的成本极其高。用了PTX之后内容就是纯内容样式完全走另外的模板和配置文件。今天想生成深色阅读模式明天想换成出版社模板都不会动到写作的内容。2.3 排版的魔法Pretext如何从PTX生成HTML与PDFPretext本身不只是一个格式规范它还带有一套完整的命令行构建工具。构建流程大致是这样的PTX源文件进入引擎之后先被解析成文档对象树然后根据你指定的输出目标调用不同的“渲染后端”。渲染成HTML网页时Pretext会生成多页面站点内置目录树、搜索索引、响应式布局公式用MathJax动态渲染JavaScript交互组件也被打包进来。渲染成PDF时它内部会把PTX转换成LaTeX源码再调用XeLaTeX完成最后的排版。这里很巧妙的一点是你写的源文件全程不接触LaTeX但输出的PDF却拥有LaTeX级别的排版质量。对我来说这种“后端可替换”的架构非常舒服。写作的人不需要关心LaTeX的宏包冲突问题等引擎维护者去解决就行。使用者只需要专注一件事把内容写清楚、写规范。3. 全新上手指南跑通一个Pretext项目3.1 安装准备Python、pipx和可选的LaTeXPretext的命令行工具基于Python开发官方推荐的安装方式是通过pipx目的是让工具和系统Python环境隔离避免依赖互相污染。如果你还没装pipx可以先快速装一下python3 -m pip install --user pipx python3 -m pipx ensurepath然后安装Pretext命令行工具pipx install pretextbook安装完成后验证一下是否成功pretext --version如果你打算只生成网页版和EPUB那到此为止工具链就齐了。但如果要构建PDF还需要准备一套可用的LaTeX发行版通常推荐TeX Live或MacTeX。这一步是整个安装过程中最花时间的因为发行包体积非常大。我之前第一次装的时候没有心理准备等了将近一个小时所以如果你当前网速一般建议先把HTML流程跑通PDF放到后面再研究。3.2 创建并理解你的第一个Pretext项目工具装好后可以用命令行直接创建项目骨架。比如我想建一个叫demo-article的文档项目pretext new article demo-article cd demo-article执行完以后你会在目录下看到类似这样的结构demo-article/ ├── source/ │ ├── main.ptx │ └── ... ├── project.ptx ├── publication.xml └── output/这里的核心成员有几个。source/main.ptx是文档的主入口内容文件都放在这里project.ptx是项目配置文件告诉Pretext哪些需要编译publication.xml用来描述出版偏好比如是否显示作者、生成网页时选哪种皮肤。output则是构建结果的输出目录。初次接触时我建议你把重点放在main.ptx上先把它当成“文章文本本身”来改。随着内容变多再逐步学习拆分成多个子文件用xi:include这种包含机制把章节拆开放。3.3 三种输出格式的构建实操Pretext的构建命令很直观核心动词是build后接目标名。下面的命令在我们刚建好的目录内执行# 构建网页版本 pretext build web # 构建PDF版本 pretext build pdf # 构建EPUB电子书版本 pretext build epub如果顺利命令执行完后output目录下会分别出现对应的子目录。以网页版为例它生成的不是单个HTML文件而是一整个站点目录里面有各个章节页面、CSS、JavaScript和图片资源。你可以整包扔到任意静态服务器上也可以直接用浏览器打开首页查看。我个人的习惯是每次改完源文件后先在本地起一个预览服务随时刷新页面看效果pretext view web这个命令会启动一个本地预览服务器然后自动打开浏览器。好用的地方在于网页端能看到所有交互效果比如目录折叠、公式渲染、交叉引用跳转体验非常接近最终的发布效果。3.4 第一次提交内容时我建议你注意什么刚开始往PTX里写真实内容时别急着堆高技巧。先把标题层级、段落、列表、图片、公式这几种最基础的元素用熟能稳定输出一个页面后再逐渐加入习题、交叉引用、代码高亮这些高级功能。另外建议从一开始就养成“一章一个小节、一节一个小文件”的习惯。如果图省事把所有内容全塞进一个main.ptx文件很快会膨胀到几千行后面编辑会非常痛苦。Pretext本身支持通过include机制拆分文件我后来维护的文档项目基本是一个chapter对应一个.ptx子文件目录结构清晰用Git管理差异也方便。4. 实操进阶公式、代码块与主题定制怎么玩4.1 数学公式从TeX语法到网页与PDF的渲染路径Pretext在数学内容支持方面天生强大因为它的源头就是为数学教材设计的。如果你想写一个行内公式直接用m标签包起来如果想写一个独立成行的公式块用me标签。公式内部采用的是LaTeX数学语法熟悉LaTeX的人可以直接上手。比如下面这段PTXp勾股定理可以写成 ma^2 b^2 c^2/m这里 mc/m 是斜边长度。/p me \int_0^\infty e^{-x^2} dx \frac{\sqrt{\pi}}{2} /me编译成网页时Pretext会调用MathJax渲染公式显示为矢量放大缩小都很清晰。编译成PDF时公式会交给LaTeX引擎原生排版而不是贴图片所以印刷效果非常锐利。再配合交叉引用功能整个学术写作流程就闭环了。你可以先在文档任意位置定义一个带xml:id的标签然后在别处引它。theorem xml:idthm-pythagoras title勾股定理/title statement p在直角三角形中斜边的平方等于两直角边平方之和。/p /statement /theorem后续文字里引用它的位置只需要写p完整的证明过程参见 xref refthm-pythagoras/。/p引擎会自动把xref渲染成“定理1.2.3”或“第1.2.3节”而且还带超链接点击就能跳回定理位置。这套机制对写教材、写技术规范的人来说一旦用上就回不去了。4.2 代码块与编程类内容的写作体验既然Pretext面向的是理工类内容那么它在技术文档场景下的表现也值得说道说道。我写过好多篇含代码示例的教程Pretext对代码块的处理虽然不如专业代码文档工具那么花哨但胜在干净、可定制。代码块用program标签包起来还可以通过language属性标注语言。Pretext在构建HTML时通过Pygments做语法高亮在构建PDF时走LaTeX的代码高亮宏包。这意味着你用一种语法写代码块得到的两个格式都有高亮。program languagepython ![CDATA[ def fib(n): a, b 0, 1 for _ in range(n): a, b b, ab return a ]] /program这里用一个CDATA段包裹代码主要是为了避免Python代码里的尖括号、等字符被XML解析器误读。这也是我在刚开始写的时候容易踩的坑。如果你写的是编程类书籍还可以结合Pretext的exercises功能在每个章节后面放一组练习题。自动编号、自动汇总到章末习题列表这对在线课程来说是很实用的能力。4.3 主题与CSS定制想换皮肤可以只动样式层Pretext默认提供的网页风格比较学术适合教材场景。但如果你有品牌需求想把自己的文档改成有特色一点的暗色主题或者改变正文字体不需要去“改造内容”。Pretext把网页样式单独抽象成了样式文件。在publication.xml里可以指定加载自定义CSS文件。构建网页时Pretext会把这份CSS合并进生成的站点里。意味着你可以像做前端一样把网站调成你想要的样子而PTX源文件保持不动。我自己就维护了一个很精简的自定义CSS主要做了三件事调整正文字体族、加大代码块的深色背景、压缩目录树的间距。改动成本很低但最终用户拿到的阅读体验明显不一样。如果你也想调可以直接在生成目录里找到默认样式文件覆盖其中一部分规则即可。5. 遇到过的坑与排查心得5.1 最常见的问题速查手册真正上手Pretext以后遇到的报错大多是环境问题而非源文件逻辑问题。我把自己的排查经验整理成一张速查表方便你对照处理现象可能原因处理办法pretext命令找不到pipx安装路径未加入PATH执行pipx ensurepath并重启终端构建PDF时提示找不到xelatex系统未安装LaTeX发行版安装TeX Live或MacTeX后重试网页构建成功但图片不显示图片路径配置错误检查image标签的source路径使用相对于源文件的路径中文内容PDF乱码或空白字体设置缺少中文字体确认LaTeX引擎配置中包含可用的中文字体或调整字体主题运行pretext build时提示schema版本不兼容CLI版本与源文件版本不一致升级CLI或根据工具提示调整根标签命名空间这个表里的问题我几乎全踩过尤其是“中文内容在PDF里出现空白”这个问题第一次遇到时让我怀疑人生网页版一切正常PDF却丢了中文。后来定位到是没有配置合适的中文字体换成支持中文的字体后就正常了。5.2 中文文档排版需要额外关注什么Pretext对中文的底层支持是存在的但不像对英文那么“开箱即用”。我的实践结论是如果只生成网页版中文几乎不用操心浏览器会自己处理字体和排版但PDF版本就要多花一点心思毕竟XeLaTeX默认的字体配置不一定包含中文常用字体。我建议中文用户做两件事。第一在源文件根标签上写清楚语言属性例如前面例子中的xml:langzh-CN第二在构建PDF前检查使用的LaTeX模板或配置里是否把中文字体显式指定为系统中已有的中文字体方案。这些操作其实不复杂关键在于别默认它“能跑通”。网上关于中文字体配置的讨论已经比较多了真遇到问题照方抓药即可。5.3 长期维护Pretext项目的几点具体建议最后分享几条我从实际项目中总结出来的维护经验。如果你打算用Pretext写一本长期更新的书或者维护公司内部的一套技术文档库这几条应该能帮你少走弯路。第一锁定版本。Pretext还在持续迭代不同版本之间的架构偶尔会有变化。建议在项目里记录使用的CLI版本升级前先测试整套构建流程不要贸然在生产文档环境里升级。第二把源文件纳入版本控制。PTX是纯文本这意味着Git能清晰地追踪每一处改动。配合自动化构建脚本可以做到每次提交后自动生成预览站点这对多人协作的文档项目帮助很大。第三坚持语义化标签优先。某个效果如果不知道用什么标签表达先翻一翻官方标签字典或示例库。用非语义标签或硬编码HTML兜底短期内能解决问题但长期来看会让文档失去“跨格式输出”的能力。我自己在写过几轮Pretext文档后最大的感受是它的学习曲线确实比Markdown陡峭不少但它带来的收益是结构性的。一旦文档达到一定规模需要频繁编号、交叉引用、多渠道输出时Pretext的语义化优势会越来越明显。如果你手头正好有一份需要长期维护的文档或教材不妨把Pretext作为候选方案先花一个下午把框架跑通再做判断。