MetaPost画图入门

作者: SpaceCat | 来源:发表于2019-06-17 08:48 被阅读4次

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

参考资料

相关文章

  • MetaPost画图入门

    1、介绍 简单的说,MetaPost就是一个用脚本画图的工具。由于越来越多的使用Markdown编写文档,有时候会...

  • Python中好用的可视化库

    入门款:Matplotlib 在Python中实现matlab画图效果的库,可以绘制。适合论文绘图。相关画图教程在...

  • Matlab画图入门课

    basic plot x=0:0.01:2*pi;y=sin(x);figure;plot(x,y); line ...

  • 机器学习-画图工具-matplotlib

    机器学习,使用画图工具:matplotlib.pyplot 简单入门实例,x变量和y(sin)正弦函数的生成图片 ...

  • echarts

    echart 入门教程 http://www.imooc.com/view/687 一.浏览器画图原理简介 1.C...

  • MetaPost作球极投影

    效果图 完整代码

  • 瞎写点啥

    作为一名研狗, 天天盯着论文程序寻bug; 盯着latex寻bug; 盯着metapost寻bug. 早晨带着早饭...

  • Matplot入门

    开始 画图是很细节的事情,matplotlib的入门,从试过每个参数开始。以下练手,参考的 https://www...

  • 月薪3千和月薪3万景观设计师的差距

    进了园林门 秒变画图狗 许多刚入门的景观设计师把设计等同于画图 日画夜画 热爱被消耗在枯燥中 说的是你吗? 可是设...

  • 4《坛经·行由品第一4》

    【原文】 祖已知神秀入门未得,不见自性。天明,祖唤卢供奉来,向南廊壁间绘画图相。忽见其偈,报言: ...

网友评论

    本文标题:MetaPost画图入门

    本文链接:https://www.haomeiwen.com/subject/zirofctx.html