明明上周写了两篇,结果第一篇不知道为啥就不见了,真悲催。虽然这篇写的内容是“大家好,我终于开了个博客啦……”云云,但是看着自己的第一篇文章就这么给吞了,还是感觉一种淡淡的忧桑……=。=
好了,闲话不多说了。其实那篇被吞的文章里说了,俺这博客怎么也得保证一周一篇的频率吧。所以,说话得算话,虽然这周忙的不行,但是还是抽空看了看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
最后生成的图像是:
按顺序依次来解释吧。一个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。
恩,先写到这儿,晚上有空再写第二部分。