Как рисовать в METAPOST

 

Система METAPOST была создана на основе METAFONT Джоном Хобби из AT&T Bell Laboratories. METAFONT, как известно, был создан Кнутом, автором TeX, для разработки шрифтов, и является мощной системой. Все TeX’овские шрифты были созданы с помощью этой программы, при этом Кнуту помогал известный шрифтовый дизайнер Херман Цапф (автор гарнитуры «Palatino»). Очевидно, с помощью этой системы можно также рисовать (буковки ведь состоят из контуров!), но фактически при этом приходится иметь дело с растровыми картинками с конечным разрешением, что не всегда приемлемо. METAPOST же генерирует стандартный PostScript, что позволяет получить иллюстрации полиграфического качества. Язык METAPOST приблизительно на 2/3 базируется на METAFONT, поэтому тем, кто знаком с последним, легко освоить первый. Также, в силу «построения», в иллюстрации можно встраивать практически любые TeX’овские объекты. Практически все современные дистрибутивы TeX включают METAPOST (если специально не выбросили), описание языка и примеры можно найти в каталоге texmf\doc\metapost\base\

grdemo.pdf

mpintro.pdf/mpintro.ps — введение

mpman.pdf/mpman.ps — подробное руководство

Впрочем, язык легко освоить в силу простоты и ясности. Приведём простой пример — рисунок

 

получен из следующего кода

 

input format

 

def phi(expr x,s) = s*mexp (-(s**2)*(x**2))/(sqrt (3.14))  enddef;

 

ahangle:=25;   %

ahlength:=6bp; %

 

beginfig(122);

numeric ux, uy, yshift;

path p[];

ux = 1mm; uy = 15mm; %

yshift = .5mm;

k = 1;

 

drawarrow (-40ux,-yshift)--(40ux,-yshift);

drawarrow (0,-yshift)--(0,45ux);

pickup pencircle scaled .7pt;

 

for i=1 upto 4:

  p[i] = (0,(phi(k*10*0,i))*uy){right}

  for j=1 upto 9: ..((1*j/10)*ux, (phi(k*j/10,i))*uy) endfor

  for j=1 upto 30: ..(1*j*ux, (phi(k*j,i))*uy) endfor;

endfor;

 

for i=1 upto 2:

   draw p[i] reflectedabout ((0,-1),(0,1));

   draw p[i];

endfor;

 

label.lrt(btex $x$ etex, (40*ux, -yshift)); % метка по оси x

label.rt(btex $h_0(x)$ etex, (0,40*ux));    % метка по оси y

for i=1 upto 7:

 label.bot(format("%g",i-7+3), (((i-7+3)*10)*ux, -yshift)); % наносим числовые значения по оси x

endfor;

 

draw p[4] reflectedabout ((0,-1),(0,1));

draw p[4];

 

% вычисляем координаты точек, где рисуем значения параметров

z1 = p1 intersectionpoint p2;

z2 = p2 intersectionpoint p4;

z3 = ((0,y1/2)--(30ux,y1/2)) intersectionpoint p1;

z4 = ((0,.5[y1,y2])--(30ux,.5[y1,y2])) intersectionpoint p2;

z5 = ((0,1.5y2)--(30ux,1.5y2)) intersectionpoint p4;

label.urt(btex $\sigma_1=1$ etex,z3);

label.urt(btex $\sigma_2=2$ etex,z4);

label.urt(btex $\sigma_3=4$ etex,z5);

 

endfig;

end

 

Прекрасные примеры, кроме руководства, можно также найти по адресу http://zoonek.free.fr/LaTeX/Metapost/metapost.html.

Приведённый выше пример сохраните в файле exp.mp. Для обработки создайте командный файл под названием !maker.bat следующего содержания

@echo off

mp %1

echo \hsize = 180mm > plaintest.tex

echo \input epsf >> plaintest.tex

echo \nopagenumbers >> plaintest.tex

echo $$\epsfbox{%1.122}$$ >> plaintest.tex

echo \bye >> plaintest.tex

tex plaintest

dvips plaintest

del %1.122

del %1.log

del %1.mpx

Что делает этот скрипт? Если дать команду !maker exp (без расширения!), вызывается METAPOST (mp), затем динамически генерируется tex-файл plaintest.tex

\hsize = 180mm

\input epsf

\nopagenumbers

$$\epsfbox{exp.122}$$

\bye

который далее пропускается по цепочке tex ® dvips для получения PostScript. Результирующий файл удобно смотреть через GSView, эта программа удобна ещё тем, что умеет сама переоткрывать документ при его изменениях, так что держите её открытой, пока не закончили работу. Обратите внимание, что исходный файл может содержать сразу много рисунков, т. е., конструкций beginfig()… endfig;, но мне лично удобно выводить по-одному; я специально выделил аргумент beginfig(122) красным цветом, чтобы вы использовали одно и то же значение как в исходном файле, так и в командном файле. Само же значение «122» взято с потолкаJ. В просмотрщике GSView отметьте пункт меню “Show Bounding Box”, окончательный результат преобразуйте с помощью пункта меню File | PS to EPS для получения файла в формате eps, который является наилучшим для вставки в документ TeX.

В вышеприведённом скрипте можно использовать latex вместо tex, однако последний быстрее и проще. Да и скрипт немного усложнился бы. И ещё — легко переписать его для Unix-систем.

 

 

Б. И. Тулеуов.

berik_t@yahoo.com

Караганда, 21 февраля 2006 г.

 

Как  русифицировать  Scientific Word (Scientific WorkPlace)

Как установить MiKTeX

Как защитить свои диски

Как заменить pk-шрифты в ps-файлах

Работаем без инсталляции!

Разное

Hosted by uCoz