星期二, 三月 27, 2007

从 txt2tags 进一步认识标记语句

最开始使用标记语句是从王垠介绍的 TeX/LaTeX 开始的,有很长一段时间我都在努力将文档转变成 TeX/LaTeX,但实际上还是比较麻烦的。从 TeX/LaTeX 的学习中,最大的收获是对标记语言的一个重要特性的认识:内容和形式分离

感觉上,TeX/LaTeX 的标记设计得不是非常清楚,所以为了达到形式与内容分离,需要花费大量的精力,自己定义模板,而效果也不是十分理想;为了实现各种功能,可能需要选择大量新的标记和新的模块包(\usepackage),使本身已经陡峭的学习曲线更加让人生畏;而且为了使 TeX/LaTeX 适应中文也相当麻烦(基本上没有什么软件的中文化不麻烦的,我想现在的编码方式还是有问题)。

后来决定转移到 xml docbook。xml 的标记设计相当的标准,而且 docbook 在一开始就实现了形式与内容的分离。通过样式文件 XSL 来改变目标文档(html/PDF 等)的外观,而作者集中精力于编写的内容。

不过我现在却在使用 txt2tags(.t2t 文件),最主要的一个原因是:简单(KISS)。它的标记非常的简单和直观,从人的感观来说,和编辑普通的 txt 文件没有太大区别,因此具有很强的可读性。使用 XML 的好处的确很多,但其学习曲线也颇为陡峭,在企业当中的现实往往是,让人们去花费精力学习 XML,他们可能会宁可选择 Micro$oft Word。使用 .doc 的弊端是很明显的,那就是你没办法版本化,或者说版本化的意义不大(无法比较,无法查知在什么时候、谁做了哪些改动),因而你无法获得集中管理的优势,在多人协作中将造成巨大的重复成本,因为你没办法同步文档。而使用 t2t,最多只需要半个小时的学习就可以开始使用了(看看 sample,实际上几分钟就可以了,倒是设置编辑器的语法高亮花的时间还多一点)——当然,有问题的时候你还是需要去查查手册,一些比较高级的功能也是需要深入学习才能了解(不需要深入太多)。

当然 t2t 的简单也有其局限性,虽然它的确基本上实现了内容与形式分离(因为实在是很简单),但它的标记太少,不适合比较复杂的文档,另外它缺乏 footnote 和 xref(文档应用)以及索引等功能。而且,它也没有明确的部分、章、节的划分,只是一个层次结构而已。

所以,实际上我心里还是比较倾向于 XML,不过考虑到现在公司的实际情况,而且我还需要能够对 xml 的编辑和使用加深一些学习,比如设置 vim 编辑器等,所以 txt2tags 还是一个不错的选择。

目前来看,我只能是在将来再将现在用 t2t 编写的文档转变为 xml docbook(还得找或者写程序,t2t 默认只支持 SGML),而不可能同时使用这两套系统,并且一旦我转变为 XML,就不大有希望再试听 t2t 了。最主要的原因是 txt2tags <=> xml docbook 的标记之间是一个一对多的关系,即一个 txt2tags 标记在 xml docbook 可以多个标记来表示。如果编写 xml docbook 的人使用了 docbook 才有的特性,这些特性要么不能显示,要么干脆会丢失,因为使用 t2t 的人在提交和转换的时候会导致这些信息丢失。

除非我改变 t2t 的标记,在其中保留一些诸如"<"screen">""<"/screen">"的 XML 标记,而扩充的 txt2tags 在处理的时候能够自动忽略这些标记,或通过一个映射表将其转换为某种它能够处理的标记。不过重点还是在 XML,即后台时间实现自动化处理以转换其他文档的还是 XML 文档,即增加了一层,由
txt2tags --> html/pdf/tex
变为
txt2tags --> xml docbook --> html/pdf/tex
。但是所有人仍然必须编辑 t2t 文件而不是同时编辑 t2t 和 xml 文件,否则是无法同步的。

这样做的目的是一方面在最大程度上保持了 t2t 的简单性,同时在 t2t 无法达到要求的时候采用 xml。

关于映射表,参考 txt2tags 源代码(python),可以发现它实际上做了一个标记的映射,将 txt2tags 的标记和其他格式文档的标记进行 dict map。不过它这个映射表是写在代码里面的,这使我考虑是否能将其写在外部,作为一种 schema 而存在。这样不仅能实现上面的转换要求,而且可以实现一些比如自定义标签的功能。

自定义标签?比如假设我已经编写了一个脚本可以处理这些 schema,并且可以做转换,那么我可能会使用如下的命令:
sh$ ctags schema text.t2t >text...
例如 xml 文件:
sh$ ctags xml.schema text.t2t >text.xml
当然还可以使用 html 等,不过我觉得不太好,因为既然 xml 最标准,那么为什么还要其他的呢?直接利用 xml 的威力就好了。并且对同一个 xml 文档,我还可以通过使用不同的映射关系来实现一些差别化的功能...

那么一个 schema 可能的形式如下:
xml_tag_name, src_tag_start, src_tag_end, dst_tag_start, dst_tag_end
verbatim, ``, ``, "<"verbatim">", "<"/verbatim">"

没有评论: