文档中插入图形
传统的文字-图形融合
一般文档主要是进行字处理,而文字的书写、编辑、排版和画图是截然不同的两种模式。虽然在计算机里最后都是处理成二进制代码,但不管在哪种操作系统中,画图软件和字处理软件都是分属于不同的类别。早期的文档如果想同时包含文字和图形,只能把文字先打印出来,留出空白,再用画图软件做好图,把图形打印出来,用胶水粘贴上去。话说这么麻烦的方法,我当年是干过的,读研究生的时候,为了给一个会议期刊投稿,用 xvgr
画好了图,然后用胶水粘在文字稿的空白处。这种“精巧的活”我干起来非常吃力,看着文稿上黑乎乎的手指印,欲哭无泪,重复了好多次 ……。
微软公司的 word
软件之所以那么流行,就是因为它可以在文档的编辑时,插入图片文件,而且让文字和图片融合起来。虽然每次调整图形的时候,鼠标把手指都要练废了,但效果也算差强人意。后来, word
还发展出了可以在字处理时,直接插入线条和几何形状,画出简单的图形。但这个图形和文字,还是可以看出,汤是汤,水是水,明显的两种类型。
从程序的角度融合
从计算机和数学的角度来看,文字和图形其实都是编码的存储方式而已。文字也是算法生成和显示的,图形也是算法生成和显示的,为什么不能统一处理呢?D. Knuth 教授在发明 \(\TeX\) 软件时,就率先开发 METAFONT
来统一生成文字和图形,效果是相当的好。也难怪,人家 Knuth 大师本身就是数学家和算法大家,最年轻的图灵奖获得者,搞点这种算法,还不是雕虫小技 ……。
借助 \(\TeX\) 标记型语言的思想,我们把文字的内容和排版分开,将排版的要求也用文字来描述,然后在后台用程序来识别对排版的要求,也就是说,排版其实是一种程序语言,不过人读起来很顺畅很简单。既然排版可以算作程序,那么,图形的制作为什么不能是程序设计呢?这样,我们在一个文档里,既写文字内容,又“写”图形的制作描述,还可以“写”数学公式,整个文档里只有 ASCII 码。方便编辑、复制、版本管理等。至于最后呈现给人阅读的样式,用后台程序来处理完成。
画图的程序语言选择
确定了用标记型语言来画图的思想后,操作上就有两个问题需要考虑:
- 如何描述一个图形;
- 画图的语言如何与文档无缝融合。
从本质上来说,图形的描述也是基于数学的。所谓的图形,其实就是直线和曲线的组合。在线条的基础上,再生成三角形、四边形、多边形、圆形……,然后在封闭的形状里,考虑是否填充进颜色。因此,一开始的画图语言,都是些数学函数的描述,比如 gnuplot
, metapost
, tikz
, Asymptote
等。但就像造房子不能每次都从砌砖开始一样,可以生成一些作为积木的基本形状,然后用程序语言来组合。很多人潜意识地以为,那些好看的函数图形,肯定是数学公式生成的。但是随手涂鸦,就不好用数学公式描述了。其实不然,这个世界上什么东西不是数学的呢?:-) 只要你愿意,用数学公式来随手涂鸦,简直是一件乐趣。
作图语言和文档的融合,倒不是大问题。但纯文本的 txt
文档,还是不太适合完成这样的工作。目前,最好的融合文字和其他语言的写作环境是 org mode
。它简直能识别几乎所有的作图语言,当然,它还能识别 C/C++
, java
, shell
, python
, …….。所有的程序语言,在这里都被同等对待了。
plantuml
plantuml
是基于 java
开发的画流程图等的语言,它可以单独运行,也可以嵌入到 org mode
里被 org
统一管理。我喜欢用它来画各种流程图,比开始我用 draw.io
生成 png
文件,再插入到文档中,要方便多了。
范例
文字和图片的融合
为什么说这里的图形和文档是融合的呢?实际上,在我的原始文档里,上述的内容是长这个样子的:
~plantuml~ 是基于 ~java~ 开发的画流程图等的语言,它可以单独运行,也可以嵌入到 ~org mode~
里被 ~org~ 统一管理。我喜欢用它来画各种流程图,比开始我用 ~draw.io~ 生成 ~png~
文件,再插入到文档中,要方便多了。
*** 范例
#+begin_src plantuml :file ../static/img/test.png
@startuml
title AI Programming Flow
start
fork
:Training;
split
:Sample Data;
split again
#lightGreen:Expected Results;
end split
:Machine;
#red:Model;
stop
fork again
:Prediction;
split
:New Data;
split again
#red:Model;
end split
:Machine;
:results;
end
end fork
@enduml
\+end_src
这就是 Knuth 教授一再推崇的 “literal programming” 啊,整个世界大统一了。