ero 的故事 [3] = 织出

zero 可将 zero 文件转换为 YAML 文件。Donald Knuth 将类似的过程称为 weave。因为程序文档像一张网,不仅文档的内容中存在着许多交叉引用,而且代码片段之间也存在着许多交叉引用——代码片段之间的引用关系以及带标签的代码片段的 + 与 ^+ 运算均产生交叉引用。事实上,将 zero 文件转换为 YAML 文件的过程中,zero 程序的主要工作是生成代码片段之间的交叉引用信息。至于文档内容中的交叉引用,直接交于可与 zero 相结合的文档排版工具来处理。

基于 YAML 文件,zero 能够与许多排版工具取得结合。我们的时代已经进步到了不需要再为获得一份排版美观的程序文档而像 Donald Knuth 写 TeX 那样拼的程度了。

对于网页形式的程序文档,我们有 Markdown 这种的轻量级的标记语言,也有 reStructuredText 这种重量级的标记语言,实在不济,还有 HTML 5 + CSS 3 + JavaScript。它们都有助于生成美观的网页形式的程序文档。对于有 zero 文件转换而来的 YAML 文件,主流的脚本语言均能借助一些 YAML 解析库将其转换为 Markdown,reStructuredText,或 HTML 5 + CSS 3 + JavaScript 的文档形式。如果文档中需要数学公式,可以学点 TeX 数学标记,将显示数学公式的任务交给 MathJax 来做。

对于面向纸本书籍排版的程序文档,有 TeX,LaTeX 或 ConTeXt。过去,这些排版工具对中文支持的不够好,排版字体的配置极为繁琐。现在有 XeTeX 与 LuaTeX 引擎了。

总之,过去很难解决的文档排版问题,现在都不是问题。现在的问题是掌握这些工具。

在程序文档的排版方面,我较为熟悉 Nikola 与 ConTeXt。Nikola 可以将 Markdown 或 reStructuredText 之类的标记语言转化为静态网页。由于 Nikola 支持代码高亮显示,能嵌入 MathJax 实现 TeX 数学公式的显示,能够以静态站点的形式发布文档,因此我将它作为 zero 战略合作伙伴,写了一份名为 yml2md 的 Python 脚本实现二者的沟通交流。

下面以 hello-world.zero 为例,使用以下命令将其转换为 Markdown 文件:

$ wget https://github.com/liyanrui/zero/raw/master/example/markdown/hello-world.zero
$ zero -m day hello-world.zero | yml2md > hello-world.md
然后将 Markdown 文件交给 Nikola 来处理即可。

注:Nikola 的安装与配置指南,见:https://getnikola.com/getting...

对于面向纸本书籍排版的程序文档方面,要从很久很久之前说起。早年,我受到王垠的蛊惑,喜欢上了 ConTeXt,还为它写了一个支持中文排版的插件。为了继续维护这种喜欢,我将 ConTeXt 也作为 zero 的另一个战略合作伙伴,写了一份名为 yml2ctx 的 Python 脚本实现二者的沟通交流。可以通过以下命令,可将前几节用作示例的 km.zero 转换为 YAML 文件,进而由 yml2ctx 产生 ConTeXt 文件,最后由 ConTeXt MkIV 生成 PDF 格式的程序文档:

假设已经 git clone https://github.com/liyanrui/zero.git

$ cd zero/example/ConTeXt
$ zero -m day km.zero | yml2ctx > km.tex
$ context km.tex

注:zero-style.tex 相对于 km.tex,类似于 CSS 文件相对于 HTML 文件

注:有关 ConTeXt MkIV 的安装以及中文环境的配置,可参考我写的一些文档。

如果希望 zero 能够支持其他的文档排版工具,这只能自力更生了。不过,我会提供一些必要的生产资料。可以通过以下命令获得由 km.zero 转换 YAML 文件:

$ zero -m day km.zero > km.yml
将它与 km.zero 与 km.pdf 中的内容进行对比分析,要弄懂它应该不困难——特别是对于那些认为『代码本身就是剧本』而我们不需要再多造一份剧本的人而言。当你看到我作出这样的陈述,应该不难想到,其实是我懒得再为 zero 输出的 YAML 文件格式而写文档了。

关键字:文式编程, zero, 文档, 排版


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部