\chapter{Дополнительные главы}
\label{sec:dop}

\begin{flushright}
  Всё описать невозможно,  \\
  но ничто не запрещает попробовать.
\end{flushright}


Возможности \meta{} в то или иной мере уже изложены. В этой статье
будут разобраны полезные приёмы, которые можно применять при
кодировании картинки и описаны некоторые из стандартных пакетов,
поставляемых с \mpost{}.

Исходники стандартных \mpost{} пакетов, обычно находится в стандартной же
директории
\mbox{\texttt{\$(TEXMF)/texmf-dist/metapost/}}, а документация к ним в
директории \mbox{\texttt{\$(TEXMF)/texmf-dist/doc/metapost/}},
где  \texttt{\$(TEXMF)} "--- корневая директория для дистрибутива
\LaTeX. Сказанное верно для \TeXLive.

\section{Пакет boxes}
\label{sec:boxes}

\texttt{boxes} "--- один из самых первых пакетов общего назначения,
появившихся в \mpost. Его предназначение "--- это рисовать простые
диаграммы.  Он проектировался как более изощрённая замена для пакета
Брайана Кернигана \texttt{pic} (\texttt{man pic}).

С другой стороны функциональности этого пакета достаточно для
реализации автоматической генерации достаточно сложных зависимостей.
Для примера разберём как была реализована диаграмма объясняющая
действие \mpost{}-конвейер во введении в цикл статей по \mpost.
\begin{figure}[htbp]
  \centering
  \includegraphics[width=0.5\textwidth]{dop.2.eps}
  \caption{\mpost{}-конвейер}\label{fig:dop:mpost}
\end{figure}


\begin{lstlisting}
% Файл dop.mp
% В отличии от boxes здесь ещё определено окружение rboxit
input rboxes;
% Определяем ещё один вид box'а
% Параметры можно передавать и так
%expr - изолированные выражения
%text - абсолютно всё, что передаётся
vardef drawshadowed(expr dx,dy)(text t) =
  fixsize(t);
  forsuffixes s=t:
    fill bpath.s shifted (dx,dy);
    unfill bpath.s;
    drawboxed(s);
% Можно было напечатать только текст 
%и не рисовать рамку
%   draw pic(s) withcolor red;
  endfor;
enddef;

% Пример boxes
beginfig(2) ;
  numeric u;u:=1mm;
  % Определяем box'ы
  % Определяем box с прямыми углами
  boxit.a(btex \meta-картинка etex);
  % Определяем box с закруглёнными углами
  rboxit.b(btex \texttt{metapost} etex);
  % Определяем жёсткую связь между a и b
  b.n = a.s - (0,5u);
  boxit.c(btex PostScript без шрифтов etex);
  c.n = b.s - (0,5u);
  rboxit.e(btex \texttt{latex}\(+\)\texttt{dvips} etex);
  e.n=c.s-(20u,10u);
  boxit.d(btex \LaTeX-<<обёртка>> etex);
  d.e=a.w-(5u,0);
  boxit.g(btex eps-файл etex);
  g.n=e.s-(0,5u);
  rboxit.h(btex \texttt{mptopdf} etex);
  h.n=c.s-(-20u,10u);
  boxit.i(btex  pdf-файл etex);
  i.n=h.s-(0,5u);
  % Разрешаем зависимости и рисуем boxes
  drawshadowed(1/3u,-1/3u,a,b,c,d,e,g,h,i);
  pickup pencircle scaled 0.3u;
  % Рисуем стрелки (сдвижка вида (0u,-1/3u) появилась, 
  %так как было определено новое окружение drawshadowed)
  drawarrow a.s -- b.n-(0u,-1/3u);
  drawarrow b.s -- c.n-(0u,-1/3u);
  drawarrow c.s{dir -90} .. {dir -90}e.n-(0u,-1/3u);
  drawarrow c.s{dir -90} .. {dir -90}h.n-(0u,-1/3u);
  drawarrow e.s -- g.n-(0u,-1/3u);
  drawarrow h.s -- i.n-(0u,-1/3u);
  drawarrow d.s{dir -90} .. {dir 0}e.w-(1/3u,0u);
endfig;
\end{lstlisting}
Обратите внимание на ещё один вид цикла \texttt{forsuffixes}. Эта запись
позволяет разбирать произвольное число передаваемых аргументов.

Алгоритм создания диаграммы следующий:
\begin{itemize}
\item С помощью команд \texttt{boxit}, \texttt{rboxit} или
  \texttt{circleit} объявляем box. Имя box'a добавляется к команде
  через точку как суффикс. В данном примере определено 8 box'ов от <<a>>
  до <<i>> включительно.
\item Составляем уравнения связей. Через точку к именам box'ов можно
  добавить один из восьми суффиксов \texttt{n} "--- север (верхняя
  точка), \texttt{s} "--- юг (нижняя точка), \texttt{w} "--- запад
  (крайняя точка рамки слева), \texttt{e} "--- восток (крайняя точка
  рамки справа) и \texttt{sw}, \texttt{bw}, \texttt{se}, \texttt{sw}
  "--- комбинации уже перечисленных суффиксов, которые соответствуют
  углам рамки. Уравнение связи \texttt{b.n = a.s - (0,5u);} можно
  описать следующим образом: северная (верхняя) точка box'a <<b>>
  находится ниже южной (нижней) точки box'а <<a>> на \texttt{5u}. При
  составления уравнения связей следует пользоваться только знаком
  равенства.  Это не присваивание, а именно уравнение, которое
  требуется разрешить.
\item С помощью команды \texttt{drawboxed} нарисовать
  <<закодированную>> диаграмму. При исполнении этой команды
  разрешается система уравнений. По умолчанию, если не указать
  специально, box располагается в точке \texttt{(0,0)}.
\item Нарисовать стрелки между элементами диаграммы. Можно
  пользоваться именами box'ов со стандартными суффиксами.
\end{itemize}

Прежде чем использовать этот пакет необходимо прочитать
соответствующий раздел в руководстве пользователя по \mpost{} Джона
Хобби \texttt{mpman.pdf}.


\section{Фейнмановские диаграммы}
\label{sec:feynman}

Простота \mpost{} позволяет использовать как базу для построений более
высокого порядка. Существует несколько подобных \LaTeX-пакетов. О
пакете \texttt{mfpic} уже упоминалось. В этом разделе описывается ещё
один старейший пакет созданный по этой технологии.

В 1995 году Торстен Охл (Torsten Ohl) представил пакет \texttt{feynmp}
для рисования фейнмановских диаграмм.  Фейнмановские диаграммы
используются для вычисления сумм большого числа вкладов от
элементарных процессов. В своё время эта технология довольно сильно
продвинула технику вычислений в физике высоких энергий. Её можно
использовать везде, где сложный процесс можно описать с помощью
элементарных приближений.

Пакет \texttt{feynmp}, это пакет \LaTeX{}, который для рисования
диаграмм использует \mpost. 

Интересующий меня с целью извлечения \(\Gamma_{J/\psi\to e^+e^-}\)
процесс имеет в Борновском приближении следующий вид:
\begin{figure}[htbp]
  \includegraphics[width=0.4\textwidth]{eepsiee.eps}\centering
   \caption{Простейшая фейнмановская диаграмма}
  \label{fig:feynman:jpsi}
\end{figure}

Это не сложная диаграмма и если не считать метки, то для её описания
требуется всего пять операторов:
\begin{lstlisting}[language=TeX]
% Файл eepsiee.tex
% Пакет для рисования фейнмановских диаграмм
\usepackage{feynmp}
|\ldots|
\begin{fmffile}{ee-psi-ee} % Имя mp-файл
  \begin{fmfgraph*}(110,62) % Размер диаграммы
    \fmfleft{ei,pi}  % Вершины-источники
    \fmfright{eo,po} % Исходящие вершины
    \fmflabel{$e^-$}{ei} % Метка источника e^-
    \fmflabel{$e^+$}{pi} % Метка источника e^+
    \fmflabel{$e^+$}{po} % Метка исходящей вершины
    \fmflabel{$e^-$}{eo} % Метка исходящей вершины
    % Линия соединяющая источники
    \fmf{fermion}{ei,Ji,pi} 
    % Линия соединяющие исходящее вершины
    \fmf{fermion}{po,Jo,eo} 
    % Метка для начальной вершины промежуточной частицы
    \fmflabel{$\Gamma_{\ee}$}{Ji} 
    % Метка для конечной вершины промежуточной частицы
    \fmflabel{$Br_{\ee}$}{Jo} 
    % Соединительная линия
    \fmf{heavy,label=$J/\psi$}{Ji,Jo} 
  \end{fmfgraph*}
\end{fmffile}
\end{lstlisting}

Окружение \texttt{\bs begin{fmffile}} в качестве параметра требует имя
mp-файла в который будут писать команды \meta{}. В данном примере имя
файла определено как \texttt{ee-psi-ee.mp}. Для того чтобы
получить диаграмму, описанную в файле \texttt{eepsiee.tex} были
проделаны следующие действия:
\begin{lstlisting}[language=bash,frame=]
> latex eepsiee.tex
> mpost ee-psi-ee.mp
> latex eepsiee.tex
\end{lstlisting}
После выполнения этих команд результат можно посмотреть с помощью
программы \texttt{xdvi} или преобразовать dvi-файл в PostScript или
pdf. 

Следующая простейшая диаграмма не имеет особого смысла. 
Она просто демонстрирует, возможности пакета: 
\begin{figure}[htbp]
  \includegraphics[width=0.7\textwidth]{eepsihadr.eps}\centering  
  \caption{Раскрашенная фейнмановская диаграмма}
  \label{fig:feynman:color}
\end{figure}
<<Сотрудничество>> c \mpost{} даёт возможность \texttt{feynmp}
получить доступ к цвету. Цвет можно определять точно так же, как он
определяется в \mpost. 
\begin{lstlisting}[language=TeX]
% Файл eepsihadr.tex
\begin{fmffile}{ee-psi-hadr}
  \begin{fmfgraph*}(110,62)
    \fmfleft{i1,i2}
    \fmfright{o1,o2}
    \fmflabel{$e^-$}{i1}
    \fmflabel{$e^+$}{i2}
    \fmflabel{$q^+$}{o1}
    \fmflabel{$q^-$}{o2}
    \fmf{fermion,foreground=green}{i1,v1}
    \fmf{fermion,foreground=red}{v1,i2}
    \fmf{fermion,foreground=green}{o1,v2,v3,v4,v5}
    \fmf{fermion,foreground=red}{v5,v6,v7,v8,o2}
    % Изменяем натяжение (расталкиваем вершины) 
    \fmf{heavy,label=$J/\psi$,tension=1/3,
                              foreground=red+green}{v1,v5}
    \fmffreeze
    \fmf{gluon,foreground=blue}{v2,v8} 
    \fmf{gluon,foreground=blue}{v3,v7} 
    \fmf{gluon,foreground=blue}{v4,v6} 
    \fmfv{label=$\Gamma_{\ee}$}{v1}
    \fmfv{label=$Br_{\hadr}$,label.dist=0.3w}{v5}
  \end{fmfgraph*}
\end{fmffile}
\end{lstlisting}
При создании диаграммы \mpost{} пытается оптимально расположить
вершины, минимизируя взвешенную сумму расстояний между ними:
\begin{equation*}
  L(v_1,\ldots,v_n)=\frac{1}{2}\sum_{i,j}t_{i,j}(v_i,v_j)^{2},
\end{equation*}
где параметр \(t_{i,j}\) "--- <<натяжении>> между вершинами \(v_i\) и
\(v_j\). По умолчанию натяжение равно 1. С помощью опции
\texttt{tension} натяжение можно изменить. Чем меньше натяжение, тем
сильнее расталкиваются вершины.

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

Довольно подробную документацию по пакету \texttt{feynmp} можно найти в файле
\texttt{\$(TEXMF)/texmf-dist/doc/latex/feynmf/manual.ps.gz}, где
\texttt{\$(TEXMF)} "--- корень дерева \LaTeX{} (заведомо верно для \TeXLive).



\section{Фракталы}
\label{sec:fractal}

\mpost, естественно, поддерживает рекурсию. Пользуясь этим, а так же
генераторами случайных \texttt{uniformdeviate} или
\texttt{normaldeviate} можно организовать фрактальную <<лесопосадку>>.


\begin{figure}[htbp]
  \includegraphics[width=\textwidth]{frac.1.eps}\centering  
  \caption{Фрактальный <<лес>>}
  \label{fig:fractalforest}
\end{figure}


\begin{lstlisting}
% Фрактальная лесопосадка
beginfig(1) ;
  u:=1mm; branchrotation := 50;
  offset := 180-branchrotation;
  thinning := 0.7;
  shortening := 0.8;
  def drawit(expr p, linethickness,col) =
    draw p withpen pencircle scaled linethickness withcolor col;
  enddef;
  % A - основание B - направление роста, n - число бранчей,
  %size - толщина дерева, col - цвет
  vardef tree(expr A,B,n,size,col) =
    save C,D,thickness; pair C,D;
    thickness := size;
    C := shortening[B, A rotatedaround(B,
      offset+uniformdeviate(branchrotation))];
    D := shortening[B, A rotatedaround(B,
      -offset-uniformdeviate(branchrotation))];
    if n>0:
      drawit(A--B, thickness, col);
      thickness := thinning*thickness;
      tree(B, C, n-1, thickness,col);
      tree(B, D, n-1, thickness,col);
    else:
      drawit(A--B,thickness,col);
      thickness := thinning*thickness;
      drawit(B--C, thickness,col);
      drawit(B--D, thickness,col);
    fi;
  enddef;

  numeric nbr,nx,ny,ell,size;
  color col;
  nx:=10;ny:=5;
  pair A;
  for ix:=1 upto nx:
    for iy:=1 upto ny:
      nbr:=4+uniformdeviate 5;
      ell:=nbr*u;
      x:=ix*(1+1/20*normaldeviate);
      y:=iy*(1+1/20*normaldeviate);
      A:=(20u*(x+y*sqrt(2)/2),20u*y*sqrt(2)/2);
      size:=ell/5;
      col:=(uniformdeviate 1,uniformdeviate 1,uniformdeviate 1);
      show ix,iy,A,ell,nbr,size,col;
      tree(A, A+(0,ell), nbr, size,col);
    endfor;
  endfor;
endfig;
\end{lstlisting}


Увлечение автоматически создаваемыми картинами влечёт за собой
опасность переполнения памяти. \mpost{} создавался в то время, когда
к используемой памяти относились исключительно бережно. 

Если при компиляции картинки будет выдана ошибка \texttt{MetaPost
  capicity exceded}, то необходимо поправить файл конфигурации
\texttt{texmf.cnf}. Обычно, этот файл можно найти а директории
\texttt{\$(TEXMF)/web2c/texnf.cnf}\footnote{В \TeXLive{} можно
  создавать локальные настройки}. 

За выделяемый объём памяти для \mpost{} отвечает переменная
\texttt{main\_memory.mpost}. Значение этой переменной должно быть
меньше значения \texttt{main\_memory}, которая ставит верхнюю границу
по использованию памяти для всех \TeX-подобных программ.  Обратите
внимание на то, что в конфигурационном файле может быть несколько
переменных с одним и тем же именем "--- используется последнее
значение.

В моём случае ограничение по памяти стояло в 15~Мб. Очевидно, что
используемую память можно безболезненно увеличить. С другой стороны,
если происходит переполнение, то это возможно значит, что в алгоритм
закралась ошибка.

После исправления значения переменных следует перегенерить форматные
файлы, например, с помощью команды \texttt{texconfig init}.




%heck-metapost2003.pdf стр 52


\section{Увеличительное стекло}
\label{sec:clip}

Бывает в процессе создания картинки необходимо увеличить участок для
лучшей детализации. \mpost{} предоставляет средство для этого в виде команды
\texttt{clip}, которая позволяет обрезать картинку по любому
замкнутому пути. Ниже идёт код, который позволил увеличить кусок
циферблата корабельных часов.


\begin{figure}[htbp]
  \centering
  \includegraphics[width=\textwidth]{dop.1.eps}
    \caption{Преобразование Галилея}
  \label{fig:galileo}
\end{figure}

\begin{lstlisting}
% Файл dop.mp
R:=3.6u;
path q;
% Определяем форму области которую хотим вырезать
q:=(-R,0)..(R,0)..cycle;
% Определяем центр вырезаемой области (orig)
%и местоположение увеличенного участка (copy)
pair orig,copy;
orig=(65u,24u);copy=(45u,7.5u);  
% Отмечаем вырезаемую область
draw q  shifted orig dashed evenly scaled 1/2u
         withpen pencircle scaled 0.2u witcholor red;
picture p;
% Сохраняем текущую картинку в переменной p
p:=currentpicture;
% Коэффициент увеличения
numeric scale;scale:=3;
% Обрезаем картинку p по замкнутому пути q
clip p to (q shifted orig);
% Чистим область, где будет нарисована увеличенная копия
fill q scaled scale shifted copy withcolor white;
% Рисуем копию
draw p shifted -orig scaled scale shifted copy;
% Рисуем дополнительную стрелку и метку
%на уже увеличенной копии
draw copy withpen pencircle scaled 1u withcolor red;
drawarrow copy--(copy+7u*dir -120)
        withpen pencircle scaled 0.4u withcolor red;
label.lrt(btex \(\vec{u}\) etex,
                     1/3[copy,(copy+7u*dir -120)]);
\end{lstlisting}

Пользуясь этим приёмом можно создать любой фон для какой-угодно фигуры, сделать
любую штриховку. 


\section{Штриховка}
\label{sec:hatch}
\texttt{clip}-технология, которая упоминалась выше, позволяет создать
любой вид штриховки. В стандартной поставке \mpost{} идут пакета,
которые этим пользуются.

\begin{figure}[htbp]
  \centering
  \includegraphics[width=0.3\textwidth]{dop.3.eps}  
  \caption{Пакет \texttt{hatching}.}
  \label{fig:hatching}
\end{figure}

Пакет \texttt{hatching.mp} представляет из себя обычный <<хак>>:
\begin{lstlisting}
% Файл dop.mp
% Пример использования пакета hatching
input hatching;
beginfig(3) ;
  numeric u;u=1mm;
  path q;
  q=(10u,0)..{dir -135}(0u,0u){dir 135}..
    (-10u,0)..{dir 90}(0u,0u){dir -90}..cycle;
  hatchfill q withcolor red withcolor (25,1u,-1);
  draw q;
endfig;
\end{lstlisting}
Функция \texttt{hatchfill} берёт информацию о штриховке из данных,
которые следуют с декларацией \texttt{withcolor}. Сигналом, что эти
данные предназначены именно для \texttt{hatchfill} является то, что
голубая компонента тройки чисел меньше 0. Красная компонента
соответствует углу наклона штриховки, зелёная расстоянию между
штрихами. Подробности можно узнать в краткой документации к пакету.


\begin{figure}[htbp]
  \centering
  \includegraphics[width=0.3\textwidth]{dop.4.eps}
  \caption{Пакет mpattern}
  \label{fig:mpattern}
\end{figure}

Более развитым (возможно излишне) является пакет \texttt{mpattern}:
\begin{lstlisting}
% Файл dop.mp
% Пример использования пакета mpattern
input mpattern;

% Создаём "обои" ракета
beginpattern(rocket);
 begingroup;save u;
   u:=1mm;
   draw Rocket scaled 2/3u rotated -30;
   patternbbox(-5u,-8u,5u,8u);
 endgroup;
endpattern;

% Создаём "обои" повёрнутая клетка
beginpattern(rotated_checker);
 fill unitsquare scaled 4mm rotated 45 withcolor .7white;
endpattern;

beginfig(4);
 numeric u; u:=1mm;
 path p;
 z1=(10u,0u);
 p=fullcircle scaled 50u;
 % Рисуем фигуру в клетку
 fill p  withpattern rotated_checker;
 unfill p shifted z1;
 % Рисуем фигуру "в ракету"
 fill p shifted z1 withpattern rocket;
endfig;
\end{lstlisting}
Здесь уже определены свои команды для создания штриховки. Пакет не
свободен от недостатков, но он достаточно прост и можно легко
<<довести>> код до необходимой кондиции. Простота "--- это общее
свойство пакетов \mpost. \meta{} \texttt{вынуждает} писать кратко.
Подробности можно найти в документации к пакету.

\section{Вставка eps}
\label{sec:inserteps}


Пакет \texttt{exteps.mp} позволяет включить eps-картинку как единый
объект. Краткая документация доступна в файле \texttt{exteps.pdf},
поставляемом с этим пакетом.

\begin{figure}[htbp]
  \centering
  \includegraphics[width=0.5\textwidth]{dop.6.eps}
  \caption{Добавляем чёрно-белых Туксов}
  \label{fig:tuxadd}
\end{figure}


\begin{lstlisting}
% Файл dop.mp
input exteps;
% Включение eps-картинки
beginfig(6) ;
  numeric u;u:=1mm;

% Базовая надпись
  for alpha:=-90 step 3 until 0:
    label(btex LinuxFormat в России etex
      scaled (5*(1+alpha/100)) rotated alpha,(0,0))
    withcolor
    (uniformdeviate 1,uniformdeviate 1,uniformdeviate 1);
  endfor;

% Посадим Тукса (penguin.eps) справа
  begineps "penguin.eps" ;
% Ширина картинки
  width:=30u;
% Сдвиг картинки от начала координат
  base:= (60u,5u);
% Можно нарисовать решётку на картинки 
%  grid := true;
% Обрезание по bounding box
%  clip := true;
  endeps;

% Посадим Тукса (penguin.eps) слева
  begineps "penguin.eps" ;
% Поворот
  angle:=90;
  width:=30u;
  base:= (-30u,-40u);
  endeps;
endfig ;
\end{lstlisting}



\section{Большие числа}
\label{sec:bignumbers}

Когда обсуждалась вставка меток в качестве примера был представлен
треугольник Паскаля. Из-за ограничений \meta{} на максимальный размер
числа треугольник Паскаля отрисовывался до 14ой строчки. 


\begin{figure}[htbp]
  \centering
  \includegraphics[width=\textwidth]{dop.5.eps}  
  \caption{Треугольник Паскаля.}
  \label{fig:dop:triangle}
\end{figure}

Это ограничение можно обойти воспользовавшись пакетом
\texttt{sarith.mp}. Этот пакет был создан специально под пакет
\texttt{graphics.mp}. Что вполне естественно, так как если для
рисовании небольших рисунков больших чисел быть не может, то при
анализе данных это вполне рядовая ситуация. 
\begin{lstlisting}
% Файл dop.mp
% Macros for arithmetic on strings that represent big numbers
input sarith;
% Треугольник Паскаля  с большими числами
beginfig(5) ;
  numeric u;
  u = 1.mm;
  numeric dy,dx,x,y,i,j,sy,ds,nlast;dy:=5u;
  dx:=6u;x=0;y=0;nlast:=20;
  % Для хранения больших чисел нужна строка
  string n[][];
  ds=0.04;sy=0.032;
  picture z;
  for i:=0 upto nlast:
    dy:=dy*(1-sy);
    y:=y-dy;
    for j:=0 upto i:
      if (j=0) or (j=i):
	n[i][j]:=Sabs 1; % Сложение
      else:
	n[i][j]:=n[i-1][j-1] Sadd n[i-1][j]; % Сложение
      fi
      % Формат вывода
      z:=thelabel(format("%6g", n[i][j]),(0,0));
      x:=dx*(j-i/2);
      label(z scaled (1-ds*i),(x,y));
    endfor
    z:=thelabel.lft(decimal(i)&":",(0,0));
    label(z scaled (1-ds*i),(dx*(-nlast/2-1),y));
  endfor
endfig ;
\end{lstlisting}

Для представления больших чисел используется встроенный тип
\texttt{string} "--- строка. 

\begin{table}[h]
  \centering
  \begin{tabular}[h]{ll}\hline
    Операция& действие\\\hline\hline
    Scvnum <number>        & конвертация в numric\\\hline
    Sabs <number>          & абсолютное значение\\\hline
    <number> Sadd <number> & сложение\\\hline
    <number> Ssub <number> & вычитание\\\hline
    <number> Smul <number> & умножение\\\hline
    <number> Sdiv <number> & деление\\\hline
    <number> Sleq <number> & сравнение \texttt{<=}\\\hline
    <number> Sneq <number> & сравнение \texttt{<>}\\\hline
  \end{tabular}
  \caption{Операции над большими числами}
  \label{tab:bignuber}
\end{table}

Документация к пакету \texttt{sarith.mp} является частью документации
к \texttt{graphics.mp} (\texttt{mpgraph.pdf} от Джона Хобби).


\section{Макрос TEX}
\label{sec:macro-TEX}

Вы наверное уже обратили внимание, что метки в \mpost{} являются
статическими. Всё, что между \texttt{btex} и \texttt{etex} отдаётся
\LaTeX{} для обработки. Это значит, что метку нельзя скомпоновать из
различных кусков. Решением является немного модифицированный макрос из
стандартного пакета \texttt{TEX.mp}:
\begin{lstlisting}
% Файл macros.mp
vardef TEX primary s =
  write "verbatimtex"            to "mptextmp.mp";
  write "\input{preheader-base}" to "mptextmp.mp";
  write "\begin{document}"       to "mptextmp.mp";
  write "etex"                   to "mptextmp.mp";
  write "btex "&s&" etex"        to "mptextmp.mp";
  write EOF                      to "mptextmp.mp";
  scantokens "input mptextmp"
enddef;  
\end{lstlisting}

В процессе вызова макроса \texttt{TEX}, всё что находится внутри него
записывается в \texttt{mptextmp.mp}, а затем этот файл включается в
основной файл прямо во время компиляции. То есть, происходит
модификация программы прямо во время компиляции. Пример использования
макроса идёт ниже:
\begin{lstlisting}
% Файл coord.mp
numeric u;u:=2mm;
for i:=-15 step 5 until 15:
  label.lft(TEX("\("&decimal(i)&"\)"),(-10u,i*u));
endfor;
\end{lstlisting}
При формировании ASCII строчки использовался оператор \&
для объединения. Хотя, в данном случае можно было
обойтись только статическими записями, но иногда этот приём может
пригодиться для целей автоматизации, где скорость компиляции не главное.


Основной минус этого способа в том, что он очень <<мееедленный>>. Для
ускорения следует оставить в  \texttt{preheader-base.tex} только самые
необходимые инструкции. Что-то вроде:
\begin{lstlisting}[language=TeX]
\documentclass[12pt]{article} 
\usepackage[warn]{mathtext}
\usepackage[T2A]{fontenc}
\usepackage[koi8-r]{inputenc}
\usepackage[english,russian]{babel}
\end{lstlisting} 

\chapter{Заключение}
\label{sec:afterwords}

Естественно, в таком кратком рассказе невозможно изложить \emph{всё}. 
Основные понятия и приёмы уже рассмотрены, но множество вещей выпало из
обзора. В частности, совсем  не рассмотрены 3D объекты, создание
геометрических чертежей, параметризация пути и векторные поля в 
\mpost. Это не смертельно, так как есть весьма качественная свободная 
литература, посвящённая этим предметам. 

\mpost{} достаточно легко использовать после
обучения, но обучение перед использованием просто необходимо. Это
свойство всех стоящих технологий, которые позволяют делать то, для
чего компьютеры и существуют: \emph{автоматизировать} рутинные
действия, для выполнения которых не требуется задумываться. 
Думать же, в любом случае, прерогатива человека.


%%% Local Variables: 
%%% mode: latex
%%% TeX-master: "mpillustration"
%%% End: 
