MetaPost画图入门
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