MetaPost
MetaPost — интерпретатор языка программирования META, который можно использовать для создания графических иллюстраций. MetaPost был создан Джоном Хобби в то время, когда он был аспирантом у Дональда Кнута. В качестве основы была взята система создания шрифтов METAFONT[1]. На входе интерпретатору подаётся текст на META, а на выходе получается графический файл в формате PostScript[2]. Начиная с версии 1.200 MetaPost поддерживает в качестве выходного формата SVG-графику[3]. Язык META, унаследованный от METAFONT, позволяет оперировать геометрическими объектами, такими как: точка, путь, картинка и выполнять над ними различные алгебраические действия, например, сдвиг, вращение и другие линейные преобразования. Основными отличиями MetaPost от METAFONT кроме выходного формата является наличие поддержки цвета и возможность делать текстовые вставки. Текстовые вставки создаются с помощью TeX, таким образом, любая конструкция, которая может быть создана в TeX, также может быть вставлена в картинку MetaPost. Кроме этого изначально автор MetaPost Джон Хобби разработал библиотеку METAOBJ (“metapost Objects”) для визуализации двумерных графиков[4][5]. Интерпретатор MetaPost (исполняемый файл mpost) вместе со стандартными макро-библиотеками распространяется как открытое программное обеспечение, обычно, в составе дистрибутивов TeX. MetaPost-конвейерНа вход программы mpost подаётся «META-картинка». «META-картинка» — это текстовый файл с расширением .mp (далее для краткости mp-файл) с инструкциями на языке META. В одном mp-файле можно хранить несколько описаний картинок. При компиляции с помощью mpost создаются файлы с тем же именем, что и у исходного файла, но с расширениями в виде чисел, которые указываются в декларации \DeclareGraphicsRule{*}{eps}{*}{}
От «правильных» eps-файлов они отличаются только тем, что в них не «внедрены» шрифты, поэтому просмотреть их без дополнительной обработки не удастся. Шрифты можно внедрить посредством программ latex и dvips с результатом в виде eps-файла или скрипта mptopdf с результатом в виде pdf-файла. Эти картинки уже можно использовать независимо любой программой, которая поддерживает эти векторные форматы. Кириллица и MetaPostВнедрить кириллицу в метки MetaPost можно только с помощью LaTeX. Для этого mp-файл должен иметь примерно следующий заголовок: verbatimtex
\documentclass[12pt]{minimal}
%простейшая кириллизация
\usepackage[koi8-r]{inputenc}
\usepackage[english,russian]{babel}
\begin{document}
etex;
Этот заголовок будет использоваться каждый раз, когда MetaPost доходит до текста, находящегося между метками Для того, чтобы при создании надписи использовался именно latex, интерпретатор mpost должен запускаться с опцией -tex=latex. Если эта опция отсутствует, то информацию о том, что следует запускать, mpost ищет в переменной окружения TEX. По умолчанию вместо latex запускается tex. Если в тексте определяется переменная Структура mp-файлаПосле заголовка идут описания картинок. Каждая картинка заключается между командами %Математический HelloWorld
beginfig(3) ;
for alpha:=90 step -9 until 0:
label(btex \(f(x)=
\frac{1}{\sqrt{2\pi}\,\sigma}
\int\limits_{-\infty}^{\infty}
e^{-\frac{x^2}{2\sigma^2}}dx\) etex
scaled (5*(1-alpha/100)) rotated alpha,(0,0))
withcolor(max(1-alpha/45,0)*red+min(alpha/45,2-alpha/45)*green+max(alpha/45-1,0)*blue);
endfor;
endfig ;
Файл должен закончиться командой АвтоматизацияДля автоматизации получения картинок с помощью MetaPost можно использовать следующий Makefile: #временный файл
tmp_file := tmp_file
#программы
LATEX := latex
MPOST := mpost -tex=latex
DVIPS := dvips
MPTOPDF := mptopdf
MV := mv
all:
@echo "run: make mpfile.n.[eps|pdf] - where n is the picture number"
%.eps: %
@echo "\documentclass[12pt]{minimal}">$(tmp_file).tex
@echo "\usepackage[koi8-r]{inputenc}">>$(tmp_file).tex
@echo "\usepackage[english,russian]{babel}">>$(tmp_file).tex
@echo "\usepackage{graphicx}">>$(tmp_file).tex
@echo "\DeclareGraphicsRule{*}{eps}{*}{}">> $(tmp_file).tex
@echo "\nofiles">>$(tmp_file).tex
@echo "\begin{document}">> $(tmp_file).tex
@echo "\thispagestyle{empty}">> $(tmp_file).tex
@echo "\includegraphics{$(basename $@)}">> $(tmp_file).tex
@echo "\end{document}">> $(tmp_file).tex
@$(LATEX) $(tmp_file)
@$(DVIPS) -E -o $@ $(tmp_file)
@rm $(tmp_file).*
%.pdf: %
@$(MPTOPDF) $<
@$(MV) `echo $< | sed -e "s/\.\([0-9]\+\)$$/-\1.pdf/"` $<.pdf
clean:
@rm -f mpx* *~ *.log *.mpx
@rm -f $(tmp_file).*
#Зависимости для mpost-картинок.
#По одной для каждого числа из beginfig
%.1:%.mp
$(MPOST) $<
…
%.64:%.mp
$(MPOST) $<
Чтобы на выходе получить готовую eps-картинку с уже «внедрёнными» шрифтами, которую можно вставить уже куда угодно, достаточно выполнить следующую команду: make <имя mp-файла>.<номер картинки>.[eps|pdf]
Обычно mp-файлам даются короткие имена. Как вариант, предлагается shell-скрипт (mp2pdf.sh), который делает практически то же самое. Предполагается использование GNU/Linux (или подобной ОС). Скрипт для каждого #!/bin/sh
# Скрипт для превращения MetaPost файла в EPS и PDF рисунки
# каталоги для хранения eps- и pdf-файлов
EPS_DIR=./eps
PDF_DIR=./pdf
TMP_FILE=tmp
if [[ "$@" == ""]];
then
echo
echo Скрипт обрабатывает mp-файл, создает eps- и pdf-файлы и
echo перемещает их соответственно в каталоги $EPS_DIR и $PDF_DIR
echo Использование: ./mp2pdf.sh file.mp
echo
exit
fi
if [ ! -d $EPS_DIR ]; then
echo ======== Создание каталога для eps-файлов
mkdir $EPS_DIR
fi
if [ ! -d $PDF_DIR ]; then
echo ======== Создание каталога для pdf-файлов
mkdir $PDF_DIR
fi
echo ======== Исходный файл: $@
list=`grep beginfig $1 | sed -e 's/beginfig(//' -e 's/);//'`
echo ======== Список блоков: $list
echo ======== Запуск mpost...
mpost -tex=latex $1
for i in $list # цикл по блокам beginfig()
do
epsi=${1%mp}$i
eps=${1%.mp}${i}.eps
pdf=${1%.mp}${i}.pdf
echo Блок ${i}: ' >> ' $epsi ' >> ' $eps ' >> ' $pdf
if [ ! -e $epsi ]; then
echo
echo Ошибки при обработке mp-файла!
echo
exit
else
echo ======== MetaPost ===== Ok!
fi
echo ======== Генерация временного LaTeX-файла...
echo \\documentclass[12pt]{article} > ${TMP_FILE}.tex
echo \\usepackage{mathtext} >> ${TMP_FILE}.tex
echo \\usepackage{amsmath} >> ${TMP_FILE}.tex
echo \\usepackage[T2A]{fontenc} >> ${TMP_FILE}.tex
echo \\usepackage[koi8-r]{inputenc} >> ${TMP_FILE}.tex
echo \\usepackage[english,russian]{babel} >> ${TMP_FILE}.tex
echo \\usepackage{graphics} >> ${TMP_FILE}.tex
echo \\begin{document} >> ${TMP_FILE}.tex
echo \\pagestyle{empty} >> ${TMP_FILE}.tex
echo \\includegraphics{${epsi}} >> ${TMP_FILE}.tex
echo \\end{document} >> ${TMP_FILE}.tex
echo ======== Запуск LaTeX...
latex ${TMP_FILE}
if [ ! -e ${TMP_FILE}.dvi ]; then
echo
echo ======== Не найден dvi-файл!
echo
exit
else
echo ======== LaTeX ===== Ok!
fi
echo ======== Запуск dvips...
dvips -E ${TMP_FILE} -o $eps
echo ======== Запуск epstopdf...
epstopdf $eps
if [[ -e $pdf]]; then
mv $eps $EPS_DIR
mv $pdf $PDF_DIR
echo ======== Перенос $eps и $pdf в нужное место...
fi
echo ======== Зачистка...
rm *.log *.mpx ${TMP_FILE}.* *.aux *.dvi *.tex $epsi 2>>/dev/null
done
Скрипт надо сделать исполняемым: chmod +x ./mp2pdf.sh
Использование: ./mp2pdf.sh file.mp
Пример MetaPost-файла для тестирования: %% Шаблон для mp-файлов
prologues:=0;
% LaTeX; работает вместе с "mpost -tex=latex file.mp" (см. скрипт выше)
verbatimtex \documentclass[12pt]{article}
\usepackage{mathtext}
\usepackage{amsmath}
\usepackage[T2A]{fontenc}
\usepackage[koi8-r]{inputenc}
\usepackage[english,russian]{babel}
\begin{document}
etex;
beginfig(1);
draw (0,0)--(0,100)--(100,100)--(100,0)--cycle;
label(btex Метка: $\alpha_1$ etex, (50,50));
endfig;
end.
Язык METAВ качестве базового языка, инструкции которого подаются на вход программы MetaPost, используется язык META[6]. В MetaPost можно оперировать следующими типами данных:
Имена переменных в META могут состоять из нескольких лексем. Лексемы могут быть либо буквенными, либо числовыми. Например, переменная Все переменные необходимо объявлять перед использованием. Исключением являются переменные типа pair w[];
w1:=(10,5);
w2:=w1;
Взаимодействие переменных, чисел и операторов вполне естественно, но достаточно нетривиально. Описание этого достойно отдельного раздела. В любом случае следует действовать по правилу: если сомневаетесь, то расставляйте скобки в нужных местах. В META можно опускать некоторые из операторов для сокращения записей, например, Набор стандартных вычислительных операций расширен с учётом специализации языка. В частности, поддерживаются операции пифагорова сложения , пифагорова вычитания , целочисленное деление В языке присутствуют операторы цикла, условных переходов и тому подобное. Отличительной особенностью META является возможность решать системы линейных уравнений. Например, выражение вида , означает, что точка C находится ровно посередине между точками А и B. Программу mpost можно использовать в режиме калькулятора для вычислений на языке META. Это позволяет проверить правильность ваших предположений относительно языка. Пример сеанса представлен ниже: baldin@evgueni:~$ mpost
This is MetaPost, Version 0.901 (Web2C 7.5.5)
**\relax
*a:=10;
*b:=8;
*c:=a+-+b;
*show c;
>> 6
*show (3-sqrt 5)/2;
>> 0.38197
*show angle(1,sqrt 3);
>> 60.00008
*show 2**10;
>> 1024.00003
*show infinity;
>> 4095.99998
*show epsilon;
>> 0.00002
*show infinity-infinity;
>> 0
*end
Transcript written on mpout.log.
После вывода приглашения Если необходимо вычислить однострочное выражение, то на первоначальное приглашение baldin@evgueni:~$ mpost
This is MetaPost, Version 0.901 (Web2C 7.5.5)
**expr
(/usr/local/texlive/2005/texmf-dist/metafont/base/expr.mf
gimme an expr: 2(a+3b)-2b
>> 4b+2a
gimme an expr: 1/3[a,b]
>> 0.33333b+0.66667a
Примеры
Код каждого примера приведён в описании соответствующей картинки. Известен пример нестандартного применения программы. С 1996 по 1999 год авторы спелеопрограммы Therion[7] написали DSL METAPOST для преобразования 2D-карт в 3D-модели пещер, а все подписи реализовали в формате TEX[8]. АналогиMetaPost имеет некоторое количество ограничений, доставшихся ему в наследство от METAFONT. Попытка обойти эти ограничения легла в основу создания программного интерпретатора Asymptote[9]. Язык, используемый Asymptote, похож на META, но вследствие перехода от синтаксиса макро-языка к синтаксису C++ гораздо более многословен и сложен. Основное преимущество Asymptote заключается в лучшей поддержке возможностей PostScript. Functional MetaPost — DSL для графики встроенный в Haskell, который генерирует код MetaPost.[10] METAGRAF — графический интерфейс над MetaPost. Написан на Java. По возможностям напоминает xfig. Картинки сохраняет в формате MetaPost.[11] Среди программного окружения LaTeX аналогичной MetaPost функциональностью также обладают пакеты PSTricks и PGF/TikZ. На основе программной базы MetaPost был создан инструмент METATYPE1 для разработки Type1 шрифтов. Примечания
Ссылки
Литература
|