Как рисовать в 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-систем.
Б. И. Тулеуов.
Караганда, 21 февраля 2006 г.
Как русифицировать
Scientific Word (Scientific WorkPlace)