Metapost绘图入门

本篇内容主要参考网上流传的Alpha Huang的LATEX Notes v1.24文档

  • 介绍

METAPOST是一种图形绘制工具,由Knuth的学生John D. Hobby于1989年开始设计。其主要优点是输出的是EPS,而且支持彩色。Knuth声称自己画图时只用METAPOST。

  • 准备工作

用户需要将METAPOST的源文件(.mp)用一个命令程序mpost编译为一种特殊的EPS,也称作MPS,然后再把MPS插入LATEX源文件中使用。

一个METEPOST源文件可以包含多个图形,一般形式如下。每条语句以分号“;”结尾,注释行以百分号结尾。

beginfig(1); %图形起始
... %绘图命令
endfig; %图形结尾

beginfig(2);
…
endfig;
…
end; %文件结尾

METAPOST提供文件名模板命令,把下面的代码加到源文件头部,编译输出的文件名就会是“fig-01.mps、fig-02.mps、…”。

filenametemplate "%j-%2c.mps"; %加在源文件头部
  • 编译和查看

用下面的命令编译.mp源文件就可以输出mps格式的图形文件。

$ mpost fig(.mp)

MPS可以用GSView查看,也可以用以下命令把它转换成PDF再查看。

$ epstopdf fig-01.mps

或者直接把MPS文件添加到tex文件中:

\begin{figure}[htbp]
\centering
\includegraphics[scale=1.0]{fig-01.mps}
\caption{图形标题}
\end{figure}
  • 直线

METAPOST中的缺省长度单位是bp,还可以定义一个缩放系数,把坐标都转换成此系数的倍数,方便缩放。METAPOST中的赋值符号是:=,而=用于方程式。变量在同一源文件中只需要定义一次,其后的图形中可以使用。cycle表示绘制封闭图形。下面是一个简单的例子。

draw (0,0)--(40,0)--(20,20)--(0,0);
u:=10pt;
draw (5u,0)--(9u,0)--(7u,2u)--cycle;

选区_004

  • 点和线宽

drawdot命令可以在指定坐标画一个点,为使其醒目我们可以换粗一点的笔,如下面的pickup命令(是一种全局操作,会影响到之后所有的绘图命令)。METAPOST缺省画笔是0.5pt的圆形。

draw (0,0)--(10u,4u);
pickup pencircle scaled 2pt;
drawdot (0,0);
drawdot (10u,4u);

选区_005

  • 曲线

曲线和直线命令相似,只是把连接两个点的–换成了..。不再举例子。

  • 预定义图形

fullcircle 命令以原点为圆心画一个单位圆,类似的预定义图形还有 halfcircle、quartercircle、unitsquare 等。单位正方形的参考点在其左下。通过不同的横向和纵向缩放系数,我们可以把圆形和正方形变成椭圆和长方形。见下面的例子。

draw fullcircle scaled 2u;
draw halfcircle scaled 2u shifted (3u,0);
draw quartercircle scaled 2u shifted (5u,0);
draw fullcircle xscaled 4u yscaled 2u shifted (9u,0);
draw unitsquare scaled 2u shifted (12u,-u);
draw unitsquare xscaled 4u yscaled 2u shifted (15u,-u);

选区_006

  • 线型
draw (0,0)--(10u,0) dashed withdots;
draw (0,1u)--(10u,1u) dashed withdots scaled 2;
draw (0,2u)--(10u,2u) dashed evenly;
draw (0,3u)--(10u,3u) dashed evenly scaled 2;

选区_007

  • 箭头
drawarrow (0,4u)--(9u,4u);
drawarrow reverse ((0,2u)--(9u,2u));
drawdblarrow (0,0)--(9u,0);

选区_008

  • 标注

\label 命令可以在指定的点附近加文字标注。也可以用一对 btex 和 etex 来嵌入一些TEX内容,具体请看例子。

draw unitsquare xscaled 10u yscaled 4u;
label.top("top", (5u,4u));
label.bot("bottom", (5u,0));
label.lft("left", (0,2u));
label.rt("right", (10u,2u));
label.ulft("upper left", (0,4u));
label.urt("upper right", (10u,4u));
label.llft("lower left", (0,0));
label.lrt("lower right", (10u, 0));
label.rt(btex $E=mc^2$ etex, (3u,2u));

选区_009

  • 循环
draw (0,0)
for x=1 upto 3:
..(x*x,x)*u
endfor;

选区_010
循环缺省步长是1,也可以改用其他步长。upto其实就是step 1 until的缩写方式。

for x=1 step .5 until 3:
  • 中文或特殊标注

上面提到的标注方法如果用中文的话可能会显示不出来,这时可以考虑在mp文件中嵌入tex代码来支持中文。具体为,在mp文件开始添加:

verbatimtex
    %&latex
    \documentclass{article}
    \usepackage{CJKutf8}
    \begin{document}
    \begin{CJK}{UTF8}{gbsn}
etex

在最后“end;”之前添加:

verbatimtex
    \end{CJK}
    \end{document}
etex

在需要添加latex代码的地方,只要将欲添加代码包裹在“btex”和“etex”标签中间即可。比如用 latex 语句控制 label 的字号:

label.top(btex\Huge{System Optimization}etex, (10v,4.2v));

Metapost绘图入门》上有2条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注