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

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