MetaPost输出ps文件的预览

MetaPost输出ps文件的预览

John D. Hobby

  预览MetaPost输出的ps文件并不难,但是仍然有一些事情需要了解。这些问题如何解答?在ps浏览器中图形是如何被裁减为正确的边界盒子的?为什么metapost中的标签文字的字体很丑陋或者是干脆没有渲染,如何才能避免?如何将多张图形整合到一个多页的文档中,而只需要一个浏览进程打开?


边界盒子(bounding box)
  默认的设置,MetaPost输出的是PostScript语言的子集,只包含图形的代码,不会附带其他的资源,比如字体等。这样的PostScript代码在某些方面是欠缺的,它的文件头和EPSF(Encapsulated PostScript)是不一样的。EPSF文件没有包含相应的页面大小,但是提供了边界盒子信息,因为它们本来就是要被其他的文档使用的。MetaPost输出的是带有边界盒子的ps文件,却不能被识别为EPSF。
  这样输出的ps文件在TeX文档中是没有问题的,但是ps浏览器就有麻烦了。比如,由于不正确的ps文件头,GSvie会忽略边界盒子信息,把所有的内容裁减到页面大小。在这些固定的页面边界之外的图形元素就被隐藏了。
  为了避免这样的问题,首先需要在MetaPost源文件beginfig之前写好:
                      prologues:=2;
这样,输出的ps文件才能被正确地认为是EPSF文件,浏览器才能使用边界盒子信息。
  解决MetaPost输出ps文件缺陷的一种方法是将图形的左下角移动到原点
            currentpicture:=currentpicture shifted -llcorner currentpicture;
这个语句应该写在endfig之前。但是仅仅这样并不能避免右上角的裁减。另外,这个命令需要在每一个图形上添加,会改变ps输出的坐标,可能会令纠错变得复杂。执行这种手动的变换是不推荐的。


文本标签
  另一个预览问题是包含文本标签的图形。经常地,标签的文本字体会绘制出错,甚至没有被绘制。原因是,默认设置下,MetaPost输出的ps文件是有缺陷的,它使用了一种简单的和不标准的方法来声明使用的字体。将prologues变量设置为2,使得MetaPost生成了更复杂的ps代码来声明需要的字体和编码信息。如果ps浏览器能够提供所需的字体,就能够正确绘制图形中的文本标签了。如果仍然有错误的字型,这个语句
                      prologues:=3;
能够令MetaPost将使用的字体嵌入到输出文件中,这样浏览器肯定能正确绘制字体。相应地,这样可能增大输出文件的大小。另外,如果多个图形使用了相同的字体,这个字体可能被多次嵌入。这样,在最终插入外部文档之前,最好把prologues变量设置为0。


校样页
  如果有多个图形在同一个源文件中,需要同时预览,那么每个图形都打开一个浏览器进程,换来换去,很累。另一个办法是将所有的图形放入校样页中,就是一个多页的文档,只需要一个浏览器进程打开。MetaPost包含两个TeX脚本,mproof.tex和mpsproof.tex可以实现。
调用mproof.tex:
            tex mproof (MetaPost输出文件)
这个命令同样输出dvi文件。这样的话,不需要注意prologues变量设置,因为在校样页中MetaPost图形已经被嵌入了。
mproof后的参数是MetaPost输出文件清单,可以是不同的源文件生成的。例如,一个fig.mp源文件,包含3个图形,校样页可以这样生成:
            tex mproof fig.?
调用mpsproof.tex
其功能更强。mproof.tex需要运行在TeX环境下,并且需要DVI驱动,mpsproof.tex可以直接生成pdf文件。同时它提供一些命令选项。
使用\noheaders选项,文件名,时间戳和页号将被校样页忽略。
            tex mpsproof \noheaders (MetaPost输出文件)
使用\bbox,可以生成边界盒子大小的文件:
            pdftex mpsproof \bbox fig.1


其他
其他的预览方法,包括使用工具mptopdf和一个Perl写的mpstoeps.pl.同时有一个在线工具可以编译和预览MetaPost源码http://tlhiv.org/mppreview

备注:

本文摘自 "METAPOST A User's Manual" 第14章第二小节,主要讲metapost生成的ps文件的问题。其中prologues变量的设置讲的很好。

你可能感兴趣的:(post)