logo资料库

Art_of_MetaPost.pdf《metapost的艺术》(中文metapost简明教程)

第1页 / 共50页
第2页 / 共50页
第3页 / 共50页
第4页 / 共50页
第5页 / 共50页
第6页 / 共50页
第7页 / 共50页
第8页 / 共50页
资料共50页,剩余部分请下载后查看
目录
插图
表格
第一部分 理论篇
1 Metapost 的历史
1.1 我的 Metapost 在哪里?
1.2 使用 Metapost 的基本流程
1.3 一个简单的例子
1.4 Metapost 的预览问题
2 变量类型
2.1 numeric 类型
2.2 pair 类型
2.3 color 类型
2.4 path 类型
2.5 pen 类型
2.6 string 类型
2.7 picture 类型
2.8 transform 类型
2.9 数组
3 控制结构
3.1 条件控制
3.2 循环控制
3.3 自定义宏
3.3.1 def
3.3.2 grouping
3.3.3 expr、text 和 suffix
3.3.4 vardef
3.3.5 算符
4 作图基本知识
4.1 选择什么样的笔?
4.2 线型
4.3 端点
4.4 接头
4.5 箭头
第二部分 实践篇
5 FAQ
5.1 字体显示不对或者不能显示
5.2 合适的 editor
5.3 如何在 PDFLaTeX 中使用 Metapost?
6 调试
7 常用宏
8 常见宏包简介
第三部分 综合篇
9 使用 Metapost 制作精美动画
10 Gallery
11 C++ flavor: Asymptote
第四部分 附录
A 贡献者
B 已知问题
参考文献
索引
METAPOST的艺术 何 力 demonstrate@163.com 2006 年 2 月 7 日 摘要 METAPOST是一种解释性作图语言,它的输出就是另外一种作图语言。了解它,不仅仅方便你在 TEX/LATEX 中用图形表达你的思想,还能够制作出各种各样精美的图片,动画。 目录 目录 插图 表格 第一部分 理论篇 1 METAPOST 的历史 1.1 我的 METAPOST 在哪里? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 使用 METAPOST 的基本流程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 一个简单的例子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4 METAPOST 的预览问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 变量类型 2.1 numeric 类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 pair 类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . color 类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3 2.4 path 类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.5 pen 类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . string 类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.6 2.7 picture 类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . transform 类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.8 2.9 数组 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 3 3 4 5 6 6 7 7 8 8 9 10 11 14 14 15 16 17
目录 3 控制结构 3.1 条件控制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 循环控制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3 自定义宏 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . def . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.1 grouping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.2 expr、text 和 suffix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.3 3.3.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . vardef 3.3.5 算符 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 作图基本知识 4.1 选择什么样的笔? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 线型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3 端点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.4 接头 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.5 箭头 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 第二部分 实践篇 5 FAQ 5.1 字体显示不对或者不能显示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2 合适的 editor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3 如何在 PDFLATEX 中使用 METAPOST? . . . . . . . . . . . . . . . . . . . . . . . . . 6 调试 7 常用宏 8 常见宏包简介 第三部分 综合篇 9 使用 METAPOST 制作精美动画 10 Gallery 11 C++ flavor: Asymptote 第四部分 附录 A 贡献者 B 已知问题 参考文献 2 19 19 19 20 20 20 21 22 23 27 27 27 30 30 32 35 36 36 36 36 37 38 39 40 41 42 43 44 45 46 47
插图 索引 插图 1 一个简单的 METAPOST 示意 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 单位其实就是一种全局变量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 变量做单位用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 一个二元正态分布的例子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 三角形的重心 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 使用颜色 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 直线和曲线 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 控制点的作用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 通过的角度计算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 使用 dir 控制曲线形状 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ... 与 .. 的不同 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 12 不同 tension 的影响 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 不同 curl 的曲线形状 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 自定义 pen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 一把直尺的刻度 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . infont 创建的字体 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 17 不共线三点确定 transform . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Cantor 集合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . if 示意 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 20 三叶玫瑰线 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 一个 grouping 示例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . save 与 interim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 23 primary vs expr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 METAPOST 中的词法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 算符优先顺序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 不同线型作图 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 线型研究 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . dashed 怎么利用线型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 29 端点样式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 接头样式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 miterlimit 的影响 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 箭头示意 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 自定义箭头 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 48 7 8 9 9 10 11 11 12 12 13 13 13 14 14 15 15 16 17 19 20 21 22 24 25 26 28 29 29 30 31 32 33 34 1 addto 的等价用法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 表格
第一部分 理论篇 4 本部分讲述一些使用 METAPOST 作图的理论知识,从 METAPOST 的历史开始,然后讲述 METAPOST 使用的变量类型,以及其中使用的控制结构,最后讲述作图的一些基本概念和方法。 要点: • 熟悉使用 METAPOST 作图以及插入到所需位置的基本流程。 • 理解 METAPOST 是一个宏语言的特征。 • 熟练的使用 METAPOST 的几种基本数据类型。 • 能够使用 METAPOST 的控制结构写出简单的程序。 • 能够运用所学会的编程知识看懂系统写的宏。 • 逐步积累一点点常用的宏。 • 能够理解并运用各种作图的基本手段实现自己的作图目的。 难点: • 怎么正确的理解 METAPOST 是一个宏语言。 • 如何利用已有的方式构造合适的 path。 • 如何利用线性方程组简单的计算出所需要的未知数。 • 如何正确理解 def 和 vardef 的不同。 • 如何实现宏的后缀。 • 如何定义算符,以及不同级别算符的区别。 • 怎么理解线型以及定义自己的线型。
1 METAPOST 的历史 5 1 METAPOST 的历史 METAPOST 作为一门语言,其发生,发展,到今天有着自己的历史。大牛 Donald E. Knuth 为 其巨著 [Knu] 的排版头痛从而创作了 TEX 这个排版语言,同时为了为该排版系统定制字体,开发了 METAFONT1。METAPOST 就是由 John D. Hobby 基于 METAFONT 创造,学习 METAPOST 应该 参考他所作的 METAPOST 手册 [Hobc],本文不希望写成如此的手册,而是希望通过一些基本概念 方法的介绍,激发读者使用 METAPOST 的欲望。 METAFONT 输出的是点阵字型,而 METAPOST 所输出却是 PostScript2。METAPOST 从 METAFONT 中借用了一些基本操纵图形的工具,也从 PostScript 中获得了更多的新特性,如 clipping(剪辑),shading(渐变色),dashed lines(虚线)等等。 在网上可以找到很多与 METAPOST 相关的资料,下面列出少许供参考: • http://cm.bell-labs.com/who/hobby/MetaPost.html 这是 John D. Hobby 的 METAPOST 官方主页了,上面有关于 METAPOST 的历史资料,如何安装 METAPOST,怎么利用 META- POST 的例子,手册,mail list。 • http://www.tug.org/metapost.html,这是 TUG 的 METAPOST 介绍网页,有很多教程(在 本文的参考手册中可以找到部分相同的),相关的应用,相关的作图语言(如 Asymptote)、程 序。 • http://tex.loria.fr/prod-graph/zoonekynd/metapost/metapost.html,全是例子,如果 你有耐心把这些程序全部写完,你马上就能成为一个 METAPOST 高手,这里面的例子从简单 到困难,本文有些例子可能也会从中选择出来。 • http://bbs.ctex.org/forums/index.php?showforum=35,这是国内人气最旺的 CTEX 论坛 的 METAPOST 分坛,由 elove 老兄主持,有问题可以去问问,有好东西可以去分享,有经验可 以去交流。 • http://melusine.eu.org/syracuse/metapost/,这是一个法文站点,上面除了一些文档以 外(如 [Hobc] 的 prosper 版本)还含有大量的动画,漂亮的 galleries,使用 METAPOST 做成 的课件,感谢 changroc 提供。另外该网站还有 PostScript,PSTricks,SWF 的相关示例。 这里顺带着讲述一些作图的方法。在 Windows 大行其道的今天,很多人都被漂亮的 GUI 所迷 惑,熟悉了怎么使用鼠标拖拖拉拉,反倒生疏了键盘。为了获得一些文档中的图片,想来一般人都 尝试过 Windows 的画笔,甚至是 MS Office 中的作图工具,另外微软还提供了 MS Visio。这些作 图工具的特点在于用户不必关心准确的位置,只需要到一些面板上寻找按钮到画布上拖拉,就能获 得一些图形,Visio 稍微好点带有标尺,可以较为精确的定位,同时 Visio 的输出可以选择矢量图形 格式,加上大量的图形元件,可以很方便的实现多种图形的绘制。另外,微软在 MS Office 2003 中 捣鼓出来了自己的 mdi 格式,大家可以猜测微软的目的。在 Windows 平台下,有不少类似的作图 工具,如 Adobe 的平面设计“专家”Photoshop,矢量图形绘制 illustrator,还有 Corel 的点阵矢量 包打的 Corel Draw,另外和 Visio 有的一拼的还有 SmartDraw 等等。如果算上开源作品中精良的 GIMP 和 Inkscape,那真是百家齐放。Linux 下面还有很多类似的软件,也有移植到 Windows 下的, 如 xfig、dia 等等,Open Office 里面的 oodraw 和 KDE Office 套装中的 kivio,也算是不错的 Visio 替代品。 可是有人能做到像 AutoDesk 的 AutoCAD 那样精准的图形么?“哦,”你也许会抱怨道,“我不 需要这种图形。”那么这里不妨劝你放弃 METAPOST,因为 METAPOST 要处理获得的往往是精确 的图形,而随意画出来的图形却很难用 METAPOST 画出来。另外,你不能指望可以仅仅用鼠标就让 1METAFONTTM 是 Addison Wesley Publishing 公司的注册商标。 2 PostScriptTM是 Adobe System Inc. 的注册商标。
1 METAPOST 的历史 6 METAPOST 服服贴贴的为你画出各种图形,正如 AutoCAD 一样,真正的高手很少完全用鼠标,并 且结合 Visual LISP 有时才能高效的绘制出所需要的图形。“哦,METAPOST 这么繁啊!我不想用 了……”好吧,这算是我对你打的预防针,因为的确学习 METAPOST 你需要更大的热情和精力,看 看上面那个全部是例子的网页吧,难道精美的图片不值得我们的热情和精力么? 当你下定决心的时候,就让我们开始 METAPOST 之旅吧! 1.1 我的 METAPOST 在哪里? 如果你在 Windows 下面,安装了 CTEX 套装,或者你是独立的安装了 MikTEX 发行版,那 么你可以用 MikTEX 的 Package Manager 查看自己的 METAPOST 是否已经搞定,没有的话可以 在其中完成安装。CTEX 套装的 full 版用户,如果你没有删除过 METAPOST,你就可以直接使用 METAPOST 了。 如果你在 Linux 下面,安装的是 tetex,一般说来 METAPOST 已经装好了,你可以用 $ whereis mpost 或者 $ whereis mp 看看该程序是否在你的 PATH 中。如果没有安装,可以依照各自发行版安装对应的 tetex,如 Fedora Core 用户可以考虑使用 # yum install tetex tetex-fonts tetex-latex tetex-xdvi \ tetex-afm tetex-doc tetex-dvips 安装好整个 tetex,想单另装可以去 CTAN 下载源代码自己编译,Debian 用户可以使用 aptitude 这 个 TUI 或者 # apt-get install tetex-base tetex-bin tetex-doc \ tetex-extra 从网上安装。 现在我使用的 MikTEX 版本和 tetex 的版本分别为 2.41 和 3.0,里面所带的 METAPOST 的版 本为 0.641。 1.2 使用 METAPOST 的基本流程 一般说来,最好先对需要做的图形有个基本的轮廓,然后开始编写源代码,写好后使用 mpost 程序将源程序转换成为 PostScript,可以使用一般的查看软件如 GSView 或者 ImageMagick/- GraphicMagick 自带的 display/gm display 查看。如果不符合自己的要求,就修改源代码,重新 转换,直到生成自己需要的图形为止。该图片可以使用 graphics/graphicx 宏包直接插入到 LATEX 源文件中,然后编译 LATEX 源文件获得 .dvi 文件,使用 dvi 阅读软件,如 MikTEX 的 yap 和 Linux 下的 xdvi(k)。TEX 用户可以通过 \ input e p s f % s o m e t h i n g $$ \ e p s f b o x{ s i m p l e−example . 0} $$ 插入图片。 另外可以使用 mptopdf 将 .mp 直接转化为 pdf,如上面的例子就会被转化为 simple-example-0.pdf。
1 METAPOST 的历史 1.3 一个简单的例子 7 那么首先让我们建立一个小小的测试文件(参考 图 1)。 存为 simple-example.mp,并使用 图 1: 一个简单的 METAPOST 示意 beginfig ( 0 ) draw ( 0 , 0 ) −− ( 1cm, 0 ) −− ( 1cm, 1cm ) −− ( 0 , 1cm ) −− cycle ; endfig ; end $ mpost simple-example.mp 获得编译结果,是一个名为 simple-example.0 的文件,你可以检查是不是和在本文档中所见一致, 是一个边长为 1cm 的正方形。 P 你能猜出来上面的程序大致什么意思么? 1.4 METAPOST 的预览问题 从上面的例子看出,如果希望能够在写出代码后较快的看到转化的结果,需要用一道程序实现 预览,这在 WinEdt 里面已经实现过了,注意工具栏靠右侧的两个按钮,有一个是用来配置预览,还 有一个就是用于预览,其基本原理就是将生成的图形建立在一个临时的 .tex 文件中并且编译后使 用 dvips 转换为 PostScript 并使用 GSView 查看。 在 Linux 里面,可以配合一些脚本实现类似的功能,如下面的一段 BASH 脚本利用 find 实现 类似的预览功能: #! / b i n / sh i f t e s t $# −g t 1 then f n=$1 s h i f t o p t i o n s=$∗ e l s e f n=$1 o p t i o n s=” ” f i echo ” mpost $ o p t i o n s \ ”\ p r o l o g u e s : = 1 ; mpost $ o p t i o n s ”\ p r o l o g u e s : = 1 ; i n p u t ${ f n } .mp” f i n d −name ” ${ f n } . [ 0 − 9 ]∗ ” −exec d i s p l a y {} \ ; i n p u t ${ f n } .mp\ ” ” P 你能否想出更好的预览脚本?或者编制一个自己的预览程序?
2 变量类型 8 2 变量类型 值得注意的几点是 METAPOST 程序的风格,这里提出几点:1. 使用 ; 分割不同句子。2. 使用 % 作为行注释号。 3. 使用 := 作为赋值号。 2.1 numeric 类型 由于 METAPOST 不需要像 C/C++ 一样使用很大范围的整数或者浮点数,因此 META- POST 选择使用的 numeric 类型是不分整数浮点,其表达精度是 epsilon := 1 ,表达的范围在 (−4096, 4096) 之间。之所以出现 4096 是因为这是对应到 PostScript 中的距离已经超过 1.4m 了, 一般不需要更大的数了,由此可见 METAPOST 使用的固定精度(小数点后 16 位),另有 12 位表达 整数部分,还有一位符号位。可以在计算数值超过限定范围后,把一个内置变量 warningcheck := 0 ; 即可。另外,numeric 变量不需要声明即可使用。 65535 其他很多常见单位,如 cm, mm, pt = 1 一般说来,numeric 类型被用于表征长度,默认的单位是 bp = 1 72in 。但是 METAPOST 也支持 72.27in, cc = 12.97213bp, dd = 1.06601bp, pc = 11.95517bp。 另外,这些单位和我们使用的 numeric 变量没有太大的区别,换言之,你完全可能会通过对某 些单位的赋值,使得该单位失去原先的意义,但这往往是我们不希望看到的:当我们在某处改变了 某个单位后,在该文件其他任何后继部分除非再次更改该值,否则都不会变化。下面的简单实验说 明了这一点。 图 2: 单位其实就是一种全局变量 beginfig ( 0 ) draw ( 0 , 0 ) −− ( 1cm, 0 ) cm := cm / 2 ; draw ( 1cm, 0 ) −− ( 1cm, 1cm ) ; endfig ; beginfig ( 1 ) draw ( 0 , 0 ) −− ( 1cm, 0 ) cm := cm ∗ 2 ; draw ( 1cm, 0 ) −− ( 1cm, 1cm ) ; ; ; endfig ; end ; 可能你注意到了 1cm 的写法,既然变量和单位基本雷同,你当然可以通过自己定义一个长度, 如 u := 1cm ; 然后通过 5u 这种类似的方法作图,最终调节 u 获得不同大小的图片,如 图 3。 但是值得注意的是不同的 beginfig ... endfig ; 环境中的 u 是不互相影响的。 P 请自己设计实验验证。 numeric 可以执行的运算类型有 +, −, ∗, / ,另外还可以做 ∗∗, ++, +−+, abs, mod, div, mexp, mlog 这些运算,分别 x ∗∗y = xy x +−+ y =p x2 − y2 x ++y =p abs x = |x| x2 + y2
分享到:
收藏