MetaPost

MetaPost
MPlogo.png
Парадигма Императивный
Спроектировано Джон Хобби
Первый   появившийся 1994
Стабильная версия 1.902 / 23 апреля 2014
Печать дисциплины Неявная, Динамическая, Строгая
Портал: metapost

Название MetaPost относится и к языку программирования, и к интерпретатору языка программирования MetaPost. Оба были получены из языка программирования и интерпретатора Дональда Кнута Metafont. MetaPost превосходит его благодаря созданию диаграмм на языке программирования PostScript по геометрическому/алгебраическому описанию. Язык разделяет элегантный декларативный синтаксис Metafont для манипулирования линиями, кривыми, точками и геометрическими преобразованиями. Многие из ограничений для MetaPost вытекают из особенностей Metafont. Например, у чисел с фиксированной запятой низкая точность, достаточная для того, чтобы представить координаты точек в глиф, но это может быть недостаточным при работе с фигурами в увеличенном координатном пространстве. Более того, MetaPost поддерживает не все особенности файлов PostScript. Наиболее примечательно, что контуры могут состоять только из одного сегмента (так, чтобы регионы были просто соединены), и регионы могут быть заполнены только однородным цветом.

Компиляция

Стандартный исходный файл MetaPost состоит из одной или нескольких фигур. Компиляция исходного файла генерирует EPS графику для каждой фигуры. Эти EPS-графики не являются самодостаточными в том, что шрифты, используемые в метках не встроены в графику. Если foo.mp является типичным для metapost исходный файл, то его содержимое следующей формы:

 beginfig(1);
    draw commands
 endfig;
 beginfig(2);
    draw commands
 endfig;
 ...
 beginfig(n);
    draw commands
 endfig;
 end;

Выполнение

 mpost foo.mp

дает следующий результат:

 This is MetaPost, Version hversioni
 (foo.mp [1] [2] . . . [n] )
 n output files written: foo.1 .. foo.n
 Transcript written on foo.log.

Для пользователей, которые просто хотят “начать” использовать MetaPost, доступен MetaPost с предпросмотром. Это просто графический интерфейс MetaPost. Он генерирует единственное изображение с возможностью сохранить вывод в EPS и PDF форматах. Пользователь также может сохранить исходный код и может посмотреть логи компиляции для помощи в отладке.

Типы

Стандартные типы

В MetaPost десять типов. Эти типы позволяют пользователю сохранять части изображения для дальнейшего использования. Мы кратко обсудим каждый тип и рассмотрим, как они используются в обычной программе на MetaPost.

  • numeric — числа
  • pair — упорядоченные пары
  • path — кривые Безье
  • picture — изображения
  • transform — преобразования, такие как сдвиги, повороты и наклоны
  • rgbcolor or color — триплеты с каждым компонентом между 0 и 1 (красный, зеленый, синий)
  • cmykcolor — четверня с каждым компонентом между 0 и 1 (циан, пурпурный, желтый и черный)
  • string — строки символов
  • boolean— значения "истина" - "ложь"
  • pen — свойства штриха

Практически все языки программирования предлагают способы хранения и извлечения числовых значений. В этом и состоит смысл числового типа данных в metapost. Так как графика в metapost представляет собой просто двумерные картинки, видно, что упорядоченная пара необходима, чтобы идентифицировать каждую точку на изображении. Тип данных упорядоченной пары предлагают эту функциональность. Каждая точка в плоскости состоит из х (т. е. абсцисса) и у (т. е. ордината). MetaPost использует стандартный синтаксис для определения точек плоскости, например, (X, Y), где X и Y являются переменными числового типа.

Следующий код объявляет переменную числового типа, переменную типа упорядоченная пара и две - типа строка.

 numeric idx;
 pair v;
 string s, name;

Заметьте, переменные числового типа не нужно объявлять. Ранее необъявленная переменная автоматически считается числоv при первом использовании.

Массивы

Как и многие другие языки программирования, MetaPost предоставляет возможность обращаться к переменной по индексу. После объявления переменной

pair a[];

становится возможным хранить точки в массиве с числовыми значениями в качестве индекса. Следующий код

 a[1] := (0,1);
 a[2] := (0,5);
 a[3] := (10,20);
 show a[1];
 show a1;
 j := 2;
 show a[j] + a[j+1];

выводит на консоль

 >> (0,1) 
 >> (0,1)
 >> (10,25)

Заметьте, точка массива с индексом 1 может быть доступна как a[1] так же как и a1, т.е. опустив скобки. Последняя удобная и часто практикуемая нотация работает, пока индекс является простым числом. Если индекс - числовая переменная или выражение, тем не менее, скобки должны присутствовать, так как, например, aj будет четко ссылаться на несвязанную переменную с таким именем вместо индекса j от переменной a.

На самом деле в MetaPost как в макро-языке нет настоящих массивов. Но со стороны пользователя режим индексирования переменных выглядит в точности как массив.

Обычные команды

Команда draw

Наиболее распространенная команда в MetaPost - это команда draw. Эта команда используется для рисования кривых или изображений. Для того, чтобы нарисовать путь от от Z1:=(0,0) к Z2:=(54,18) до Z3:=(72,72), мы должны сначала решить, какими мы хотим видеть кривые. Например, если мы хотим, чтобы эти точки были просто соединены отрезками, то мы используем

 draw z1--z2--z3;

Однако, если нам нужен плавный путь между этими точками, мы используем

 draw z1..z2..z3;

Для определения направления кривой мы используем оператор dir. Ограничения на кривую Безье налагаются с помощью

 draw z1{right}..z2{dir 45}..{up}z3;

Заметьте, что z2{dir 45} заставляет выходное направление у точки z2 быть под 45 градусов. Это подразумевает входное направление в 45 градусов. Для определения разных входных и выходных направлений мы используем

 draw z1{right}..{dir θi}z2{dir θo}..{up}z3;

Команда fill

Другая стандартная команда в MetaPost - команда fill. Ее мы используем для заполнения замкнутых контуров (или циклов). Для создания цикла мы должны присоединить его к объявлению кривой. Например

 path p;
 p := z1{right}..z2{dir 45}..{up}z3--cycle;
 fill p withcolor red;
 draw p;

Просто как это необходимо для заполнения замкнутых контуров, также может потребоваться обратная операция. Например, межтрубное пространство может быть построено с помощью

 color bbblue;
 bbblue := (3/5,4/5,1);
 path p,q;
 p := fullcircle scaled (2*54);
 q := fullcircle scaled (2*27);
 fill p withcolor bbblue;
 unfill q;
 draw p;
 draw q;

Кривая fullcircle - встроенная кривая, которая близко аппроксимируется к окружности в MetaPost с радиусом 1 пиксель, проведенная против часовой стрелки. Эта кривая не является в точности окружностью, т.к. она всего лишь параметризуется с помощью кривой Безье, а не с помощью тригонометрических функций; как бы то ни было, внешне она неотличима от окружности.

Команда arrow

При рисовании простых графиков и других иллюстраций использование команды arrow часто просто необходимо. Существует 2 типа команд arrow в MetaPost - drawarrow и drawdblarrow. Обеим командам требуется аргумент типа кривая. Например:

 drawarrow (0,0)--(72,72);

рисует стрелку из точки (0,0) в точку (72,72) по прямой между двумя этими точками.

Команда label

Почти все фигуры в технической документации сопровождаются подписями, которые помогают прояснить ситуацию, для которой сделана иллюстрация. Команда label требует 2 аргумента - строку с подписью и точку. Например, команда

 label("A", (0,0));

расположит букву "А" в координате (0,0), и прямоугольник вокруг этой отметки будет центрирован вертикально и горизонтально вокруг этой точки. Простые строки наподобие "А" не требуют верстки для удостоверения в том, что они появятся точно на фигуре.

Функции графики

Среди наиболее распространенных типов фигур TEX пользователи чаще всего встречаются с теми, которые нужны для построения гр,афика функции одной переменной. Создатели узнали об этом и создали пакет для выполнения этой задачи. Это вызывается

input graph;

У MetaPost есть возможность создания информации (т.е. упорядоченной пары) для отображения простых функций. Однако, для более сложных функций данные вероятно, должны быть построены с использованием внешних программ, таких как MATLAB (или Octave), Maple, Mathematica. Стандартный файл с данными может содержать следующее:

 0.0 0.0
 0.2 0.447214
 0.4 0.632456
 0.6 0.774597
 0.8 0.894427
 1.0 1.0

Эти данные представляют собой график f(x) = для шести равномерно распределенных точек в [0, 1]. Для отображения этих данных сначала должен быть определен размер графика. Выбрав ширину в 144 пикселя и высоту в 89 пикселей, минимальный график с этими данными может быть сгенерирован с помощью

 draw begingraph(144bp,89bp);
 gdraw "data.d";
 endgraph;

Графический пакет предоставляет много команд для кастомизации сгенерированных графиков, и эти команды полностью задокументированы в инструкции к графическому пакету.

Смотри также

Автор статьи: Ионов А.А.

Читать на другом языке