每天画图3分钟(刻意学习)

MetaPost画图入门

2019-06-17  本文已影响4人  SpaceCat

1、介绍

简单的说,MetaPost就是一个用脚本画图的工具。
由于越来越多的使用Markdown编写文档,有时候会用脚本画一些简单的时序图、流程图之类的。有一个基于前端的画图库,Mermaid,可画这些,Evernote的markdown功能提供了默认的支持,非常方便。
但是,这些脚本画图的工具简单易学的同时,有一个比较大的缺点就是表达能力有限,对于比较复杂的画图需求是没法满足的。在寻找更强大的脚本画图工具的过程中,我发现了MetaPost。

1.1 什么是MetaPost

MetaPost 既可以理解为是输出矢量图形的编程语言,或者是向量图形格式和一种脚本语言。

1.2 MetaPost简述

MetaPost由John D. Hobby发明的一个跨平台矢量图形作图工具,现由Taco Hoekwater进行维护开发,现在最新稳定版本是 1.211,于2010年4月发行,预览版是1.502,于2010年7月发行。MetaPost深受Metafont的影响,继承了Metafont对直线、曲线、点和几何变换等图形优雅的定义语法的优点,也同样继承了Metafont的一些限制,如数字分辨率低、不完全支持 PostScript特性。

2、MetaPost安装

2.1 本地安装

具体我已经忘了是macOS自带的,还是我之前装的。反正装好之后,命令行会有一些mp开头的命令。这些命令用来处理MetaPost脚本,生成对应的图片。

2.2 在线预览

除了本地的环境之外,也可以用在线的环境来处理MetaPost脚本。如下是一个网站,输入脚本可以下载到对应的图片。
http://www.tlhiv.org/mppreview/
在网站左边输入如下脚本,会得到如下的图片效果:

for i=0 upto 9:
  draw (0,0){dir 45}..{dir -10i}(6cm,0);
endfor

for i=0 upto 9:
  draw (7cm,1cm){dir 45}..{dir 10i}(13cm,1cm);
endfor
MetaPost Preview Online

3、MetaPost命令入门

3.1 Hello World MetaPost

还是用上面的例子,我们将如下的代码保存到一个文本文件,命名为gogogo.mp。然后,通过命令行将其编译为图片。

% gogogo.mp
% 这里是注释

beginfig (1) ; 

for i=0 upto 9:
  draw (0,0){dir 45}..{dir -10i}(6cm,0);
endfor

for i=0 upto 9:
  draw (7cm,1cm){dir 45}..{dir 10i}(13cm,1cm);
endfor
endfig ;
end

运行mpost命令将脚本处理成图像:

$ mpost gogogo.mp 
This is MetaPost, version 2.00 (TeX Live 2018) (kpathsea version 6.3.0)
(/usr/local/texlive/2018/texmf-dist/metapost/base/mpost.mp
(/usr/local/texlive/2018/texmf-dist/metapost/base/plain.mp
Preloading the plain mem file, version 1.005) ) (./gogogo.mp [1] )
1 output file written: gogogo.1
Transcript written on gogogo.log.
$ 

mpost是MetaPost的编译器,它会自动识别文件后缀名"mp",所以我们编译此文件时可以省略文件后缀名,mpost会把它自动补上。
运行以上命令后,在同一文件夹下会产生 gogogo.1 和 gogogo.log 这两个文件。
gogogo.1就是我们所想得到的图形文件,它是eps格式的。

3.2 修改MetaPost输出的文件名

这个文件名是mpost的自动设置的,我们可以通过MetaPost中的 filenametemplate命令来改变输出文件名的格式,其格式参数类似于C语言中的printf函数,如下:

% hello.mp
% 这里是注释
  
filenametemplate "%j-%c.eps";
beginfig (1) ; 

for i=0 upto 9:
  draw (0,0){dir 45}..{dir -10i}(6cm,0);
endfor

for i=0 upto 9:
  draw (7cm,1cm){dir 45}..{dir 10i}(13cm,1cm);
endfor
endfig ;
end

这样最后输出的图片文件名就是gogogo-1.eps

$ mpost gogogo.mp 
This is MetaPost, version 2.00 (TeX Live 2018) (kpathsea version 6.3.0)
(/usr/local/texlive/2018/texmf-dist/metapost/base/mpost.mp
(/usr/local/texlive/2018/texmf-dist/metapost/base/plain.mp
Preloading the plain mem file, version 1.005) ) (./gogogo.mp [1] )
1 output file written: gogogo-1.eps
Transcript written on gogogo.log.
$ 

3.3 修改MetaPost输出的文件格式

因为我不用latex,生成的eps格式图片对我来说,无论是查看图片还是插入文档,都非常的不方便。还好,MetaPost 1.8版本之后,能够直接生成png图片。
语法如下(这里我们实际也直接修改了MetaPost图片的文件名格式,改成了自带格式后缀):

% hello.mp
% 这里是注释
  
outputformat:="png";
filenametemplate "%j-%c.%o";
beginfig (1) ; 

for i=0 upto 9:
  draw (0,0){dir 45}..{dir -10i}(6cm,0);
endfor

for i=0 upto 9:
  draw (7cm,1cm){dir 45}..{dir 10i}(13cm,1cm);
endfor
endfig ;
end

运行编译:

$ mpost gogogo.mp 
This is MetaPost, version 2.00 (TeX Live 2018) (kpathsea version 6.3.0)
(/usr/local/texlive/2018/texmf-dist/metapost/base/mpost.mp
(/usr/local/texlive/2018/texmf-dist/metapost/base/plain.mp
Preloading the plain mem file, version 1.005) ) (./gogogo.mp [1] )
1 output file written: gogogo-1.png
Transcript written on gogogo.log.
$ 

最后生成的图片,可以直接在图片查看器中查看,如下图。


png output

4、MetaPost语法开头

这里给MetaPost的语法开一个头,如下的脚本可以在MetaPost中画一条线。

% hello.mp
% 这里是注释
  
outputformat:="png";
filenametemplate "%j-%c.%o";
beginfig (1) ; 
% Draw a line
draw (1cm,2cm) -- (3cm,5cm) ;
% Draw a line
draw (0cm,0cm) -- (3cm,5cm) ;
endfig ;
end

如下图:


line drawing

通过上面的例子,不难想象到如下的脚本能画出什么:

% hello.mp
% 这里是注释
  
outputformat:="png";
filenametemplate "%j-%c.%o";
beginfig (1) ; 
% Draw a line
draw (0cm,0cm) -- (3cm,0cm) ;
% Draw a line
draw (3cm,0cm) -- (3cm,3cm) ;
% Draw a line
draw (3cm,3cm) -- (0cm,3cm) ;
% Draw a line
draw (0cm,3cm) -- (0cm,0cm) ;
% Draw a line
draw (0cm,0cm) -- (3cm,3cm) ;
endfig ;
end

效果如下:


rect drawing

参考资料

上一篇下一篇

猜你喜欢

热点阅读