跳过正文

文档中插入图形

·1593 字·4 分钟
目录

传统的文字-图形融合
#

一般文档主要是进行字处理,而文字的书写、编辑、排版和画图是截然不同的两种模式。虽然在计算机里最后都是处理成二进制代码,但不管在哪种操作系统中,画图软件和字处理软件都是分属于不同的类别。早期的文档如果想同时包含文字和图形,只能把文字先打印出来,留出空白,再用画图软件做好图,把图形打印出来,用胶水粘贴上去。话说这么麻烦的方法,我当年是干过的,读研究生的时候,为了给一个会议期刊投稿,用 xvgr 画好了图,然后用胶水粘在文字稿的空白处。这种“精巧的活”我干起来非常吃力,看着文稿上黑乎乎的手指印,欲哭无泪,重复了好多次 ……。

微软公司的 word 软件之所以那么流行,就是因为它可以在文档的编辑时,插入图片文件,而且让文字和图片融合起来。虽然每次调整图形的时候,鼠标把手指都要练废了,但效果也算差强人意。后来, word 还发展出了可以在字处理时,直接插入线条和几何形状,画出简单的图形。但这个图形和文字,还是可以看出,汤是汤,水是水,明显的两种类型。

从程序的角度融合
#

从计算机和数学的角度来看,文字和图形其实都是编码的存储方式而已。文字也是算法生成和显示的,图形也是算法生成和显示的,为什么不能统一处理呢?D. Knuth 教授在发明 \(\TeX\) 软件时,就率先开发 METAFONT 来统一生成文字和图形,效果是相当的好。也难怪,人家 Knuth 大师本身就是数学家和算法大家,最年轻的图灵奖获得者,搞点这种算法,还不是雕虫小技 ……。

借助 \(\TeX\) 标记型语言的思想,我们把文字的内容和排版分开,将排版的要求也用文字来描述,然后在后台用程序来识别对排版的要求,也就是说,排版其实是一种程序语言,不过人读起来很顺畅很简单。既然排版可以算作程序,那么,图形的制作为什么不能是程序设计呢?这样,我们在一个文档里,既写文字内容,又“写”图形的制作描述,还可以“写”数学公式,整个文档里只有 ASCII 码。方便编辑、复制、版本管理等。至于最后呈现给人阅读的样式,用后台程序来处理完成。

画图的程序语言选择
#

确定了用标记型语言来画图的思想后,操作上就有两个问题需要考虑:

  1. 如何描述一个图形;
  2. 画图的语言如何与文档无缝融合。

从本质上来说,图形的描述也是基于数学的。所谓的图形,其实就是直线和曲线的组合。在线条的基础上,再生成三角形、四边形、多边形、圆形……,然后在封闭的形状里,考虑是否填充进颜色。因此,一开始的画图语言,都是些数学函数的描述,比如 gnuplot, metapost, tikz, Asymptote 等。但就像造房子不能每次都从砌砖开始一样,可以生成一些作为积木的基本形状,然后用程序语言来组合。很多人潜意识地以为,那些好看的函数图形,肯定是数学公式生成的。但是随手涂鸦,就不好用数学公式描述了。其实不然,这个世界上什么东西不是数学的呢?:-) 只要你愿意,用数学公式来随手涂鸦,简直是一件乐趣。

作图语言和文档的融合,倒不是大问题。但纯文本的 txt 文档,还是不太适合完成这样的工作。目前,最好的融合文字和其他语言的写作环境是 org mode 。它简直能识别几乎所有的作图语言,当然,它还能识别 C/C++, java, shell, python, …….。所有的程序语言,在这里都被同等对待了。

plantuml
#

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” 啊,整个世界大统一了。

相关文章

如何创建个人 Blog

·1482 字·3 分钟
这里有三个概念首先需要理清: 用 org-mode 模式写文章,并将 org 格式的文章转换为 markdown 格式,以便 hugo 可以识别; 使用 hugo 建立静态网页; 将本地静态网页发布到互联网上。 org-mode 写文档 # org-mode 是一种标记模式,把文档的内容和格式分开,这样所有的文档都是文本模式。org-mode 模式已经被很多编辑器支持了,但还是 Emacs 支持得最好。因此,请参考 org mode 网站,学习如何使用 org-mode 模式。

把 Emacs 打造为 Python IDE

·3104 字·7 分钟
集成开发环境(IDE)是一种帮助程序员高效开发软件代码的软件应用程序。它通过将软件编辑、构建、测试和打包等功能结合到一个易于使用的应用程序中,提高了开发人员的工作效率。就像作家使用文本编辑器,会计师使用电子表格一样,软件开发人员使用 IDE 让他们的工作变得更轻松。当前比较流行的 Python IDE 有 PyCharm, IDEA, VS CODE 等。 Emacs 作为一个可扩展的文本编辑器,处理各种文本数据是非常方便的。我们在 Emacs 里增加 elisp 扩展,就可以模拟各种 IDE 的环境,还能更好。

梅西“封王”,纪念一周年

·1721 字·4 分钟
距离阿根廷世界杯夺冠,刚刚一年。网上阿根廷的粉丝、梅西的粉丝热闹起来,到处都是回忆和开心的帖子。连梅西自己也在 ins 上连发两条,十几张照片。可见梅西心里也是久久不能忘怀的。更有财力雄厚的粉丝,继续在上海外滩包下大屏,滚动播放夺冠的镜头。于是,去年世界杯的各种场景,尤其决赛的画面,又浮现在脑海里,仿佛没有过去一年,而是一天。很多人在感慨,去年,我们“阳”了,梅西也“羊”了。(梅西去年正式被国际足联称为“Greatest of All Times”,简称 GOAT。)