本篇内容主要参考网上流传的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;
- 点和线宽
drawdot命令可以在指定坐标画一个点,为使其醒目我们可以换粗一点的笔,如下面的pickup命令(是一种全局操作,会影响到之后所有的绘图命令)。METAPOST缺省画笔是0.5pt的圆形。
draw (0,0)--(10u,4u); pickup pencircle scaled 2pt; drawdot (0,0); drawdot (10u,4u);
- 曲线
曲线和直线命令相似,只是把连接两个点的–换成了..。不再举例子。
- 预定义图形
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);
- 线型
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;
- 箭头
drawarrow (0,4u)--(9u,4u); drawarrow reverse ((0,2u)--(9u,2u)); drawdblarrow (0,0)--(9u,0);
- 标注
\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));
- 循环
draw (0,0) for x=1 upto 3: ..(x*x,x)*u endfor;
循环缺省步长是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));
test
若是有完整的例子说明,那就更好了。