MetaPost初学-part I

明明上周写了两篇,结果第一篇不知道为啥就不见了,真悲催。虽然这篇写的内容是“大家好,我终于开了个博客啦……”云云,但是看着自己的第一篇文章就这么给吞了,还是感觉一种淡淡的忧桑……=。=

 

好了,闲话不多说了。其实那篇被吞的文章里说了,俺这博客怎么也得保证一周一篇的频率吧。所以,说话得算话,虽然这周忙的不行,但是还是抽空看了看MetaPost的Manual,给个链接(http://www.tug.org/docs/metapost/mpman.pdf)。

 

这里说个题外话,到了烟酒僧的阶段,得经常替boss干项目,写文档啥的是逃不掉的了。现在越发的觉得LaTeX写出来的东西看着真是让人舒服,越过前期较为艰难的入门曲线之后,后面会省事不少。不过……最郁闷的东西还是,有时候交东西还是必须要弄word版的,然后就得pdf转word,唉,那时候就悲催了,=。=。。。

 

好了,回归正题,毕竟是作者本人写的说明文档,写的东西还是很详细,看着蛮过瘾的,不过现在也没看完,第10章的样子,所以有些东西还没弄明白。不过,初步的作图已经可以ok啦。对于最基本的语法,在Manual以及大牛王垠的主页(http://docs.huihoo.com/homepage/shredderyin/metapost.html)上都有详细的介绍。我就以自己作图的一个例子把这些东西非常简单的串一下吧。

 

首先,在使用MetaPost绘图之前,我们要明白其编译的过程,也就是使用如下命令:

mpost filename.mp

 

编译之后会生成filename.1、filename.2等文件,这些就是已经生成的图像,就是扩展名比较奇怪,直接用GSview软件就可以看了。同时,在LaTeX中,使用如下命令就可以载入改该图:

\includegraphics{filename.1}

 

这里,有一个问题,使用WinEdt编译MetaPost之后,貌似不可以直接用GSview查看,可能是文件扩展名的问题,没有关联起来。因此,想要检验自己画的对不对就有点麻烦。这里推荐一个方法(是从别人那儿参考的,找不到出处了),在该文件夹中新建一个tex文件,用LaTeX把图载入进去,然后再由tex--->dvi--->ps 的过程,就可以直接用GSview看了。

 

在mpview.tex中使用如下代码:

\documentclass{article}
\usepackage{amsmath,amscd,amssymb,verbatim}
\usepackage{graphics}

\begin{document}

\includegraphics{filename.1} % include the eps figure

\end{document}

 

然后将以下的批处理命令保存到一个mpview.bat:

mpost -tex=latex filename.mp 
latex mpview.tex 
dvips mpview.dvi 
gsview32 mpview.ps

 

这里有两点要注意的:

1.编译的时候要增加 -tex=latex 的选项,否则到时候无法在MetaPost中使用LaTeX输入公式

2.GSview在win系统中的名称是gsview32.exe,貌似在windows下的bin文件夹中可以看到。

 

好了,说完编译的内容,下面说说MetaPost书写的语法,下面就以一个例子来说明吧:

ahangle := 30;                %调整箭头的角度

verbatimtex
\documentclass{article}
\usepackage{ctex}
\begin{document}
etex;

beginfig(1)
u = 1cm;
z0 = (u,u);
z4 - z0 = 10u * dir 15;
(z5 - z2) dotprod (z4 - z0) = 0;
z2 = whatever[z0,z4];
z5 = (6u, 0);

path p[];
p1 = z0 .. z4;
p2 = fullcircle scaled 5u shifted z5;
z3 = p1 intersectionpoint p2;
z2 - z1 = z3 - z2;

pickup pencircle scaled 1.25;
draw p2;
linejoin:=mitered;
drawarrow(p1);

draw z0 shifted(-1u, 0)..z0 shifted(11u, 0) withcolor 0.5 white;
draw z5..z2 dashed evenly;
draw z5..z1 dashed evenly;
draw z5..z0 dashed evenly;

p3 = unitvector(z1-z0){(z1-z0)rotated -90}..unitvector(u,0);
draw p3 scaled 0.5cm shifted z0;

amid = .5 * arclength p3;
t = arctime amid of p3;
z7 = point t of p3;

draw ((1,0)--(1,1)--(0,1))
zscaled (0.2cm * unitvector(z2-z3)) shifted z2;

pickup pencircle scaled 3;

dotlabel.bot(btex $A(x_a,y_a)$ etex, z0);
dotlabel.bot(btex $B$ etex, z1);
dotlabel.lrt(btex $C$ etex, z2);
dotlabel.bot(btex $D$ etex, z3);
dotlabel.rt(btex $O(x_0,y_0)$ etex, z5);
label.rt(btex ${\small \alpha}$ etex, z7 scaled 0.5cm) shifted 
z0;

label.top(btex $y=\tan\alpha\cdot(x - x_a) + y_a$ etex, (0,0)) 
rotated 15 shifted(.8[z0,z4]);

label.top(btex \sl Horizontal Line etex, z0 shifted(9.5u,0)) 
withcolor .5 white;
endfig;

verbatimtex
\end{document}
etex

end

 

最后生成的图像是:

image

 

按顺序依次来解释吧。一个mp文件的基本格式为

 

beginfig(1)
...
endfig

beginfig(2)
...
endfig

...
...

beginfig(n)
...
endfig

end

每个beginfig(n)...endfig包围的内容会被解释并生成一个filename.n的文件。

 

同时,如果你想使用LaTeX的输入公式等功能,需要在开头和结尾输入以下内容:

verbatimtex
\documentclass{article}
\usepackage{ctex}
\begin{document}

...
...
...

verbatimtex
\end{document}
etex

包围的内容与LaTeX写作时非常相似。

 

u = 1cm;
z0 = (u,u);
z4 - z0 = 10u * dir 15;
(z5 - z2) dotprod (z4 - z0) = 0;
z2 = whatever[z0,z4];
z5 = (6u, 0);

这段的内容是确定z0,z1,...,z5的坐标。dir命令给出角度,dotprod命令是向量的乘积。

z2 = whatever[z0,z4];

等价于

z2 = z0 + whatever * (z4 -z0)

这里,我只关心z2在z0与z4的连线上,至于具体哪个位置,我并不care。

 

恩,先写到这儿,晚上有空再写第二部分。

转载于:https://www.cnblogs.com/toothache/archive/2012/09/23/2698971.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值