安道

博客文章

在电子书中渲染公式

昨天更新了《Ruby on Rails 教程》,这次更新最大的变化是对公式的处理方式。这本书有一节用了几个公式,我使用的电子书工具链之前不支持转换公式,所以只能做些简单的处理:使用上下标。后来越看越不舒服,因此前几天抽空实现了 LaTex 式的显示效果。

公式一直是我的电子书工具链所缺乏的功能之一,我也一直想解决,不过苦于没有合适的方法。前几天,O’Reilly 电子书方面的负责人(Sanders Kleinfeld)分享了他们的处理方式,勾起了我解决这个问题的欲望。

按照 Sanders 的分享,我首先尝试使用 MathML Cloud。不过这个服务提供的 API 不规范,尝试过程中多次遇到问题。这个服务的实现方式是开源的,不过自己搭建很麻烦,又是 MongoDB,又是 Redis 的,所以我放弃了这个方案。

随后我试着搜索,看有没有纯 Ruby 的解决方案,毕竟我的工具链是使用 Ruby 编写的。在 GitHub 中搜索,找到了 mathematical。这个 gem 为了提升“速度”,用了两个 C 语言扩展。正是这两个扩展让我放弃使用这个 gem。因为用到了 C 扩展,所以安装之前要先安装一些库,不过对于“新手”来说,这个过程像念咒语一样,根本不得要领,开发者说安装什么跟着做就是了,然而有时跟着做也没用。环境的差异害死人!在这个 gem 开发者的帮助下,成功编译了 C 扩展,可是使用过程中又遇到了问题:无法生成 SVG 和 png 图像。自己尝试解决无果后,我就放弃了这个 gem。

这时,我又想起了 MathML Cloud,既然这个服务的实现方式是开源的,不妨看看它是如何渲染公式的。看了代码,发现 MathML Cloud 使用的是 MathJax-nodeMathJax 应该是目前最成熟的公式解决方案,既然有 Node.js 版,集成到我的工具链中就不难了,因为 MathJax-node 提供了 CLI。经过一番编程之后,最终顺利把 MathJax-node 集成到我的工具链中。

目前我是这样处理公式的:书稿中使用 LaTex 句法写公式(纯文本,便于管理),生成电子书时为不同的电子书格式生成不同格式的图像

  • PDF 和 HTML 格式用 SVG
  • ePub 和 mobi 格式用 png

这么做遵循了“渐进增强”原则,因为 PDF 骨子里就是“矢量”的,最适合使用 SVG,而且目前大多数主流浏览器都支持 SVG,所以 HTML 格式也用了 SVG。但是 ePub 阅读器和 Kindle 等对 SVG 的支持并不好,只能使用图像;虽然缩放时的体验不好,但是至少还能辨识公式的内容。

P.S. 我的电子书工具链是 persie。这个工具之前是开源的,现在已经闭源,不过以前的版本仍然可以下载安装。