summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2009-05-19 18:36:39 +0000
committerKarl Berry <karl@freefriends.org>2009-05-19 18:36:39 +0000
commit8b36748d305846db9cd0fc23569497a178dd4683 (patch)
tree720c5218762952e12c3e69917d3093e719dc3cfd /Master/texmf-dist/doc
parenta105d37fbd235ef9e97bc383de505739fcde2712 (diff)
move mpman-ru out of texmf-doc
git-svn-id: svn://tug.org/texlive/trunk@13248 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/doc')
-rw-r--r--Master/texmf-dist/doc/metapost/mpman-ru/Makefile23
-rw-r--r--Master/texmf-dist/doc/metapost/mpman-ru/README38
-rw-r--r--Master/texmf-dist/doc/metapost/mpman-ru/README.ru.koi8-r22
-rw-r--r--Master/texmf-dist/doc/metapost/mpman-ru/bm-to-utf16be.awk29
-rw-r--r--Master/texmf-dist/doc/metapost/mpman-ru/ctabbing.sty18
-rw-r--r--Master/texmf-dist/doc/metapost/mpman-ru/extract-bm.awk23
-rw-r--r--Master/texmf-dist/doc/metapost/mpman-ru/idx1.awk16
-rw-r--r--Master/texmf-dist/doc/metapost/mpman-ru/idx2.awk125
-rw-r--r--Master/texmf-dist/doc/metapost/mpman-ru/idx3.awk16
-rw-r--r--Master/texmf-dist/doc/metapost/mpman-ru/manfig-ru.mp956
-rw-r--r--Master/texmf-dist/doc/metapost/mpman-ru/mpman-optab-ru.tex276
-rw-r--r--Master/texmf-dist/doc/metapost/mpman-ru/mpman-ru.pdfbin0 -> 730310 bytes
-rw-r--r--Master/texmf-dist/doc/metapost/mpman-ru/mpman-ru.tex11308
-rw-r--r--Master/texmf-dist/doc/metapost/mpman-ru/mpman.ist4
14 files changed, 12854 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/metapost/mpman-ru/Makefile b/Master/texmf-dist/doc/metapost/mpman-ru/Makefile
new file mode 100644
index 00000000000..1df6e24cfc5
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mpman-ru/Makefile
@@ -0,0 +1,23 @@
+# Makefile for MetaPost documentation. Public domain.
+
+pdflatex = pdflatex
+mpost = TEX=tex mpost
+
+all: mpman-ru.pdf
+
+mpman-ru.pdf: mpman-ru.tex mpman-ru.bbl manfig-ru.mp
+ $(mpost) manfig-ru
+ $(pdflatex) mpman-ru
+ $(pdflatex) mpman-ru
+ $(pdflatex) mpman-ru
+ makeindex -s mpman.ist mpman-ru
+ cp mpman-ru.ind mpman-ru.ind.src
+ awk -f idx1.awk mpman-ru.ind.src | awk -f idx2.awk | sort | awk -f idx3.awk >mpman-ru.ind
+ awk -f extract-bm.awk mpman-ru.tex >mpman-ru.out.raw
+ iconv -f koi8-r -t utf-8 mpman-ru.out.raw > mpman-ru.out.utf8
+ awk -f bm-to-utf16be.awk mpman-ru.out.utf8 > mpman-ru.out
+ $(pdflatex) mpman-ru
+
+clean distclean:
+ rm -f *.aux *.blg *.dvi *.log *.mpx *.mps *.[0-9] *.[0-9][0-9] *.[0-9][0-9][0-9]
+ rm -f *.idx *.ilg *.ind *.toc *.utf8 *.raw *.src *.out
diff --git a/Master/texmf-dist/doc/metapost/mpman-ru/README b/Master/texmf-dist/doc/metapost/mpman-ru/README
new file mode 100644
index 00000000000..81bb4ca689a
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mpman-ru/README
@@ -0,0 +1,38 @@
+This is the translation of MetaPost version 1.004 user's manual to
+Russian language.
+
+It may be distributed and/or modified under the the same conditions
+as the original MetaPost manual. These conditions are specified at
+the end of `mpman-ru.tex' file.
+
+You have to use MetaPost version 1.000 or newer to compile pictures.
+
+If you want to use LH (CM-Super) fonts (this increases size of pdf
+upto 30%) then you should set `fontenc' option to `T2A' instead of
+'LCYW'. The default fonts are virtual Type 1 CM Cyrillic fonts from
+the standard `tetex' (and others) distributions.
+
+You may take LCYW package at CTAN or http://litwr.narod.ru/tex.html
+
+Absence of the `cmap-cyr-vf' package produces lack of Unicode mapping
+for Russian labels in the MetaPost pictures.
+
+Index and bookmarks are produced by scripts for `awk' program. Index
+is sorted by `sort' program which is depend on the locale settings.
+
+The directory contains:
+ bm-to-utf16be.awk
+ ctabbing.sty
+ extract-bm.awk
+ idx1.awk
+ idx2.awk
+ idx3.awk
+ Makefile
+ manfig-ru.mp
+ mpman.ist
+ mpman-optab-ru.tex
+ mpman-ru.bbl
+ mpman-ru.pdf
+ mpman-ru.tex
+ README
+ README.ru.koi8-r
diff --git a/Master/texmf-dist/doc/metapost/mpman-ru/README.ru.koi8-r b/Master/texmf-dist/doc/metapost/mpman-ru/README.ru.koi8-r
new file mode 100644
index 00000000000..cad94c9ff8d
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mpman-ru/README.ru.koi8-r
@@ -0,0 +1,22 @@
+Это перевод руководства пользователя для MetaPost версии 1.004.
+
+Его можно распространять/изменять на тех же самых условиях, что и
+исходное руководство на английском. Эти условия приведены в конце
+файла `mpman-ru.tex'.
+
+Вы должны использовать MetaPost версии 1.000 или новее для компиляции
+рисунков.
+
+Если вы хотите использовать шрифты LH (CM-Super), что увеличит
+размер pdf, то вы должны установить опцию для `fontenc' в `T2A'
+вместо `LCYW'. По-умолчанию используются виртуальные шрифты
+Type 1 из стандартного дистрибутива `tetex' (или других).
+
+Пакет LCYW можно взять на CTAN или http://litwr.narod.ru/tex.html
+
+Отсутствие пакета `cmap-cyr-vf' сделает невозможной связь меток
+MetaPost на русском с Unicode в pdf.
+
+Индекс и закладки производятся сценариями для программы `awk'.
+Индекс сортируется программой `sort', которая зависит от
+локальных установок.
diff --git a/Master/texmf-dist/doc/metapost/mpman-ru/bm-to-utf16be.awk b/Master/texmf-dist/doc/metapost/mpman-ru/bm-to-utf16be.awk
new file mode 100644
index 00000000000..1b6fc262666
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mpman-ru/bm-to-utf16be.awk
@@ -0,0 +1,29 @@
+function to_utf16be(s) {
+ s1="\\376\\377"
+ for (i = 1; i <= length(s); i++) {
+ k = x[substr(s, i, 1)]
+ if (k == 208)
+ s1=s1 sprintf("\\004\\%03o", x[substr(s, ++i, 1)] + 128)
+ else if (k == 209)
+ s1=s1 sprintf("\\004\\%03o", x[substr(s, ++i, 1)] - 64)
+ else
+ s1=s1 sprintf("\\000\\%03o", k)
+ }
+ return s1
+}
+
+BEGIN {
+ for (i = 0; i < 256; i++) {
+ x[sprintf("%c", i)] = i
+ }
+}
+
+{
+ p=index($0,"}{")
+ s1=substr($0,1,p+1)
+ s=substr($0,p+2)
+ p=index(s,"}")
+ s2=substr(s,p)
+ s=substr(s,1,p-1)
+ print s1 to_utf16be(s) s2
+}
diff --git a/Master/texmf-dist/doc/metapost/mpman-ru/ctabbing.sty b/Master/texmf-dist/doc/metapost/mpman-ru/ctabbing.sty
new file mode 100644
index 00000000000..b61ec6ed784
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mpman-ru/ctabbing.sty
@@ -0,0 +1,18 @@
+% Public domain.
+%
+% The ctabbing environment is a centered tabbing environment suitable for
+% displaying program fragments. The vertical spacing is exactly like that
+% for normal text in a center environment. This is achieved by setting
+% \@minipagetrue to fool \tabbing into thinking that it starts a minipage
+% and should therefore avoid all vertical space at the top. (Note that any
+% space at all would defeat the \vtop command in \ctabbing.) The
+% \vskip-\lastskip and \prevdepth saving commands avoid extra space after
+% \endtabbing
+
+\newdimen\ct@pd
+
+\def\ctabbing{\center\leavevmode\vtop\bgroup\@minipagetrue\begingroup\tabbing}
+
+\def\endctabbing{\endtabbing\endgroup\vskip-\lastskip
+ \global\ct@pd\prevdepth \egroup
+ \endcenter \global\prevdepth\ct@pd}
diff --git a/Master/texmf-dist/doc/metapost/mpman-ru/extract-bm.awk b/Master/texmf-dist/doc/metapost/mpman-ru/extract-bm.awk
new file mode 100644
index 00000000000..6518c72b9cc
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mpman-ru/extract-bm.awk
@@ -0,0 +1,23 @@
+{
+ p=index($0,"{")
+}
+
+/^[^%]section\{/ {
+ noss=0
+ nos++
+ sub("\\\\MF","Metafont",$0)
+ s=substr($0,p+1,index($0,"}")-p-1)
+ printf "\\BOOKMARK [1][-]{section."
+ if (nos < 16)
+ print nos "}{" s "}{}"
+ else
+ printf "%c%s\n", nos+49, "}{" s "}{}"
+}
+
+/^[^%]subsection\{/ {
+ noss++
+ gsub("\\\\texttt\{|\\\\-|\{\}","",$0)
+ gsub("\\\\","",$0)
+ s=substr($0,p,index($0,"}")-p)
+ print "\\BOOKMARK [2][-]{subsection." nos "." noss "}{" s "}{section." nos "}"
+} \ No newline at end of file
diff --git a/Master/texmf-dist/doc/metapost/mpman-ru/idx1.awk b/Master/texmf-dist/doc/metapost/mpman-ru/idx1.awk
new file mode 100644
index 00000000000..2cea7ac68f5
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mpman-ru/idx1.awk
@@ -0,0 +1,16 @@
+{
+ p=1
+}
+/\\indexspace|\\begin\{theindex|\\end\{theindex/ {
+ p=0
+}
+/\\item|\\subitem/ {
+ p=0
+ printf "\n%s", $0
+}
+{
+ if (p) printf "%s", $0
+}
+END {
+ printf "\n"
+}
diff --git a/Master/texmf-dist/doc/metapost/mpman-ru/idx2.awk b/Master/texmf-dist/doc/metapost/mpman-ru/idx2.awk
new file mode 100644
index 00000000000..5777470e97e
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mpman-ru/idx2.awk
@@ -0,0 +1,125 @@
+BEGIN {
+koi8r["\\\\CYRA"]=161
+koi8r["\\\\CYRB"]=162
+koi8r["\\\\CYRV"]=163
+koi8r["\\\\CYRG"]=164
+koi8r["\\\\CYRD"]=165
+koi8r["\\\\CYRE"]=166
+koi8r["\\\\CYRYO"]=167
+koi8r["\\\\CYRZH"]=168
+koi8r["\\\\CYRZ"]=169
+koi8r["\\\\CYRI"]=170
+koi8r["\\\\CYRISHRT"]=171
+koi8r["\\\\CYRK"]=172
+koi8r["\\\\CYRL"]=173
+koi8r["\\\\CYRM"]=174
+koi8r["\\\\CYRN"]=175
+koi8r["\\\\CYRO"]=176
+koi8r["\\\\CYRP"]=177
+koi8r["\\\\CYRR"]=178
+koi8r["\\\\CYRS"]=179
+koi8r["\\\\CYRT"]=180
+koi8r["\\\\CYRU"]=181
+koi8r["\\\\CYRF"]=182
+koi8r["\\\\CYRH"]=183
+koi8r["\\\\CYRC"]=184
+koi8r["\\\\CYRCH"]=185
+koi8r["\\\\CYRSH"]=186
+koi8r["\\\\CYRSHCH"]=187
+koi8r["\\\\CYRHRDSN"]=188
+koi8r["\\\\CYRERY"]=189
+koi8r["\\\\CYRSFTSN"]=190
+koi8r["\\\\CYREREV"]=191
+koi8r["\\\\CYRYU"]=192
+koi8r["\\\\CYRYA"]=193
+koi8r["\\\\cyra"]=161
+koi8r["\\\\cyrb"]=162
+koi8r["\\\\cyrv"]=163
+koi8r["\\\\cyrg"]=164
+koi8r["\\\\cyrd"]=165
+koi8r["\\\\cyre"]=166
+koi8r["\\\\cyryo"]=167
+koi8r["\\\\cyrzh"]=168
+koi8r["\\\\cyrz"]=169
+koi8r["\\\\cyri"]=170
+koi8r["\\\\cyrishrt"]=171
+koi8r["\\\\cyrk"]=172
+koi8r["\\\\cyrl"]=173
+koi8r["\\\\cyrm"]=174
+koi8r["\\\\cyrn"]=175
+koi8r["\\\\cyro"]=176
+koi8r["\\\\cyrp"]=177
+koi8r["\\\\cyrr"]=178
+koi8r["\\\\cyrs"]=179
+koi8r["\\\\cyrt"]=180
+koi8r["\\\\cyru"]=181
+koi8r["\\\\cyrf"]=182
+koi8r["\\\\cyrh"]=183
+koi8r["\\\\cyrc"]=184
+koi8r["\\\\cyrch"]=185
+koi8r["\\\\cyrsh"]=186
+koi8r["\\\\cyrshch"]=187
+koi8r["\\\\cyrhrdsn"]=188
+koi8r["\\\\cyrery"]=189
+koi8r["\\\\cyrsftsn"]=190
+koi8r["\\\\cyrerev"]=191
+koi8r["\\\\cyryu"]=192
+koi8r["\\\\cyrya"]=193
+pascii["\\\\#"]=35
+pascii["\\."]=46
+pascii["\\+"]=43
+pascii["\\-"]=45
+pascii["\\*"]=42
+pascii["\\\\&"]=38
+pascii["\\["]=64
+pascii["\\]"]=64
+pascii[" "]=32
+pascii["@"]=63
+for (i = 58; i < 63; i++) {
+ pascii[sprintf("%c", i)] = i
+ }
+for (i = 65; i < 91; i++) {
+ pascii[sprintf("%c", i)] = i
+ }
+for (i = 97; i < 123; i++) {
+ pascii[sprintf("%c", i)] = i-32
+ }
+}
+{
+ t=$0
+ gsub("{|}|^ *","",t)
+ s=""
+ p=match(t,"\\\\[A-Za-z]+")
+ while (p>0) {
+ p=p+RLENGTH
+ s=s substr(t,1,p-1)
+ while (substr(t,p,1)==" ")
+ p++
+ t=substr(t,p)
+ p=match(t,"\\\\[A-Za-z]+")
+ }
+ s=s t
+ p=index(s,",")
+ if (p) s=substr(s,1,p-1)
+ xc = length(s)/3
+ gsub("\\\\texttt|\\\\IeC|\\\\tt|\\\\tdescr|\\\\string|\\\\ttt","",s)
+ if (index(s,"\\item")==1)
+ mode=1
+ if (index(s,"\\subitem")==1)
+ mode=2
+ gsub("\\\\item|\\\\subitem","",s)
+ while (match(s,"^[^A-Za-zА-Яа-я0-9\\\\].*[A-Za-zА-Яа-я0-9]"))
+ s=substr(s,2)
+ for (i in koi8r)
+ gsub(i,sprintf("%03d",koi8r[i]),s)
+ for (i in pascii)
+ gsub(i,sprintf("%03d",pascii[i]),s)
+ gsub("\\\\","",s)
+ if (mode==1)
+ s = idx = s sprintf("%03d",xc)
+ else if (mode==2)
+ s = idx "000" s
+ while (length(s) < 90)
+ s = s "000"
+ print s " @@@ " $0
+}
diff --git a/Master/texmf-dist/doc/metapost/mpman-ru/idx3.awk b/Master/texmf-dist/doc/metapost/mpman-ru/idx3.awk
new file mode 100644
index 00000000000..5a911c2087f
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mpman-ru/idx3.awk
@@ -0,0 +1,16 @@
+BEGIN {
+ print "\\begin{theindex}"
+ l=65
+}
+{
+ if (0+substr($0,1,3)>=l && pl!=l && index($0,"\\subitem")==0) {
+ print "\\indexspace"
+ l=0+substr($0,1,3)
+ pl=l++
+ if (l==91) l=161
+ }
+ print substr($0,index($0,"@@@")+4)
+}
+END {
+ print "\\end{theindex}"
+}
diff --git a/Master/texmf-dist/doc/metapost/mpman-ru/manfig-ru.mp b/Master/texmf-dist/doc/metapost/mpman-ru/manfig-ru.mp
new file mode 100644
index 00000000000..bdbe2e99d95
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mpman-ru/manfig-ru.mp
@@ -0,0 +1,956 @@
+% $Id: manfig.mp,v 1.4 2005/03/27 17:29:22 karl Exp $
+% Figures for MetaPost manual, by John Hobby. Public domain.
+
+filenametemplate "%j-%c.mps";
+
+%%% This redefinition of dotlabel draws dots as a closed path
+%%% which are rendered more smoothly in Adobe Reader.
+vardef dotlabel@#(expr s,z) text t_ =
+ label@#(s,z) t_;
+ addto currentpicture
+ contour (makepath pencircle scaled dotlabeldiam) shifted z t_;
+enddef;
+
+%%% TeX macro \place is only used in figure 0.
+verbatimtex
+\input texnames.sty
+\font\tenrm=kcmr10
+\def\place#1{\vphantom{FiMP}\smash{\tenrm #1}}
+etex
+
+%%% The boxes package is only used in figure 0.
+input boxes
+
+beginfig(0);
+ba.dy = bb.dy = d.dy = 12bp;
+d.dx = 100bp;
+boxit.aa(btex \place{Рисунки на MetaPost} etex);
+boxit.ab(btex \place{Документ \TeX} etex);
+boxit.ba(btex \hbox to 75bp {\hfil\place{MetaPost}\hfil} etex);
+boxit.bb.(btex \hbox to 75bp {\hfil\place{\TeX\ или \LaTeX}\hfil} etex);
+boxit.ca(btex \place{Рисунки на PostScript} etex);
+boxit.cb(btex \place{{\tt dvi}-файл} etex);
+boxit.d(btex \place{\tt dvips} etex);
+boxit.e(btex PostScript etex);
+boxit.f(btex \vbox{
+ \hbox to 80bp {\hfil\hbox{\tenrm Охватывающая}\hfil}
+ \hbox to 80bp {\hfil\hbox{\tenrm рамка}\hfil}
+ } etex scaled .74);
+ba.n - aa.s = ca.n - ba.s
+= bb.n - ab.s = cb.n - bb.s
+= e.n - d.s = down * 25bp;
+ypart cb.s - ypart d.n = 25bp;
+e.s = origin;
+ypart ca.s = ypart cb.s;
+xpart aa.n = xpart 0.1[d.nw,d.ne];
+xpart ab.n = xpart 0.9[d.nw,d.ne];
+drawunboxed(aa,ab,ca,cb,e);
+drawboxed(ba,bb,d);
+drawarrow aa.s -- top ba.n; drawarrow ab.s -- top bb.n;
+drawarrow ba.s -- top ca.n; drawarrow bb.s -- top cb.n;
+drawarrow ca.s -- top 0.1[d.nw,d.ne];
+drawarrow cb.s -- top 0.9[d.nw,d.ne];
+drawarrow d.s -- top e.n;
+path p;
+p = ca.e{right} .. {right}bb.w;
+f.c = point .5 of p;
+drawunboxed(f);
+draw p cutafter bpath f dashed evenly;
+drawarrow p cutbefore subpath (1,3) of bpath f dashed evenly;
+endfig;
+
+
+beginfig(1);
+draw (20,20)--(0,0)--(0,30)--(30,0)--(0,0);
+endfig;
+
+
+beginfig(2); numeric u;
+u=1cm;
+draw (2u,2u)--(0,0)--(0,3u)--(3u,0)--(0,0);
+pickup pencircle scaled 4pt;
+for i=0 upto 2:
+ for j=0 upto 2:
+ drawdot (i*u,j*u);
+ endfor
+endfor
+endfig;
+
+
+beginfig(3);
+z0 = (0,0); z1 = (60,40);
+z2 = (40,90); z3 = (10,70);
+z4 = (30,50);
+draw z0..z1..z2..z3..z4;
+dotlabels.top(0,2,4);
+dotlabels.lft(3);
+dotlabels.lrt(1);
+endfig;
+
+
+beginfig(104);
+z0 = (0,0); z1 = (60,40);
+z2 = (40,90); z3 = (10,70);
+z4 = (30,50);
+draw z0..z1..z2..z3..z4..cycle;
+dotlabels.top(2,4);
+dotlabels.lft(0,3);
+dotlabels.lrt(1);
+endfig;
+
+
+beginfig(204);
+z0 = (0,0); z1 = (60,40);
+z2 = (40,90); z3 = (10,70);
+z4 = (30,50);
+draw z0..z1..z2..z3--z4--cycle;
+dotlabels.top(2,4);
+dotlabels.lft(0,3);
+dotlabels.lrt(1);
+endfig;
+
+
+beginfig(5);
+z0 = (0,0); z1 = (60,40);
+z2 = (40,90); z3 = (10,70);
+z4 = (30,50);
+path p; p = z0..z1..z2..z3..z4;
+draw p;
+for t=0 upto 3:
+ draw point t of p--postcontrol t of p
+ --precontrol t+1 of p--point t+1 of p
+ dashed (evenly scaled .5);
+endfor
+dotlabels.top(0,2,4);
+dotlabels.lft(3);
+dotlabels.lrt(1);
+endfig;
+
+
+beginfig(6);
+z0 = (0,0); z1 = (60,40);
+z2 = (40,90); z3 = (10,70);
+z4 = (30,50);
+draw z0..z1{up}..z2{left}..z3..z4;
+dotlabels.top(0,2,4);
+dotlabels.lft(3);
+dotlabels.lrt(1);
+endfig;
+
+
+beginfig(7)
+for a=0 upto 9:
+ draw (0,0){dir 45}..{dir -10a}(6cm,0);
+endfor
+endfig;
+
+beginfig(8)
+for a=0 upto 7:
+ draw (0,0){dir 45}..{dir 10a}(6cm,0);
+endfor
+endfig;
+
+
+beginfig(109);
+z2=-z0=(1in,0); z1=(0,.2in);
+draw z0{up}..z1{right}..z2{down};
+dotlabels.bot(0,1,2);
+endfig;
+
+
+beginfig(209);
+z2=-z0=(1in,0); z1=(0,.2in);
+draw z0{up}...z1{right}...z2{down};
+dotlabels.bot(0,1,2);
+endfig;
+
+
+beginfig(110);
+numeric u; 10u=1.5in;
+-z0=z3=(5u,0);
+(-x1,y1)=z2=(3u,2u);
+draw z0..z1..z2..z3;
+dotlabels.bot(0,1,2,3);
+endfig;
+
+
+beginfig(210);
+numeric u; 10u=1.5in;
+-z0=z3=(5u,0);
+(-x1,y1)=z2=(3u,2u);
+draw z0..z1..tension 1.3..z2..z3;
+dotlabels.bot(0,1,2,3);
+endfig;
+
+
+beginfig(310);
+numeric u; 10u=1.5in;
+-z0=z3=(5u,0);
+(-x1,y1)=z2=(3u,2u);
+draw z0..z1..tension 1.5 and 1..z2..z3;
+dotlabels.bot(0,1,2,3);
+endfig;
+
+
+beginfig(111);
+numeric u, c; 10u=1.4in; c=0;
+z1=(0,0); (x0,-y0)=z2=(2u,5u);
+draw z0{curl c}..z1..{curl c}z2;
+dotlabels.rt(0,1,2);
+endfig;
+
+
+beginfig(211);
+numeric u, c; 10u=1.4in; c=1;
+z1=(0,0); (x0,-y0)=z2=(2u,5u);
+draw z0{curl c}..z1..{curl c}z2;
+dotlabels.rt(0,1,2);
+endfig;
+
+
+beginfig(311);
+numeric u, c; 10u=1.4in; c=2;
+z1=(0,0); (x0,-y0)=z2=(2u,5u);
+draw z0{curl c}..z1..{curl c}z2;
+dotlabels.rt(0,1,2);
+endfig;
+
+
+beginfig(411);
+numeric u, c; 10u=1.4in; c=infinity;
+z1=(0,0); (x0,-y0)=z2=(2u,5u);
+draw z0{curl c}..z1..{curl c}z2;
+dotlabels.rt(0,1,2);
+endfig;
+
+
+beginfig(13);
+z1=-z2=(.2in,0);
+x3=-x6=.3in;
+x3+y3=x6+y6=1.1in;
+z4=1/3[z3,z6];
+z5=2/3[z3,z6];
+z20=whatever[z1,z3]=whatever[z2,z4];
+z30=whatever[z1,z4]=whatever[z2,z5];
+z40=whatever[z1,z5]=whatever[z2,z6];
+draw z1--z20--z2--z30--z1--z40--z2;
+pickup pencircle scaled 1pt;
+draw z1--z2;
+draw z3--z6;
+%
+dotlabels.bot(1,2);
+dotlabels.rt(3);
+dotlabels.lft(6);
+dotlabels.top(20,30,40);
+endfig;
+
+
+vardef llet(expr c) =
+ c infont defaultfont scaled magstep3
+enddef;
+
+primarydef p centered h =
+ (p shifted (h - xpart .5[llcorner p,lrcorner p], 0))
+enddef;
+
+beginfig(14);
+string s; s = "abcde";
+numeric u,n, ytop, ybot;
+n = 5;
+ytop = 3bp + ypart urcorner llet(s);
+ybot = -3bp + ypart llcorner llet(s);
+ytop - ybot = u;
+draw (n*u,ybot)--(0,ybot)--(0,ytop)--(n*u,ytop);
+for i=1 upto n:
+ draw (i*u,ybot)..(i*u,ytop);
+ draw llet(substring (i-1,i) of s) centered ((i-.5)*u);
+ label.bot(decimal i, (i*u,ybot));
+endfor
+picture llab; llab = btex \llap{$x={}$}0 etex;
+z0 = urcorner llab;
+draw llab shifted (-.5*x0, ybot-labeloffset-y0);
+endfig;
+
+
+beginfig(17);
+a=.7in; b=.5in;
+z0=(0,0);
+z1=-z3=(a,0);
+z2=-z4=(0,b);
+draw z1..z2..z3..z4..cycle;
+draw z1--z0--z2;
+label.top("a", .5[z0,z1]);
+label.lft("b", .5[z0,z2]);
+dotlabel.bot("(0,0)", z0);
+endfig;
+
+
+beginfig(18);
+numeric u;
+u = 1cm;
+draw (0,2u)--(0,0)--(4u,0);
+pickup pencircle scaled 1pt;
+draw (0,0){up}
+ for i=1 upto 8: ..(i/2,sqrt(i/2))*u endfor;
+label.lrt(btex $\sqrt x$ etex, (3,sqrt 3)*u);
+label.bot(btex $x$ etex, (2u,0));
+label.lft(btex $y$ etex, (0,u));
+endfig;
+
+
+beginfig(19);
+numeric ux, uy;
+120ux=1.2in; 4uy=2.4in;
+draw (0,4uy)--(0,0)--(120ux,0);
+pickup pencircle scaled 1pt;
+draw (0,uy){right}
+ for ix=1 upto 8:
+ ..(15ix*ux, uy*2/(1+cosd 15ix))
+ endfor;
+label.bot(btex $x$ axis etex, (60ux,0));
+label.lft(btex $y$ axis etex rotated 90,
+ (0,2uy));
+label.lft(
+ btex $\displaystyle y={2\over1+\cos x}$ etex,
+ (120ux, 4uy));
+endfig;
+
+
+beginfig(20);
+picture p;
+p = "testing" infont "ptmr8r" scaled 7;
+draw p;
+draw llcorner p--lrcorner p--urcorner p--ulcorner p--cycle;
+dotlabel.lft(btex \tt llcorner etex, llcorner p);
+dotlabel.rt(btex \tt lrcorner etex, lrcorner p);
+dotlabel.lft(btex \tt ulcorner etex, ulcorner p);
+dotlabel.rt(btex \tt urcorner etex, urcorner p);
+endfig;
+
+
+beginfig(21);
+path p;
+p = (-1cm,0)..(0,-1cm)..(1cm,0);
+fill p{up}..(0,0){-1,-2}..{up}cycle;
+draw p..(0,1cm)..cycle;
+endfig;
+
+
+beginfig(22);
+path a, b, aa, ab;
+a = fullcircle scaled 2cm;
+b = a shifted (0,1cm);
+aa = halfcircle scaled 2cm;
+ab = buildcycle(aa, b);
+picture pa, pb;
+pa = thelabel(btex $A$ etex, (0,-.5cm));
+pb = thelabel(btex $B$ etex, (0,1.5cm));
+fill a withcolor .7white;
+fill b withcolor .7white;
+fill ab withcolor .4white;
+unfill bbox pa;
+draw pa;
+unfill bbox pb;
+draw pb;
+label.lft(btex $U$ etex, (-1cm,.5cm));
+draw bbox currentpicture;
+endfig;
+
+
+beginfig(123);
+path aa, b;
+b = a shifted (0,1cm);
+aa = halfcircle scaled 2cm;
+draw aa;
+draw b dashed evenly;
+z1 = aa intersectionpoint reverse b;
+z2 = reverse aa intersectionpoint b;
+dotlabel.rt(btex 1 etex, z1);
+dotlabel.lft(btex 2 etex, z2);
+label.bot(btex \tt aa etex, point 0 of aa);
+label.bot(btex \tt b etex, point 2 of b);
+endfig;
+
+beginfig(223);
+path aa, b;
+b = a shifted (0,1cm);
+aa = halfcircle scaled 2cm;
+numeric t[], tt[];
+(t1,8-tt1) = aa intersectiontimes reverse b;
+(4-t2,tt2) = reverse aa intersectiontimes b;
+pickup(pencircle scaled .3);
+draw aa;
+draw b;
+pickup(pencircle scaled .8);
+draw subpath (t1,t2) of aa;
+draw subpath (tt2,tt1) of b;
+dotlabel.rt(btex 1 etex, point t1 of aa);
+dotlabel.lft(btex 2 etex, point t2 of aa);
+label.bot(btex \tt aa etex, point 0 of aa);
+label.bot(btex \tt b etex, point 2 of b);
+endfig;
+
+
+beginfig(24);
+h=2in; w=2.7in;
+path p[], q[], pp;
+for i=2 upto 4: ii:=i**2;
+ p[i] = (w/ii,h){1,-ii}...(w/i,h/i)...(w,h/ii){ii,-1};
+endfor
+q0.5 = (0,0)--(w,0.5h);
+q1.5 = (0,0)--(w/1.5,h);
+pp = buildcycle(q0.5, p2, q1.5, p4);
+fill pp withcolor .7white;
+z0=center pp;
+picture lab; lab=thelabel(btex $f>0$ etex, z0);
+unfill bbox lab; draw lab;
+draw q0.5; draw p2; draw q1.5; draw p4;
+dotlabel.top(btex $P$ etex, p2 intersectionpoint q0.5);
+dotlabel.rt(btex $Q$ etex, p2 intersectionpoint q1.5);
+dotlabel.lft(btex $R$ etex, p4 intersectionpoint q1.5);
+dotlabel.bot(btex $S$ etex, p4 intersectionpoint q0.5);
+endfig;
+
+
+beginfig(25);
+numeric u;
+u = .2in;
+path a, b;
+a = (0,0){up}..(4u,0)..(8u,0)..(8u,4u);
+b = (10u,3u)..(5u,u)..(-u,u);
+numeric t; t=0;
+forsuffixes $=bot, llft, lrt, lft:
+ dotlabel$(decimal t, point t of a);
+ t:=t+1;
+endfor
+for i=0 upto 2:
+ dotlabel.top(decimal i, point i of b);
+endfor
+pickup(pencircle scaled .3);
+draw a;
+pickup(pencircle scaled .8);
+draw b;
+% intersections (atime, btime):
+% (0.2501,1.77225)
+% (2.58316,0.23619)
+% (0.75288,1.40094)
+endfig;
+
+
+beginfig(26);
+numeric scf, #, t[];
+3.2scf = 2.4in;
+path fun;
+# = .1; % Keep the function single-valued
+fun = ((0,-1#)..(1,.5#){right}..(1.9,.2#){right}..{curl .1}(3.2,2#))
+ yscaled(1/#) scaled scf;
+x1 = 2.5scf;
+for i=1 upto 2:
+ (t[i],whatever) =
+ fun intersectiontimes ((x[i],-infinity)--(x[i],infinity));
+ z[i] = point t[i] of fun;
+ z[i]-(x[i+1],0) = whatever*direction t[i] of fun;
+ draw (x[i],0)--z[i]--(x[i+1],0);
+ fill fullcircle scaled 3bp shifted z[i];
+endfor
+label.bot(btex $x_1$ etex, (x1,0));
+label.bot(btex $x_2$ etex, (x2,0));
+label.bot(btex $x_3$ etex, (x3,0));
+draw (0,0)--(3.2scf,0);
+pickup pencircle scaled 1pt;
+draw fun;
+endfig;
+
+
+beginfig(28);
+path p[];
+p1 = fullcircle scaled .6in;
+z1=(.75in,0)=-z3;
+z2=directionpoint left of p1=-z4;
+p2 = z1..z2..{curl1}z3..z4..{curl 1}cycle;
+fill p2 withcolor .4[white,black];
+unfill p1;
+draw p1;
+transform T;
+z1 transformed T = z2;
+z3 transformed T = z4;
+xxpart T=yypart T; yxpart T=-xypart T;
+picture pic;
+pic = currentpicture;
+for i=1 upto 2:
+ pic:=pic transformed T;
+ draw pic;
+endfor
+dotlabels.top(1,2,3); dotlabels.bot(4);
+endfig;
+
+
+beginfig(29);
+if unknown withdots: % So this works w/o MetaPost version 0.5
+ picture withdots; withdots=dashpattern(off 2.5 on 0 off 2.5);
+fi
+z0 = (0,0);
+z1 = (2in-2bp,0);
+for i=1 upto 4:
+ z[2i]-z[2i-2] = z[2i+1]-z[2i-1] = (0,14pt);
+endfor
+draw z0..z1 dashed evenly;
+label.rt(btex \tt dashed evenly etex, z1);
+draw z2..z3 dashed evenly scaled 2;
+label.rt(btex \tt dashed evenly scaled 2 etex, z3);
+draw z4..z5 dashed evenly scaled 4;
+label.rt(btex \tt dashed evenly scaled 4 etex, z5);
+draw z6..z7 dashed withdots;
+label.rt(btex \tt dashed withdots etex, z7);
+draw z8..z9 dashed withdots scaled 2;
+label.rt(btex \tt dashed withdots scaled 2 etex, z9);
+endfig;
+
+
+beginfig(30);
+picture e[]; e4=evenly scaled 4;
+z0 = (0,0);
+z1 = (2in,0);
+for i=1 upto 3:
+ z[2i]-z[2i-2] = z[2i+1]-z[2i-1] = (0,14pt);
+endfor
+dotlabels.lft(0,2,4,6);
+draw z0..z1 dashed e4;
+dotlabel.rt(btex 1 \tt\ draw z0..z1 dashed e4 etex, z1);
+draw z2..z3 dashed e4 shifted (6bp,0);
+dotlabel.rt(btex 3 \tt\ draw z2..z3 dashed e4 shifted (6bp,0) etex, z3);
+draw z4..z5 dashed e4 shifted (12bp,0);
+dotlabel.rt(btex 5 \tt\ draw z4..z5 dashed e4 shifted (12bp,0) etex, z5);
+draw z6..z7 dashed e4 shifted (18bp,0);
+dotlabel.rt(btex 7 \tt\ draw z6..z7 dashed e4 shifted (18bp,0) etex, z7);
+endfig;
+
+
+beginfig(31);
+picture d; d = dashpattern(on 6bp off 12bp on 6bp);
+draw d;
+endfig;
+
+
+beginfig(32);
+draw dashpattern(on 15bp off 15bp) dashed evenly;
+picture p;
+p=currentpicture;
+currentpicture:=nullpicture;
+draw fullcircle scaled 1cm xscaled 3 dashed p;
+endfig;
+
+
+beginfig(33);
+for i=0 upto 2:
+ z[i]=(0,-40i); z[i+3]-z[i]=(100,30);
+endfor
+pickup pencircle scaled 18;
+draw z0..z3 withcolor .8white;
+linecap:=butt;
+draw z1..z4 withcolor .8white;
+linecap:=squared;
+draw z2..z5 withcolor .8white;
+dotlabels.top(0,1,2,3,4,5);
+endfig; linecap:=rounded;
+
+
+beginfig(34);
+for i=0 upto 2:
+ z[i]=(0,-50i); z[i+3]-z[i]=(60,40);
+ z[i+6]-z[i]=(120,0);
+endfor
+pickup pencircle scaled 24;
+draw z0--z3--z6 withcolor .8white;
+linejoin:=mitered;
+draw z1..z4--z7 withcolor .8white;
+linejoin:=beveled;
+draw z2..z5--z8 withcolor .8white;
+dotlabels.bot(0,1,2,3,4,5,6,7,8);
+endfig; linejoin:=rounded;
+
+
+beginfig(35);
+z2a=(0,0);
+(-x1a,y1a) = -z3a = .5in*unitvector(6,1);
+z1b - z1a = .75*z1a rotated -90;
+z2b - z1b = whatever*(z2a-z1a);
+z3b - z2b = whatever*(z3a-z2a);
+y2b = 0;
+z3b - z3a = whatever*(z3a rotated 90);
+z0b-z1b = z0a-z1a = z1a;
+x4a=x2a; x4b=x2b;
+y4a = y4b = 1.3*y3b;
+fill z1a--z2a--z3a--z3b--z2b--z1b--cycle withcolor .8 white;
+for p= z2a--z4a, z2b--z4b, z0a--z1a, z0b--z1b:
+ draw p dashed evenly;
+endfor
+drawdblarrow z4a--z4b;
+drawdblarrow z0a--z0b;
+label.bot(btex {\tenrm длина острия} etex, .5[z4a,z4b]);
+label.ulft(btex {\tenrm толщина линии} etex, .5[z0a,z0b]);
+endfig;
+
+
+beginfig(36);
+z[-1]=(0,0); z0=(1in,0);
+for i=1 upto 6:
+ z[i]-z[i-2] = (0,-15pt);
+ if x[i]=0: label.lft(decimal i, z[i]);
+ fi
+endfor
+drawarrow z1..z2;
+drawarrow reverse(z3..z4);
+drawdblarrow z5..z6;
+label.rt(btex 2 \tt\ drawarrow z1..z2 etex, z2);
+label.rt(btex 4 \tt\ drawarrow reverse(z3..z4) etex, z4);
+label.rt(btex 6 \tt\ drawdblarrow z5..z6 etex, z6);
+endfig;
+
+
+beginfig(37);
+path p, q, r;
+ahlength := 1.5cm;
+pickup pencircle scaled .2cm;
+p = (0,0)..{right}(2.5cm,2cm);
+q = counterclockwise arrowhead p;
+z0 = directionpoint up of q;
+z.a = directionpoint right of q;
+z.b = directionpoint (-1,-1) of q;
+drawarrow p withcolor .4white;
+pickup defaultpen;
+undraw p;
+undraw q;
+ahlength:=4bp;
+z.a1-z0 = .3cm*unitvector(z.a-z0) rotated 90;
+z.a1-z.a2 = z0-z.a;
+z.b1-z0 = .3cm*unitvector(z.b-z0) rotated -90;
+z.b1-z.b2 = z0-z.b;
+z.ab = whatever[z.a1,z.a2] = whatever[z.b1,z.b2];
+z.a0-z.ab = .4cm*unitvector(z.a1-z.a2);
+z.b0-z.ab = .4cm*unitvector(z.b1-z.b2);
+drawdblarrow z.a1..z.a2;
+label.lrt(btex \tt ahlength etex, .9[z.a1,z.a2]);
+draw z.a1..z.a0 dashed evenly;
+drawdblarrow z.b1..z.b2;
+label.urt(btex \tt ahlength etex, .9[z.b1,z.b2]);
+draw z.b1..z.b0 dashed evenly;
+r = z.a0{(z.a2-z.a0) rotated 90}..{(z.b2-z.b0)rotated 90}z.b0;
+draw r;
+label.rt(btex \tt ahangle etex, point .5 of r);
+endfig;
+
+
+beginfig(38);
+pickup pencircle scaled .2in yscaled .08 rotated 30;
+x0=x3=x4;
+z1-z0 = .45in*dir 30;
+z2-z3 = whatever*(z1-z0);
+z6-z5 = whatever*(z1-z0);
+z1-z6 = 1.2*(z3-z0);
+rt x3 = lft x2;
+x5 = .55[x4,x6];
+y4 = y6;
+lft x3 = bot y5 = 0;
+top y2 = .9in;
+draw z0--z1--z2--z3--z4--z5--z6 withcolor .7white;
+dotlabels.top(0,1,2,3,4,5,6);
+endfig;
+
+
+beginfig(40);
+path p[];
+p1 = (0,0){curl 0}..(5pt,-3pt)..{curl 0}(10pt,0);
+p2 = p1..(p1 yscaled-1 shifted(10pt,0));
+p0 = p2;
+for i=1 upto 3: p0:=p0.. p2 shifted (i*20pt,0);
+ endfor
+for j=0 upto 8: draw p0 shifted (0,j*10pt);
+ endfor
+p3 = fullcircle shifted (.5,.5) scaled 72pt;
+clip currentpicture to p3;
+draw p3;
+endfig;
+
+
+marksize=4pt;
+angle_radius=8pt;
+
+def draw_mark(expr p, a) =
+ begingroup
+ save t, dm; pair dm;
+ t = arctime a of p;
+ dm = marksize*unitvector direction t of p
+ rotated 90;
+ draw (-.5dm.. .5dm) shifted point t of p;
+ endgroup
+enddef;
+
+def draw_marked(expr p, n) =
+ begingroup
+ save amid;
+ amid = .5*arclength p;
+ for i=-(n-1)/2 upto (n-1)/2:
+ draw_mark(p, amid+.6marksize*i);
+ endfor
+ draw p;
+ endgroup
+enddef;
+
+def mark_angle(expr a, b, c, n) =
+ begingroup
+ save s, p; path p;
+ p = unitvector(a-b){(a-b)rotated 90}..unitvector(c-b);
+ s = .9marksize/length(point 1 of p - point 0 of p);
+ if s<angle_radius: s:=angle_radius; fi
+ draw_marked(p scaled s shifted b, n);
+ endgroup
+enddef;
+
+def mark_rt_angle(expr a, b, c) =
+ draw ((1,0)--(1,1)--(0,1))
+ zscaled (angle_radius*unitvector(a-b)) shifted b
+enddef;
+
+beginfig(42);
+pair a,b,c,d;
+b=(0,0); c=(1.5in,0); a=(0,.6in);
+d-c = (a-b) rotated 25;
+dotlabel.lft("a",a);
+dotlabel.lft("b",b);
+dotlabel.bot("c",c);
+dotlabel.llft("d",d);
+z0=.5[a,d];
+z1=.5[b,c];
+(z.p-z0) dotprod (d-a) = 0;
+(z.p-z1) dotprod (c-b) = 0;
+draw a--d;
+draw b--c;
+draw z0--z.p--z1;
+draw_marked(a--b, 1);
+draw_marked(c--d, 1);
+draw_marked(a--z.p, 2);
+draw_marked(d--z.p, 2);
+draw_marked(b--z.p, 3);
+draw_marked(c--z.p, 3);
+mark_angle(z.p, b, a, 1);
+mark_angle(z.p, c, d, 1);
+mark_angle(z.p, c, b, 2);
+mark_angle(c, b, z.p, 2);
+mark_rt_angle(z.p, z0, a);
+mark_rt_angle(z.p, z1, b);
+endfig;
+
+
+def getmid(suffix p) =
+ pair p.mid[], p.off[], p.dir[];
+ for i=0 upto 36:
+ p.dir[i] = dir(5*i);
+ p.mid[i]+p.off[i] = directionpoint p.dir[i] of p;
+ p.mid[i]-p.off[i] = directionpoint -p.dir[i] of p;
+ endfor
+enddef;
+
+def joinup(suffix pt, d)(expr n) =
+ begingroup
+ save res, g; path res;
+ res = pt[0]{d[0]};
+ for i=1 upto n:
+ g:= if (pt[i]-pt[i-1]) dotprod d[i] <0: - fi 1;
+ res := res{g*d[i-1]}...{g*d[i]}pt[i];
+ endfor
+ res
+ endgroup
+enddef;
+
+beginfig(45)
+path p, q;
+p = ((5,2)...(3,4)...(1,3)...(-2,-3)...(0,-5)...(3,-4)
+ ...(5,-3)...cycle) scaled .3cm shifted (0,5cm);
+getmid(p);
+draw p;
+draw joinup(p.mid, p.dir, 36)..cycle;
+q = joinup(p.off, p.dir, 36);
+draw q..(q rotated 180)..cycle;
+drawoptions(dashed evenly);
+for i=0 upto 3:
+ draw p.mid[9i]-p.off[9i]..p.mid[9i]+p.off[9i];
+ draw -p.off[9i]..p.off[9i];
+endfor
+endfig;
+
+
+input boxes
+
+
+\beginfig(48);
+fill unitsquare xscaled 1.1in yscaled .7in withcolor .9white;
+boxit(currentpicture);
+dx = dy = .25in;
+clearit; drawboxed();
+forsuffixes $=n,c: makelabel.top(str $, $); endfor
+makelabel.bot("s",s);
+forsuffixes $=ne,e,se: makelabel.rt(str $, $); endfor
+forsuffixes $=nw,w,sw: makelabel.lft(str $, $); endfor
+pickup pencircle scaled .3bp;
+vardef larrow@#(expr a, da, s) =
+ drawdblarrow a..a+da; label@#(s,a+.5da); enddef;
+larrow.rt(n, (0,-dy), "dy");
+larrow.rt(s, (0,dy), "dy");
+larrow.top(e, (-dx,0), "dx");
+larrow.top(w, (dx,0), "dx");
+endfig;
+
+
+beginfig(49);
+boxjoin(a.se=b.sw; a.ne=b.nw);
+boxit.a(btex\strut$\cdots$ etex); boxit.ni(btex\strut$n_i$ etex);
+boxit.di(btex\strut$d_i$ etex); boxit.ni1(btex\strut$n_{i+1}$ etex);
+boxit.di1(btex\strut$d_{i+1}$ etex); boxit.aa(btex\strut$\cdots$ etex);
+boxit.nk(btex\strut$n_k$ etex); boxit.dk(btex\strut$d_k$ etex);
+drawboxed(di,a,ni,ni1,di1,aa,nk,dk); label.lft("ndtable:", a.w);
+interim defaultdy:=7bp;
+boxjoin(a.sw=b.nw; a.se=b.ne);
+boxit.ba(); boxit.bb(); boxit.bc();
+boxit.bd(btex $\vdots$ etex); boxit.be(); boxit.bf();
+bd.dx=8bp; ba.ne=a.sw-(15bp,10bp);
+drawboxed(ba,bb,bc,bd,be,bf); label.lft("hashtab:",ba.w);
+vardef ndblock suffix $ =
+ boxjoin(a.sw=b.nw; a.se=b.ne);
+ forsuffixes $$=$1,$2,$3: boxit$$(); ($$dx,$$dy)=(5.5bp,4bp);
+ endfor; enddef;
+ndblock nda; ndblock ndb; ndblock ndc;
+nda1.c-bb.c = ndb1.c-nda3.c = (whatever,0);
+xpart ndb3.se = xpart ndc1.ne = xpart di.c;
+ndc1.c - be.c = (whatever,0);
+drawboxed(nda1,nda2,nda3, ndb1,ndb2,ndb3, ndc1,ndc2,ndc3);
+drawarrow bb.c -- nda1.w;
+drawarrow be.c -- ndc1.w;
+drawarrow nda3.c -- ndb1.w;
+drawarrow nda1.c{right}..{curl0}ni.c cutafter bpath ni;
+drawarrow nda2.c{right}..{curl0}di.c cutafter bpath di;
+drawarrow ndc1.c{right}..{curl0}ni1.c cutafter bpath ni1;
+drawarrow ndc2.c{right}..{curl0}di1.c cutafter bpath di1;
+drawarrow ndb1.c{right}..nk.c cutafter bpath nk;
+drawarrow ndb2.c{right}..dk.c cutafter bpath dk;
+x.ptr=xpart aa.c; y.ptr=ypart ndc1.ne;
+drawarrow subpath (0,.7) of (z.ptr..{left}ndc3.c) dashed evenly;
+label.rt(btex \strut ndblock etex, z.ptr); endfig;
+
+
+\beginfig(50)
+interim circmargin := .07in;
+fill unitsquare xscaled 1.1in yscaled .7in withcolor .9white;
+circleit(currentpicture);
+dx = dy;
+clearit; drawboxed();
+forsuffixes $=n,c: makelabel.top(str $, $); endfor
+makelabel.bot("s",s);
+makelabel.rt("e", e);
+makelabel.lft("w", w);
+pickup pencircle scaled .3bp;
+vardef larrow@#(expr a, da, s) =
+ drawdblarrow a..a+da; label@#(s,a+.5da); enddef;
+larrow.rt(n, (0,-dy), "dy");
+larrow.rt(s, (0,dy), "dy");
+larrow.top(e, (-dx,0), "dx");
+larrow.top(w, (dx,0), "dx");
+endfig;
+
+
+
+vardef drawshadowed(text t) =
+ fixsize(t);
+ forsuffixes s=t:
+ fill bpath.s shifted (1pt,-1pt);
+ unfill bpath.s;
+ drawboxed(s);
+ endfor
+enddef;
+
+beginfig(51)
+circleit.a(btex Box 1 etex);
+circleit.b(btex Box 2 etex);
+b.n = a.s - (0,20pt);
+drawshadowed(a,b);
+drawarrow a.s -- b.n;
+endfig;
+
+
+vardef cuta(suffix a,b) expr p =
+ drawarrow p cutbefore bpath.a cutafter bpath.b;
+ point .5*length p of p
+enddef;
+
+vardef self@# expr p =
+ cuta(@#,@#) @#.c{curl0}..@#.c+p..{curl0}@#.c enddef;
+
+beginfig(52);
+verbatimtex \def\stk#1#2{$\displaystyle{\matrix{#1\cr#2\cr}}$} etex
+circleit.aa(btex\strut Start etex); aa.dx=aa.dy;
+circleit.bb(btex \stk B{(a|b)^*a} etex);
+circleit.cc(btex \stk C{b^*} etex);
+circleit.dd(btex \stk D{(a|b)^*ab} etex);
+circleit.ee(btex\strut Stop etex); ee.dx=ee.dy;
+numeric hsep;
+bb.c-aa.c = dd.c-bb.c = ee.c-dd.c = (hsep,0);
+cc.c-bb.c = (0,.8hsep);
+xpart(ee.e - aa.w) = 3.8in;
+drawboxed(aa,bb,cc,dd,ee);
+label.ulft(btex$b$etex, cuta(aa,cc) aa.c{dir50}..cc.c);
+label.top(btex$b$etex, self.cc(0,30pt));
+label.rt(btex$a$etex, cuta(cc,bb) cc.c..bb.c);
+label.top(btex$a$etex, cuta(aa,bb) aa.c..bb.c);
+label.llft(btex$a$etex, self.bb(-20pt,-35pt));
+label.top(btex$b$etex, cuta(bb,dd) bb.c..dd.c);
+label.top(btex$b$etex, cuta(dd,ee) dd.c..ee.c);
+label.lrt(btex$a$etex, cuta(dd,bb) dd.c..{dir140}bb.c);
+label.bot(btex$a$etex, cuta(ee,bb) ee.c..tension1.3 ..{dir115}bb.c);
+label.urt(btex$b$etex, cuta(ee,cc) ee.c{(cc.c-ee.c)rotated-15}..cc.c);
+endfig;
+
+
+beginfig(55)
+picture wheel, car;
+path body;
+ u := 5bp;
+ % Use a calligraphic pen.
+ pickup pencircle scaled .1u yscaled .6 rotated 30;
+ % Define a wheel object.
+ wheel := image(
+ draw fullcircle scaled 2u xscaled .8 rotated 30;
+ draw fullcircle scaled .1u xscaled .8 rotated 30
+ withpen currentpen scaled .5;
+ );
+ % Construct path for car body.
+ body := (3.2u,0){right}..(4.5u,1.5u){up}..(1.5u,2.5u){dir(-170)}
+ ..(1.5u,4.25u){up}...(0,5u){left};
+ body := body .. reverse body reflectedabout (origin, (0,u));
+ % Define a car object.
+ car := image(
+ draw wheel shifted (2u, 0);% Draw two wheels.
+ draw wheel shifted (-2u, 0);
+ draw (-.8u,0){dir(5)}..(.8u,0);% Draw connection betweeen wheels.
+ draw body;% Draw body.
+ % Draw speed indicators.
+ for i=1.5, 2, 2.5:
+ draw (5u, u*i){right}..{dir(-10)}(6.5u,u*i*.95);
+ endfor
+ ) shifted (0, u) slanted -.2 rotated 1;% Introduce asymmetries.
+ % Draw two cars and a faster one.
+ draw car shifted (5u,0);
+ draw car shifted (20u,0);
+ draw car slanted -.25 shifted (45u,0);
+ % Draw motorway.
+ draw (-5u,-u)...(25u,-.5u)...(60u,-u)
+ withpen currentpen scaled 4 withcolor .7white;
+endfig;
+
+%%% Title page rule.
+beginfig(60);
+ pickup pencircle scaled 1.1bp;
+ linecap := rounded;
+ draw origin--(4.38in,0);
+endfig;
+
+end
diff --git a/Master/texmf-dist/doc/metapost/mpman-ru/mpman-optab-ru.tex b/Master/texmf-dist/doc/metapost/mpman-ru/mpman-optab-ru.tex
new file mode 100644
index 00000000000..05c94c79054
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mpman-ru/mpman-optab-ru.tex
@@ -0,0 +1,276 @@
+%%% Two notes on column specification:
+%%% (i) Column widths are manually chosen as small as possible to allow
+%%% for a wider last X column.
+%%% (ii) In the first column \linepenalty=100 prefers shorter paragraphs
+%%% (less lines), where plain \raggedright were indifferent and
+%%% sometimes caused a dangling line, e.g., for 'directionpoint of'
+%%% or 'directiontime of'.
+\begin{longtable}{|>{\raggedright\linepenalty=100\ttfamily}p{.793in}*{3}{|>{\raggedright}p{.715in}}|>{\raggedleft}p{1.5em}|>{\raggedright\arraybackslash}X|}
+\caption{\strut Операторы}\label{optab}\\
+%%\caption{\strut Operators}\label{optab}\\
+\hline
+Имя& \multicolumn3{c|}{Аргумент/типы результата}& \makebox[.2in][c]{Стр.}& Объяснение\\\cline{2-4}
+%%Name& \multicolumn3{c|}{Argument/result types}& \makebox[.2in][c]{Page}& Explanation\\\cline{2-4}
+& \multicolumn1{c|}{Левый}& \multicolumn1{c|}{Правый}& \multicolumn1{c|}{Результат}& & \\
+%%& \multicolumn1{c|}{Left}& \multicolumn1{c|}{Right}& \multicolumn1{c|}{Result}& & \\
+\hline
+\hline
+\endfirsthead
+\caption[]{\strut Операторы \emph{(продолжение)}}\\
+%%\caption[]{\strut Operators \emph{(continued)}}\\
+\hline
+Имя& \multicolumn3{c|}{Аргумент/типы результата}& \makebox[.2in][c]{Стр.}& Объяснение\\\cline{2-4}
+%%Name& \multicolumn3{c|}{Argument/result types}& \makebox[.2in][c]{Page}& Explanation\\\cline{2-4}
+& \multicolumn1{c|}{Левый}& \multicolumn1{c|}{Правый}& \multicolumn1{c|}{Результат}& & \\
+%%& \multicolumn1{c|}{Left}& \multicolumn1{c|}{Right}& \multicolumn1{c|}{Result}& & \\
+\hline
+\hline
+\endhead
+\&\index{&?\texttt{\&}}& string\par path& string\par path & string\par path& \pageref{Damp}& Склейка (для путей $l\hbox{\tt\&}r$, если $r$ начинается точно там, где кончается $l$)\\\hline
+%%\&\index{&?\texttt{\&}}& string\par path& string\par path & string\par path& \pageref{Damp}& Concatenation---works for paths $l\hbox{\tt\&}r$ if $r$ starts exactly where the $l$ ends\\\hline
+*\index{*?\texttt{*}}& numeric& (cmyk)color\par numeric\par pair& (cmyk)color\par numeric\par pair& \pageref{Dmldiv}& Умножение\\\hline
+%%*\index{*?\texttt{*}}& numeric& (cmyk)color\par numeric\par pair& (cmyk)color\par numeric\par pair& \pageref{Dmldiv}& Multiplication\\\hline
+*\index{*?\texttt{*}}& (cmyk)color\par numeric\par pair& numeric& (cmyk)color\par numeric\par pair& \pageref{Dmldiv}& Умножение\\\hline
+%%*\index{*?\texttt{*}}& (cmyk)color\par numeric\par pair& numeric& (cmyk)color\par numeric\par pair& \pageref{Dmldiv}& Multiplication\\\hline
+**\index{**?\texttt{**}}& numeric& numeric& numeric& \pageref{Dpow}& Возведение в степень\\\hline
+%%**\index{**?\texttt{**}}& numeric& numeric& numeric& \pageref{Dpow}& Exponentiation\\\hline
++\index{+?\texttt{+}}& (cmyk)color\par numeric\par pair& (cmyk)color\par numeric\par pair& (cmyk)color\par numeric\par pair& \pageref{Dadd}& Сложение\\\hline
+%%+\index{+?\texttt{+}}& (cmyk)color\par numeric\par pair& (cmyk)color\par numeric\par pair& (cmyk)color\par numeric\par pair& \pageref{Dadd}& Addition\\\hline
+++\index{++?\texttt{++}}& numeric& numeric& numeric& \pageref{Dpyadd}& Пифагорово сложение $\sqrt{l^2+r^2}$\\\hline
+%%++\index{++?\texttt{++}}& numeric& numeric& numeric& \pageref{Dpyadd}& Pythagorean addition $\sqrt{l^2+r^2}$\\\hline
++-+\index{+-+?\texttt{+-+}}& numeric& numeric& numeric& \pageref{Dpysub}& Пифагорово вычитание $\sqrt{l^2-r^2}$\\\hline
+%%+-+\index{+-+?\texttt{+-+}}& numeric& numeric& numeric& \pageref{Dpysub}& Pythagorean subtraction $\sqrt{l^2-r^2}$\\\hline
+-\index{-?\texttt{-}}& (cmyk)color\par numeric\par pair& (cmyk)color\par numeric\par pair& (cmyk)color\par numeric\par pair& \pageref{Dadd}& Вычитание\\\hline
+%%-\index{-?\texttt{-}}& (cmyk)color\par numeric\par pair& (cmyk)color\par numeric\par pair& (cmyk)color\par numeric\par pair& \pageref{Dadd}& Subtraction\\\hline
+-\index{-?\texttt{-}}& --& (cmyk)color\par numeric\par pair& (cmyk)color\par numeric\par pair& \pageref{Dneg}& Унарный минус\\\hline
+%%-\index{-?\texttt{-}}& --& (cmyk)color\par numeric\par pair& (cmyk)color\par numeric\par pair& \pageref{Dneg}& Negation\\\hline
+/\index{/?\texttt{/}}& (cmyk)color\par numeric\par pair& numeric& (cmyk)color\par numeric\par pair& \pageref{Dmldiv}& Деление\\\hline
+%%/\index{/?\texttt{/}}& (cmyk)color\par numeric\par pair& numeric& (cmyk)color\par numeric\par pair& \pageref{Dmldiv}& Division\\\hline
+<\index{<?\texttt{<}} =\index{=?\texttt{=}} >>\index{>?\texttt{>}}\par <=\index{<=?\texttt{<=}} >=\index{=>?\texttt{=>}}\par <>\index{<>?\texttt{<>}}& string\par numeric\par pair\par (cmyk)color\par transform& string\par numeric\par pair\par (cmyk)color\par transform& boolean& \pageref{Dcmpar}& Операции сравнения\\\hline
+%%<\index{<?\texttt{<}} =\index{=?\texttt{=}} >>\index{>?\texttt{>}}\par <=\index{<=?\texttt{<=}} >=\index{=>?\texttt{=>}}\par <>\index{<>?\texttt{<>}}& string\par numeric\par pair\par (cmyk)color\par transform& string\par numeric\par pair\par (cmyk)color\par transform& boolean& \pageref{Dcmpar}& Comparison operators\\\hline
+\pl abs\index{abs?\texttt{abs}}& --& numeric\par pair& numeric& \pageref{Dabs}& Модуль\par Евклидова длина $\sqrt{(\mbox{\ttfamily xpart\ } r)^2+(\mbox{\ttfamily ypart\ } r)^2}$\\\hline
+%%\pl abs\index{abs?\texttt{abs}}& --& numeric\par pair& numeric& \pageref{Dabs}& Absolute value\par Euclidean length $\sqrt{(\mbox{\ttfamily xpart\ } r)^2+(\mbox{\ttfamily ypart\ } r)^2}$\\\hline
+and\index{and?\texttt{and}}& boolean& boolean& boolean& \pageref{Dand}& Логическое И\\\hline
+%%and\index{and?\texttt{and}}& boolean& boolean& boolean& \pageref{Dand}& Logical and\\\hline
+angle\index{angle?\texttt{angle}}& --& pair& numeric& \pageref{Dangle}& 2$-$аргументный арктангенс (в градусах)\\\hline
+%%angle\index{angle?\texttt{angle}}& --& pair& numeric& \pageref{Dangle}& 2$-$argument arctangent (in degrees)\\\hline
+arclength\index{arclength?\texttt{arclength}}& --& path& numeric& \pageref{Darclng}& Длина дуги пути\\\hline
+%%arclength\index{arclength?\texttt{arclength}}& --& path& numeric& \pageref{Darclng}& Arc length of a path\\\hline
+arctime of\index{arctime of?\texttt{arctime of}}& numeric& path& numeric& \pageref{Darctim}& Время на пути, где длина дуги от начала достигает заданной величины\\\hline
+%%arctime of\index{arctime of?\texttt{arctime of}}& numeric& path& numeric& \pageref{Darctim}& Time on a path where arc length from the start reaches a given value\\\hline
+ASCII\index{ASCII?\texttt{ASCII}}& --& string& numeric& --& Значение ASCII первого символа в строке\\\hline
+%%ASCII\index{ASCII?\texttt{ASCII}}& --& string& numeric& --& ASCII value of first character in string\\\hline
+\pl bbox\index{bbox?\texttt{bbox}}& --& picture\par path\par pen& path& \pageref{Dbbox}& Прямоугольный путь охватывающей рамки\\\hline
+%%\pl bbox\index{bbox?\texttt{bbox}}& --& picture\par path\par pen& path& \pageref{Dbbox}& A rectangular path for the bounding box\\\hline
+blackpart\index{blackpart?\texttt{blackpart}}& --& cmykcolor& numeric& \pageref{Dcmykprt}& Выделение четвертой компоненты\\\hline
+%%blackpart\index{blackpart?\texttt{blackpart}}& --& cmykcolor& numeric& \pageref{Dcmykprt}& Extract the fourth component\\\hline
+bluepart\index{bluepart?\texttt{bluepart}}& --& color& numeric& \pageref{Drgbprt}& Выделение третьей компоненты\\\hline
+%%bluepart\index{bluepart?\texttt{bluepart}}& --& color& numeric& \pageref{Drgbprt}& Extract the third component\\\hline
+boolean\index{boolean?\texttt{boolean}}& --& любой& boolean& \pageref{Dboolop}& Выражение логического типа?\\\hline
+%%boolean\index{boolean?\texttt{boolean}}& --& any& boolean& \pageref{Dboolop}& Is the expression of type boolean?\\\hline
+\pl bot\index{bot?\texttt{bot}}& --& numeric\par pair& numeric\par pair& \pageref{Dbot}& Низ текущего пера, центрированного по заданным координатам\\\hline
+%%\pl bot\index{bot?\texttt{bot}}& --& numeric\par pair& numeric\par pair& \pageref{Dbot}& Bottom of current pen when centered at the given coordinate(s)\\\hline
+bounded\index{bounded?\texttt{bounded}}& --& любой& boolean& \pageref{Dbounded}& Аргумент --- это картинка в охватывающей рамке?\\\hline
+%%bounded\index{bounded?\texttt{bounded}}& --& any& boolean& \pageref{Dbounded}& Is argument a picture with a bounding box?\\\hline
+\pl ceiling\index{ceiling?\texttt{ceiling}}& --& numeric& numeric& \pageref{Dceil}& Наименьшее целое, большее или равное данному\\\hline
+%%\pl ceiling\index{ceiling?\texttt{ceiling}}& --& numeric& numeric& \pageref{Dceil}& Least integer greater than or equal to\\\hline
+\pl center\index{center?\texttt{center}}& --& picture\par path\par pen& pair& \pageref{Dcenter}& Центр охватывающей рамки\\\hline
+%%\pl center\index{center?\texttt{center}}& --& picture\par path\par pen& pair& \pageref{Dcenter}& Center of the bounding box\\\hline
+char\index{char?\texttt{char}}& --& numeric& string& \pageref{Dchar}& Символ с заданным кодом ASCII\\\hline
+%%char\index{char?\texttt{char}}& --& numeric& string& \pageref{Dchar}& Character with a given ASCII code\\\hline
+clipped\index{clipped?\texttt{clipped}}& --& любой& boolean& \pageref{Dclipped}& Аргумент --- вырезка из картинки?\\\hline
+%%clipped\index{clipped?\texttt{clipped}}& --& any& boolean& \pageref{Dclipped}& Is argument a clipped picture?\\\hline
+cmykcolor\index{cmykcolor?\texttt{cmykcolor}}& --& любой& boolean& \pageref{Dccolrop}& Выражение типа cmyk-цвет?\\\hline
+%%cmykcolor\index{cmykcolor?\texttt{cmykcolor}}& --& any& boolean& \pageref{Dccolrop}& Is the expression of type cmykcolor?\\\hline
+color\index{color?\texttt{color}}& --& любой& boolean& \pageref{Dcolrop}& Выражение типа цвет?\\\hline
+%%color\index{color?\texttt{color}}& --& any& boolean& \pageref{Dcolrop}& Is the expression of type color?\\\hline
+colormodel\index{colormodel?\texttt{colormodel}}& --& изображение& numeric& \pageref{Dcolormodel}& Какая модель цвета в объекте-изображении?\\\hline
+%%colormodel\index{colormodel?\texttt{colormodel}}& --& image object& numeric& \pageref{Dcolormodel}& What is the color model of the image object?\\\hline
+\pl colorpart\index{colorpart?\texttt{colorpart}}& --& изображение&
+(cmyk)color\par numeric\par boolean& \pageref{Dcolorpart}& Каков цвет
+объекта-изображения?\\\hline
+%%\pl colorpart\index{colorpart?\texttt{colorpart}}& --& image object&
+%%(cmyk)color\par numeric\par boolean& \pageref{Dcolorpart}& What is the
+%%color of the image object?\\\hline
+cosd\index{cosd?\texttt{cosd}}& --& numeric& numeric& \pageref{Dcosd}& Косинус угла в градусах\\\hline
+%%cosd\index{cosd?\texttt{cosd}}& --& numeric& numeric& \pageref{Dcosd}& Cosine of angle in degrees\\\hline
+\pl cutafter\index{cutafter?\texttt{cutafter}}& path& path& path& \pageref{Dcuta}& Левый аргумент с частью, отбрасываемой после пересечения\\\hline
+%%\pl cutafter\index{cutafter?\texttt{cutafter}}& path& path& path& \pageref{Dcuta}& Left argument with part after the intersection dropped\\\hline
+\pl cutbefore\index{cutbefore?\texttt{cutbefore}}& path& path& path& \pageref{Dcutb}& Левый аргумент с частью, отбрасываемой до пересечения\\\hline
+%%\pl cutbefore\index{cutbefore?\texttt{cutbefore}}& path& path& path& \pageref{Dcutb}& Left argument with part before the intersection dropped\\\hline
+cyanpart\index{cyanpart?\texttt{cyanpart}}& --& cmykcolor& numeric& \pageref{Dcmykprt}& Извлечь первый аргумент\\\hline
+%%cyanpart\index{cyanpart?\texttt{cyanpart}}& --& cmykcolor& numeric& \pageref{Dcmykprt}& Extract the first component\\\hline
+cycle\index{cycle?\texttt{cycle}}& --& path& boolean& \pageref{Dcycop}& Определяет цикличен ли путь\\\hline
+%%cycle\index{cycle?\texttt{cycle}}& --& path& boolean& \pageref{Dcycop}& Determines whether a path is cyclic\\\hline
+dashpart\index{dashpart?\texttt{dashpart}}& --& picture& picture& \pageref{Ddashpart}& Образец пунктира пути в рисуемой картинке\\\hline
+%%dashpart\index{dashpart?\texttt{dashpart}}& --& picture& picture& \pageref{Ddashpart}& Dash pattern of a path in a stroked picture\\\hline
+decimal\index{decimal?\texttt{decimal}}& --& numeric& string& \pageref{Ddecop}& Десятичное представление\\\hline
+%%decimal\index{decimal?\texttt{decimal}}& --& numeric& string& \pageref{Ddecop}& The decimal representation\\\hline
+\pl dir\index{dir?\texttt{dir}}& --& numeric& pair& \pageref{Ddirop}& $(\cos\theta,\sin\theta)$ по заданному $\theta$ в градусах\\\hline
+%%\pl dir\index{dir?\texttt{dir}}& --& numeric& pair& \pageref{Ddirop}& $(\cos\theta,\sin\theta)$ given $\theta$ in degrees\\\hline
+\pl direction of\index{direction of?\texttt{direction of}}& numeric& path& pair& \pageref{Ddirof}& Направление пути в данное `время'\\\hline
+%%\pl direction of\index{direction of?\texttt{direction of}}& numeric& path& pair& \pageref{Ddirof}& The direction of a path at a given `time'\\\hline
+\pl direction\-point of\index{directionpoint of?\texttt{directionpoint of}}& pair& path& numeric& \pageref{Ddpntof}& Точка, где путь имеет заданное направление\\\hline
+%%\pl direction\-point of\index{directionpoint of?\texttt{directionpoint of}}& pair& path& numeric& \pageref{Ddpntof}& Point where a path has a given direction\\\hline
+direction\-time of\index{directiontime of?\texttt{directiontime of}}& pair& path& numeric& \pageref{Ddtimof}& `Время', когда путь имеет заданное направление\\\hline
+%%direction\-time of\index{directiontime of?\texttt{directiontime of}}& pair& path& numeric& \pageref{Ddtimof}& `Time' when a path has a given direction\\\hline
+\pl div\index{div?\texttt{div}}& numeric& numeric& numeric& --& Целочисленное деление $\lfloor l/r\rfloor$\\\hline
+%%\pl div\index{div?\texttt{div}}& numeric& numeric& numeric& --& Integer division $\lfloor l/r\rfloor$\\\hline
+\pl dotprod\index{dotprod?\texttt{dotprod}}& pair& pair& numeric& \pageref{Ddprod}& скалярное произведение векторов\\\hline
+%%\pl dotprod\index{dotprod?\texttt{dotprod}}& pair& pair& numeric& \pageref{Ddprod}& vector dot product\\\hline
+filled\index{filled?\texttt{filled}}& --& любой& boolean& \pageref{Dfilled}& Аргумент --- это заполненное выделение?\\\hline
+%%filled\index{filled?\texttt{filled}}& --& any& boolean& \pageref{Dfilled}& Is argument a filled outline?\\\hline
+floor\index{floor?\texttt{floor}}& --& numeric& numeric& \pageref{Dfloor}& Наибольшее целое, меньшее или равное данному\\\hline
+%%floor\index{floor?\texttt{floor}}& --& numeric& numeric& \pageref{Dfloor}& Greatest integer less than or equal to\\\hline
+fontpart\index{fontpart?\texttt{fontpart}}& --& picture& string& \pageref{Dfontpart}& Шрифт текстовой компоненты картинки\\\hline
+%%fontpart\index{fontpart?\texttt{fontpart}}& --& picture& string& \pageref{Dfontpart}& Font of a textual picture component\\\hline
+fontsize\index{fontsize?\texttt{fontsize}}& --& string& numeric& \pageref{Dfntsiz}& Размер шрифта в пунктах\\\hline
+%%fontsize\index{fontsize?\texttt{fontsize}}& --& string& numeric& \pageref{Dfntsiz}& The point size of a font\\\hline
+greenpart\index{greenpart?\texttt{greenpart}}& --& color& numeric& \pageref{Drgbprt}& Выделить второй компонент\\\hline
+%%greenpart\index{greenpart?\texttt{greenpart}}& --& color& numeric& \pageref{Drgbprt}& Extract the second component\\\hline
+greypart\index{greypart?\texttt{greypart}}& --& numeric& numeric& \pageref{Dgreyprt}& Выделить первый (единственный) компонент\\\hline
+%%greypart\index{greypart?\texttt{greypart}}& --& numeric& numeric& \pageref{Dgreyprt}& Extract the first (only) component\\\hline
+hex\index{hex?\texttt{hex}}& --& string& numeric& --& Интерпретировать как 16-ричное число\\\hline
+%%hex\index{hex?\texttt{hex}}& --& string& numeric& --& Interpret as a hexadecimal number\\\hline
+infont\index{infont?\texttt{infont}}& string& string& picture& \pageref{Sinfont}& Печать строку в заданном шрифте\\\hline
+%%infont\index{infont?\texttt{infont}}& string& string& picture& \pageref{Sinfont}& Typeset string in given font\\\hline
+\pl intersec\-tionpoint\index{intersectionpoint?\texttt{intersectionpoint}}& path& path& pair& \pageref{Disecpt}& Точка пересечения\\\hline
+%%\pl intersec\-tionpoint\index{intersectionpoint?\texttt{intersectionpoint}}& path& path& pair& \pageref{Disecpt}& An intersection point\\\hline
+intersec\-tiontimes\index{intersectiontimes?\texttt{intersectiontimes}}& path& path& pair& \pageref{Disectt}& Времена ($t_l,t_r)$ на путях $l$ и $r$, когда пути пересекаются\\\hline
+%%intersec\-tiontimes\index{intersectiontimes?\texttt{intersectiontimes}}& path& path& pair& \pageref{Disectt}& Times ($t_l,t_r)$ on paths $l$ and $r$ when the paths intersect\\\hline
+\pl inverse\index{inverse?\texttt{inverse}}& --& transform& transform& \pageref{Dinv}& Обратить трансформацию\\\hline
+%%\pl inverse\index{inverse?\texttt{inverse}}& --& transform& transform& \pageref{Dinv}& Invert a transformation\\\hline
+known\index{known?\texttt{known}}& --& любой& boolean& \pageref{Dknown}& Имеет ли аргумент известное значение?\\\hline
+%%known\index{known?\texttt{known}}& --& any& boolean& \pageref{Dknown}& Does argument have a known value?\\\hline
+length\index{length?\texttt{length}}& --& path\par string\par picture& numeric& \pageref{Dlength}\par \pageref{DlengthString}\par \pageref{DlengthPicture}& Число компонент (дуг, символов, нарисованных объектов, \ldots) в аргументе\\\hline
+%%length\index{length?\texttt{length}}& --& path\par string\par picture& numeric& \pageref{Dlength}\par \pageref{DlengthString}\par \pageref{DlengthPicture}& Number of components (arcs, characters, strokes, \ldots) in the argument\\\hline
+\pl lft\index{lft?\texttt{lft}}& --& numeric\par pair& numeric\par pair& \pageref{Dlft}& Левый край текущего пера с центром по заданным координатам\\\hline
+%%\pl lft\index{lft?\texttt{lft}}& --& numeric\par pair& numeric\par pair& \pageref{Dlft}& Left side of current pen when its center is at the given coordinate(s)\\\hline
+llcorner\index{llcorner?\texttt{llcorner}}& --& picture\par path\par pen& pair& \pageref{Dcornop}& Нижний левый угол охватывающей рамки\\\hline
+%%llcorner\index{llcorner?\texttt{llcorner}}& --& picture\par path\par pen& pair& \pageref{Dcornop}& Lower-left corner of bounding box\\\hline
+lrcorner\index{lrcorner?\texttt{lrcorner}}& --& picture\par path\par pen& pair& \pageref{Dcornop}& Нижний правый угол охватывающей рамки\\\hline
+%%lrcorner\index{lrcorner?\texttt{lrcorner}}& --& picture\par path\par pen& pair& \pageref{Dcornop}& Lower-right corner of bounding box\\\hline
+magentapart\index{magentapart?\texttt{magentapart}}& --& cmykcolor& numeric& \pageref{Dcmykprt}& Извлечь второй компонент\\\hline
+%%magentapart\index{magentapart?\texttt{magentapart}}& --& cmykcolor& numeric& \pageref{Dcmykprt}& Extract the second component\\\hline
+makepath\index{makepath?\texttt{makepath}}& --& pen& path& \pageref{Dmkpath}& Замкнутый путь, охватывающий форму пера\\\hline
+%%makepath\index{makepath?\texttt{makepath}}& --& pen& path& \pageref{Dmkpath}& Cyclic path bounding the pen shape\\\hline
+makepen\index{makepen?\texttt{makepen}}& --& path& pen& \pageref{Dmkpen}& Многоугольное перо из выпуклой части узлов пути\\\hline
+%%makepen\index{makepen?\texttt{makepen}}& --& path& pen& \pageref{Dmkpen}& A polygonal pen made from the convex hull of the path knots\\\hline
+mexp\index{mexp?\texttt{mexp}}& --& numeric& numeric& --& Функция $\exp(x/256)$\\\hline
+%%mexp\index{mexp?\texttt{mexp}}& --& numeric& numeric& --& The function $\exp(x/256)$\\\hline
+mlog\index{mlog?\texttt{mlog}}& --& numeric& numeric& --& Функция $256\ln(x)$\\\hline
+%%mlog\index{mlog?\texttt{mlog}}& --& numeric& numeric& --& The function $256\ln(x)$\\\hline
+\pl mod\index{mod?\texttt{mod}}& --& numeric& numeric& --& Функция-остаток $l-r\lfloor l/r\rfloor$\\\hline
+%%\pl mod\index{mod?\texttt{mod}}& --& numeric& numeric& --& The remainder function $l-r\lfloor l/r\rfloor$\\\hline
+normal\-deviate\index{normaldeviate?\texttt{normaldeviate}}& --& --& numeric& --& Выбор случайного числа со средним~0 и стандартным отклонением~1\\\hline
+%%normal\-deviate\index{normaldeviate?\texttt{normaldeviate}}& --& --& numeric& --& Choose a random number with mean~0 and standard deviation~1\\\hline
+not\index{not?\texttt{not}}& --& boolean& boolean& \pageref{Dnot}& Логическое НЕ\\\hline
+%%not\index{not?\texttt{not}}& --& boolean& boolean& \pageref{Dnot}& Logical negation\\\hline
+numeric\index{numeric?\texttt{numeric}}& --& любой& boolean& \pageref{Dnumop}& Выражение числового типа?\\\hline
+%%numeric\index{numeric?\texttt{numeric}}& --& any& boolean& \pageref{Dnumop}& Is the expression of type numeric?\\\hline
+oct\index{oct?\texttt{oct}}& --& string& numeric& --& Интерпретировать строку как 8-ричное число\\\hline
+%%oct\index{oct?\texttt{oct}}& --& string& numeric& --& Interpret string as octal number\\\hline
+odd\index{odd?\texttt{odd}}& --& numeric& boolean& --& Ближайшее целое нечетное?\\\hline
+%%odd\index{odd?\texttt{odd}}& --& numeric& boolean& --& Is the closest integer odd or even?\\\hline
+or\index{or?\texttt{or}}& boolean& boolean& boolean& \pageref{Dor}& Логическое ИЛИ\\\hline
+%%or\index{or?\texttt{or}}& boolean& boolean& boolean& \pageref{Dor}& Logical inclusive or\\\hline
+pair\index{pair?\texttt{pair}}& --& любой& boolean& \pageref{Dpairop}& Выражение типа пара?\\\hline
+%%pair\index{pair?\texttt{pair}}& --& any& boolean& \pageref{Dpairop}& Is the expression of type pair?\\\hline
+path\index{path?\texttt{path}}& --& любой& boolean& \pageref{Dpathop}& Выражение типа путь?\\\hline
+%%path\index{path?\texttt{path}}& --& any& boolean& \pageref{Dpathop}& Is the expression of type path?\\\hline
+pathpart\index{pathpart?\texttt{pathpart}}& --& picture& path& \pageref{Dpathpart}& Компонент-путь нарисованной картинки\\\hline
+%%pathpart\index{pathpart?\texttt{pathpart}}& --& picture& path& \pageref{Dpathpart}& Path of a stroked picture component\\\hline
+pen\index{pen?\texttt{pen}}& --& любой& boolean& \pageref{Dpenop}& Выражение типа перо?\\\hline
+%%pen\index{pen?\texttt{pen}}& --& any& boolean& \pageref{Dpenop}& Is the expression of type pen?\\\hline
+penoffset of\index{penoffset?\texttt{penoffset}}& pair& pen& pair& --& Крайняя точка пера с заданным направлением\\\hline
+%%penoffset of\index{penoffset?\texttt{penoffset}}& pair& pen& pair& --& Point on the pen furthest to the right of the given direction\\\hline
+penpart\index{penpart?\texttt{penpart}}& --& picture& pen& \pageref{Dpenpart}& Компонента-перо нарисованной картинки\\\hline
+%%penpart\index{penpart?\texttt{penpart}}& --& picture& pen& \pageref{Dpenpart}& Pen of a stroked picture component\\\hline
+picture\index{picture?\texttt{picture}}& --& любой& boolean& \pageref{Dpictop}& Выражение типа картинка?\\\hline
+%%picture\index{picture?\texttt{picture}}& --& any& boolean& \pageref{Dpictop}& Is the expression of type picture?\\\hline
+point of\index{point of?\texttt{point of}}& numeric& path& pair& \pageref{Dpntof}& Точка на пути с заданным значением времени\\\hline
+%%point of\index{point of?\texttt{point of}}& numeric& path& pair& \pageref{Dpntof}& Point on a path given a time value\\\hline
+postcontrol of\index{postcontrol?\texttt{postcontrol}}& numeric& path& pair& --& Первая управляющая точка Безье на отрезке пути, начинающимся в данное время\\\hline
+%%postcontrol of\index{postcontrol?\texttt{postcontrol}}& numeric& path& pair& --& First B\'ezier control point on path segment starting at the given time\\\hline
+precontrol of\index{precontrol?\texttt{precontrol}}& numeric& path& pair& --& Последняя управляющая точка Безье на отрезке пути, заканчивающимся в данное время\\\hline
+%%precontrol of\index{precontrol?\texttt{precontrol}}& numeric& path& pair& --& Last B\'ezier control point on path segment ending at the given time\\\hline
+readfrom\index{readfrom?\texttt{readfrom}}& --& string& string& \pageref{Dreadfrom}& Читать строку из файла\\\hline
+%%readfrom\index{readfrom?\texttt{readfrom}}& --& string& string& \pageref{Dreadfrom}& Read a line from file\\\hline
+redpart\index{redpart?\texttt{redpart}}& --& color& numeric& \pageref{Drgbprt}& Выделить первый компонент\\\hline
+%%redpart\index{redpart?\texttt{redpart}}& --& color& numeric& \pageref{Drgbprt}& Extract the first component\\\hline
+reverse\index{reverse?\texttt{reverse}}& --& path& path& \pageref{Drevrse}& путь в обратном `времени', конец меняется с началом\\\hline
+%%reverse\index{reverse?\texttt{reverse}}& --& path& path& \pageref{Drevrse}& `time'-reversed path, beginning swapped with ending\\\hline
+rgbcolor\index{rgbcolor?\texttt{rgbcolor}}& --& любой& boolean& \pageref{Drcolrop}& Выражение типа цвет?\\\hline
+%%rgbcolor\index{rgbcolor?\texttt{rgbcolor}}& --& any& boolean& \pageref{Drcolrop}& Is the expression of type color?\\\hline
+rotated\index{rotated?\texttt{rotated}}& picture\par path\par pair\par pen\par transform& numeric& picture\par path\par pair\par pen\par transform& \pageref{Dtranop}& Вращение (в градусах) против часовой стрелки\\\hline
+%%rotated\index{rotated?\texttt{rotated}}& picture\par path\par pair\par pen\par transform& numeric& picture\par path\par pair\par pen\par transform& \pageref{Dtranop}& Rotate counterclockwise a given number of degrees\\\hline
+\pl round\index{round?\texttt{round}}& --& numeric\par pair& numeric\par pair& \pageref{Dround}& округлить каждую компоненту до ближайшего целого\\\hline
+%%\pl round\index{round?\texttt{round}}& --& numeric\par pair& numeric\par pair& \pageref{Dround}& round each component to the nearest integer\\\hline
+\pl rt\index{rt?\texttt{rt}}& --& numeric\par pair& numeric\par pair& \pageref{Drt}& Правая сторона текущего пера, центрированного по данным координатам\\\hline
+%%\pl rt\index{rt?\texttt{rt}}& --& numeric\par pair& numeric\par pair& \pageref{Drt}& Right side of current pen when centered at given coordinate(s)\\\hline
+scaled\index{scaled?\texttt{scaled}}& picture\par path\par pair\par pen\par transform& numeric& picture\par path\par pair\par pen\par transform& \pageref{Dtranop}& Масштабируй все координаты в заданное число раз\\\hline
+%%scaled\index{scaled?\texttt{scaled}}& picture\par path\par pair\par pen\par transform& numeric& picture\par path\par pair\par pen\par transform& \pageref{Dtranop}& Scale all coordinates by the given amount\\\hline
+scantokens\index{scantokens?\texttt{scantokens}}& --& string& token sequence& \pageref{Dscantokens}& Преобрази строку в знак или последовательность знаков. Обеспечивает преобразование строки в число и т.~п.\\\hline
+%%scantokens\index{scantokens?\texttt{scantokens}}& --& string& token sequence& \pageref{Dscantokens}& Converts a string to a token or token sequence. Provides string to numeric conversion, etc.\\\hline
+shifted\index{shifted?\texttt{shifted}}& picture\par path\par pair\par pen\par transform& pair& picture\par path\par pair\par pen\par transform& \pageref{Dtranop}& Добавляет заданный сдвиг к каждой паре координат\\\hline
+%%shifted\index{shifted?\texttt{shifted}}& picture\par path\par pair\par pen\par transform& pair& picture\par path\par pair\par pen\par transform& \pageref{Dtranop}& Add the given shift amount to each pair of coordinates\\\hline
+sind\index{sind?\texttt{sind}}& --& numeric& numeric& \pageref{Dsind}& Синус угла в градусах\\\hline
+%%sind\index{sind?\texttt{sind}}& --& numeric& numeric& \pageref{Dsind}& Sine of an angle in degrees\\\hline
+slanted\index{slanted?\texttt{slanted}}& picture\par path\par pair\par pen\par transform& numeric& picture\par path\par pair\par pen\par transform& \pageref{Dtranop}& Применение трансформации-наклона, переводящей $(x,y)$ в $(x+sy,y)$, где~$s$ --- аргумент-число\\\hline
+%%slanted\index{slanted?\texttt{slanted}}& picture\par path\par pair\par pen\par transform& numeric& picture\par path\par pair\par pen\par transform& \pageref{Dtranop}& Apply the slanting transformation that maps $(x,y)$ into $(x+sy,y)$, where~$s$ is the numeric argument\\\hline
+sqrt\index{sqrt?\texttt{sqrt}}& --& numeric& numeric& \pageref{Dsqrt}& Квадратный корень\\\hline
+%%sqrt\index{sqrt?\texttt{sqrt}}& --& numeric& numeric& \pageref{Dsqrt}& Square root\\\hline
+str\index{str?\texttt{str}}& --& suffix& string& \pageref{Dstr}& Строковое представление суффикса\\\hline
+%%str\index{str?\texttt{str}}& --& suffix& string& \pageref{Dstr}& String representation for a suffix\\\hline
+string\index{string?\texttt{string}}& --& любой& boolean& \pageref{Dstrgop}& Выражение типа строка?\\\hline
+%%string& --& any& boolean& \pageref{Dstrgop}& Is the expression of type string?\\\hline
+stroked\index{stroked?\texttt{stroked}}& --& любой& boolean& \pageref{Dstroked}& Аргумент --- это нарисованная линия?\\\hline
+%%stroked\index{stroked?\texttt{stroked}}& --& any& boolean& \pageref{Dstroked}& Is argument a stroked line?\\\hline
+subpath of\index{subpath?\texttt{subpath}}& pair& path& path& \pageref{Dsubpth}& Часть пути для заданного диапазона времени\\\hline
+%%subpath of\index{subpath?\texttt{subpath}}& pair& path& path& \pageref{Dsubpth}& Portion of a path for given range of time values\\\hline
+substring of\index{substring
+of?\texttt{substring of}}& pair& string& string& \pageref{Dsubstr}& Подстрока, ограниченная индексами\\\hline
+%%substring of\index{substring of?\texttt{substring of}}& pair& string& string& \pageref{Dsubstr}& Substring bounded by given indices\\\hline
+textpart\index{textpart?\texttt{textpart}}& --& picture& string& \pageref{Dtextpart}& Текст текстовой компоненты картинки\\\hline
+%%textpart\index{textpart?\texttt{textpart}}& --& picture& string& \pageref{Dtextpart}& Text of a textual picture component\\\hline
+textual\index{textual?\texttt{textual}}& --& любой& boolean& \pageref{Dtextual}& Аргумент --- это текст?\\\hline
+%%textual\index{textual?\texttt{textual}}& --& any& boolean& \pageref{Dtextual}& Is argument typeset text?\\\hline
+\pl top\index{top?\texttt{top}}& --& numeric\par pair& numeric\par pair& \pageref{Dtop}& Верх текущего пера, центрированного по заданным координатам\\\hline
+%%\pl top\index{top?\texttt{top}}& --& numeric\par pair& numeric\par pair& \pageref{Dtop}& Top of current pen when centered at the given coordinate(s)\\\hline
+transform\index{transform?\texttt{transform}}& --& любой& boolean& \pageref{Dtrnfop}& Аргумент типа трансформация?\\\hline
+%%transform\index{transform?\texttt{transform}}& --& any& boolean& \pageref{Dtrnfop}& Is the argument of type transform?\\\hline
+transformed\index{transformed?\texttt{transformed}}& picture\par path\par pair\par pen\par transform& transform& picture\par path\par pair\par pen\par transform& \pageref{Dtrfrmd}& Примени данную трансформацию ко всем координатам\\\hline
+%%transformed\index{transformed?\texttt{transformed}}& picture\par path\par pair\par pen\par transform& transform& picture\par path\par pair\par pen\par transform& \pageref{Dtrfrmd}& Apply the given transform to all coordinates\\\hline
+ulcorner\index{ulcorner?\texttt{ulcorner}}& --& picture\par path\par pen& pair& \pageref{Dcornop}& Верхний левый угол охватывающей рамки\\\hline
+%%ulcorner\index{ulcorner?\texttt{ulcorner}}& --& picture\par path\par pen& pair& \pageref{Dcornop}& Upper-left corner of bounding box\\\hline
+uniform\-deviate\index{uniformdeviate?\texttt{uniformdeviate}}& --& numeric& numeric& --& Случайное число от нуля до значения аргумента\\\hline
+%%uniform\-deviate\index{uniformdeviate?\texttt{uniformdeviate}}& --& numeric& numeric& --& Random number between zero and the value of the argument\\\hline
+\pl unitvector\index{unitvector?\texttt{unitvector}}& --& pair& pair& \pageref{Duvec}& Масштабируй вектор к длине~1\\\hline
+%%\pl unitvector\index{unitvector?\texttt{unitvector}}& --& pair& pair& \pageref{Duvec}& Rescale a vector so its length is~1\\\hline
+unknown\index{unknown?\texttt{unknown}}& --& любой& boolean& \pageref{Dunknwn}& Значение неизвестно?\\\hline
+%%unknown\index{unknown?\texttt{unknown}}& --& any& boolean& \pageref{Dunknwn}& Is the value unknown?\\\hline
+urcorner\index{urcorner?\texttt{urcorner}}& --& picture\par path\par pen& pair& \pageref{Dcornop}& Верхний правый угол охватывающей рамки\\\hline
+%%urcorner\index{urcorner?\texttt{urcorner}}& --& picture\par path\par pen& pair& \pageref{Dcornop}& Upper-right corner of bounding box\\\hline
+\pl whatever\index{whatever?\texttt{whatever}}& --& --& numeric& \pageref{Dwhatev}& Создай новую анонимную неизвестную\\\hline
+%%\pl whatever\index{whatever?\texttt{whatever}}& --& --& numeric& \pageref{Dwhatev}& Create a new anonymous unknown\\\hline
+xpart\index{xpart?\texttt{xpart}}& --& pair\par transform& number& \pageref{Dxprt}& $x$ или $t_x$ компонента\\\hline
+%%xpart\index{xpart?\texttt{xpart}}& --& pair\par transform& number& \pageref{Dxprt}& $x$ or $t_x$ component\\\hline
+xscaled\index{xscaled?\texttt{xscaled}}& picture\par path\par pair\par pen\par transform& numeric& picture\par path\par pair\par pen\par transform& \pageref{Dtranop}& Масштабируй все координаты $x$ в заданное число раз\\\hline
+%%xscaled\index{xscaled?\texttt{xscaled}}& picture\par path\par pair\par pen\par transform& numeric& picture\par path\par pair\par pen\par transform& \pageref{Dtranop}& Scale all $x$ coordinates by the given amount\\\hline
+xxpart\index{xxpart?\texttt{xxpart}}& --& transform& number& \pageref{Dtrprt}& $t_{xx}$ в матрице трансформации\\\hline
+%%xxpart\index{xxpart?\texttt{xxpart}}& --& transform& number& \pageref{Dtrprt}& $t_{xx}$ entry in transformation matrix\\\hline
+xypart\index{xypart?\texttt{xypart}}& --& transform& number& \pageref{Dtrprt}& $t_{xy}$ в матрице трансформации\\\hline
+%%xypart\index{xypart?\texttt{xypart}}& --& transform& number& \pageref{Dtrprt}& $t_{xy}$ entry in transformation matrix\\\hline
+yellowpart\index{yellowpart?\texttt{yellowpart}}& --& cmykcolor& numeric& \pageref{Dcmykprt}& Выделить третью компоненту\\\hline
+%%yellowpart\index{yellowpart?\texttt{yellowpart}}& --& cmykcolor& numeric& \pageref{Dcmykprt}& Extract the third component\\\hline
+ypart\index{ypart?\texttt{ypart}}& --& pair\par transform& number& \pageref{Dyprt}& Компонента $y$ или $t_y$\\\hline
+%%ypart\index{ypart?\texttt{ypart}}& --& pair\par transform& number& \pageref{Dyprt}& $y$ or $t_y$ component\\\hline
+yscaled\index{yscaled?\texttt{yscaled}}& picture\par path\par pair\par pen\par transform& numeric& picture\par path\par pair\par pen\par transform& \pageref{Dtranop}& Масштабируй все координаты $y$ в заданное число раз\\\hline
+%%yscaled\index{yscaled?\texttt{yscaled}}& picture\par path\par pair\par pen\par transform& numeric& picture\par path\par pair\par pen\par transform& \pageref{Dtranop}& Scale all $y$ coordinates by the given amount\\\hline
+yxpart\index{yxpart?\texttt{yxpart}}& --& transform& number& \pageref{Dtrprt}& $t_{yx}$ в матрице трансформации\\\hline
+%%yxpart\index{yxpart?\texttt{yxpart}}& --& transform& number& \pageref{Dtrprt}& $t_{yx}$ entry in transformation matrix\\\hline
+yypart\index{yypart?\texttt{yypart}}& --& transform& number& \pageref{Dtrprt}& $t_{yy}$ в матрице трансформации\\\hline
+%%yypart\index{yypart?\texttt{yypart}}& --& transform& number& \pageref{Dtrprt}& $t_{yy}$ entry in transformation matrix\\\hline
+zscaled\index{zscaled?\texttt{zscaled}}& picture\par path\par pair\par pen\par transform& pair& picture\par path\par pair\par pen\par transform& \pageref{Dtranop}& Вращать и масштабировать все координаты так, что $(1,0)$ становится заданной парой, т.~е. произвести комплексное умножение.\\\hline
+%%zscaled\index{zscaled?\texttt{zscaled}}& picture\par path\par pair\par pen\par transform& pair& picture\par path\par pair\par pen\par transform& \pageref{Dtranop}& Rotate and scale all coordinates so that $(1,0)$ is mapped into the given pair; i.e., do complex multiplication.\\\hline
+\end{longtable}
diff --git a/Master/texmf-dist/doc/metapost/mpman-ru/mpman-ru.pdf b/Master/texmf-dist/doc/metapost/mpman-ru/mpman-ru.pdf
new file mode 100644
index 00000000000..333b7f0b655
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mpman-ru/mpman-ru.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/metapost/mpman-ru/mpman-ru.tex b/Master/texmf-dist/doc/metapost/mpman-ru/mpman-ru.tex
new file mode 100644
index 00000000000..2551a65a047
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mpman-ru/mpman-ru.tex
@@ -0,0 +1,11308 @@
+% $Id: mpman.tex 513 2008-04-29 12:03:53Z stephanhennig $
+% MetaPost manual, by John Hobby. License at end.
+% Russian translation, 2008/05/10
+\listfiles
+\RequirePackage{ifpdf}
+\ifpdf
+\ifnum\pdftexversion<140
+\else
+\pdfminorversion=5
+\pdfobjcompresslevel=1% Use compressed object streams.
+\fi
+\RequirePackage{cmap}
+\documentclass{article} % article is NOT the original style
+%%\usepackage[nofancy]{svninfo}% Access VCS information.
+%%\svnInfo $Id: mpman.tex 513 2008-04-29 12:03:53Z stephanhennig $
+\newcommand*{\mpversion}{1.004}
+
+%%\usepackage[T1]{fontenc}
+%%\usepackage{lmodern}
+%%\usepackage{textcomp}
+\usepackage{mflogo}
+\usepackage{makeidx}
+\usepackage{fancyvrb}
+\usepackage{ctabbing}
+\RecustomVerbatimEnvironment
+ {verbatim}{BVerbatim}{baseline=c}
+\usepackage{graphicx}
+\newcommand\qq{"} % quotation mark is active in Russian Babel!
+\usepackage{amssymb}
+\usepackage{cmap-cyr-vf}
+\usepackage[LCYW]{fontenc}
+\usepackage[koi8-r]{inputenc}
+\usepackage[english,russian]{babel}
+%%\usepackage[latin1]{inputenc}
+\usepackage[textwidth=6in,textheight=8.65in]{geometry}
+\usepackage{tocloft}
+ \setlength\cftbeforesecskip{1.3ex plus 0.3ex minus 0.3ex}
+\usepackage{ltxtable}
+
+
+\def\ttindex#1{{\tt #1}\index{#1?\texttt{#1}}}
+\def\ttt{\texttt} % I get tired of typing this out
+
+\def\ConTeXt{Con\TeX t}
+
+\newcommand\descr[1]{{\langle\hbox{#1}\rangle}}
+\newcommand\invisgap{\nobreak\hskip0pt\relax}
+\newcommand\tdescr[1]{$\langle$\invisgap#1\invisgap$\rangle$}
+
+\newcommand\pl{\dag}
+\newcommand\bx{$*$}
+
+
+\newcommand\mathcenter[1]{\vcenter{\hbox{#1}}}
+
+\renewcommand{\topfraction}{.85}
+\renewcommand{\bottomfraction}{.7}
+\renewcommand{\textfraction}{.15}
+\renewcommand{\floatpagefraction}{.5}
+\renewcommand{\dbltopfraction}{.66}
+\renewcommand{\dblfloatpagefraction}{.66}
+\setcounter{topnumber}{9}
+\setcounter{bottomnumber}{9}
+\setcounter{totalnumber}{20}
+\setcounter{dbltopnumber}{9}
+
+\makeindex
+
+\usepackage{multicol}
+\usepackage[rgb,x11names]{xcolor}% Optimize for screen reading.
+\usepackage{hyperxmp}
+\usepackage{hyperref}
+\hypersetup{
+ pdftitle={A User's Manual for MetaPost (translated to Russian)},
+%% pdftitle={A User's Manual for MetaPost},
+ pdfauthor={John D. Hobby and the MetaPost development team},
+ pdfkeywords={MetaPost, PostScript, vector graphics language, MetaFont, TeX, Russian}
+%% pdfkeywords={MetaPost, PostScript, vector graphics language, MetaFont, TeX}
+}
+\hypersetup{
+ pdfstartview={XYZ null null null},% Zoom factor is determined by viewer.
+ colorlinks,
+ linkcolor=RoyalBlue3,
+ urlcolor=Chocolate4,
+ citecolor=SpringGreen3
+}
+\usepackage[all]{hypcap}
+
+\begin{document}
+\VerbatimFootnotes
+%%% Title page layout documentation is missing.
+\begin{titlepage}
+ \vbox to \textheight {%
+ \vskip0pt
+ \vfil
+ \vfil
+ \vfil
+ \centerline{\resizebox{3.5in}{!}{\fontseries{b}\selectfont\MP}}
+ \vskip10bp% actually 21bp (-11bp)
+ \centerline{\includegraphics{manfig-ru-60.mps}}
+ \vskip15bp% actually 21bp (-6bp)
+ \centerline{%
+ \resizebox{3.5in}{!}{%
+ \scshape%
+ \fontsize{28bp}{28bp}\selectfont
+ \strut\lowercase{РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ}%
+%% \strut\lowercase{A USER\kern-2bp\lower3bp\hbox{'}S MANUAL}%
+ }%
+ }
+ \vskip-11bp
+ \vfil
+ \vfil
+ \centerline{\large John D. Hobby}
+ \vskip3bp
+ \centerline{и команда разработки MetaPost}
+%% \centerline{and the MetaPost development team}
+ \vskip20.8bp% actually 31.8bp (-11bp)
+ \centerline{\large версия документа: \mpversion}
+%% \centerline{\large documented version: \mpversion}
+ \vskip3bp
+%% \centerline{\svnToday}
+ \vfil
+ \vfil
+ \vfil
+ }
+\end{titlepage}
+
+\section*{Примечания переводчика}
+
+В версии 1.004 MetaPost
+руководство пользователя для пакета \texttt{boxes} было вынесено в отдельный документ.
+В переводе этого разделения не произошло, но добавления к документации были учтены.
+Создания этого перевода было бы невозможным без Ольги Гагаркиной.
+
+\begin{flushright}Владимир Лидовский, \url{litwr@yandex.ru}\end{flushright}
+\thispagestyle{empty}
+\newpage
+
+\setlength{\columnsep}{2.5em}
+\begin{multicols}{2}
+\tableofcontents
+\end{multicols}
+
+\section{Введение}
+%%\section{Introduction}
+\label{intro}
+
+MetaPost --- это язык программирования, очень похожий на \MF\footnote{\MF\
+--- это торговая марка компании Addison Wesley
+Publishing.}\index{metafont?\MF}~\cite{kn:c} Кнута с тем исключением, что
+он производит PostScript-программы вместо растровых картинок.
+%%MetaPost is a programming language much like Knuth's \MF\footnote{\MF\
+%%is a trademark of Addison Wesley Publishing
+%%company.}\index{metafont?\MF}~\cite{kn:c} except that it outputs
+%%PostScript programs instead of bitmaps.
+Заимствования из \MF --- это базовые средства для создания и
+манипулирования картинками.
+%%Borrowed from \MF\ are the
+%%basic tools for creating and manipulating pictures.
+Они включают числа, координатные пары, кубические сплайны, аффинные
+трансформации, текстовые строки и булевы величины.
+%%These include
+%%numbers, coordinate pairs, cubic splines, affine transformations, text
+%%strings, and boolean quantities.
+Дополнительные средства делают возможными соединение текста и графики и
+доступ к специальным возможностям PostScript\footnote{PostScript ---
+это торговая марка Adobe Systems.}\index{PostScript} таким как
+вырезка, затенение, пунктирные линии.
+%%Additional features facilitate
+%%integrating text and graphics and accessing special features of
+%%PostScript\footnote{PostScript is a trademark of Adobe Systems
+%%Inc.}\index{PostScript} such as clipping, shading, and dashed lines.
+Другое свойство, заимствованное у \MF, --- это способность решать
+заданные неявно линейные уравнения, что позволяет писать многие
+программы в значительной мере в декларативном стиле.
+%%Another feature borrowed from \MF\ is the ability to solve linear
+%%equations that are given implicitly, thus allowing many programs to be
+%%written in a largely declarative style.
+Мощь и гибкость MetaPost достигаются построением сложных операций
+из более простых.
+%%By building complex operations
+%%from simpler ones, MetaPost achieves both power and flexibility.
+
+MetaPost особенно хорошо приспособлен для генерации картинок для
+технических документов, где некоторые свойства рисунка могут
+контролироваться математическими или геометрическими ограничениями,
+которые наилучшим образом выражаются в символьной форме.
+%%MetaPost is particularly well-suited to generating figures for technical
+%%documents where some aspects of a picture may be controlled by
+%%mathematical or geometrical constraints that are best expressed
+%%symbolically.
+Другими словами, MetaPost не занимает место средств для ручного
+рисования или даже интерактивных графических редакторов.
+%%In other words, MetaPost is not meant to take the place
+%%of a freehand drawing tool or even an interactive graphics editor.
+Это настоящий язык программирования для генерации графики и, особенно,
+иллюстраций для документов \TeX\footnote{\TeX\ --- это торговая марка American
+Mathematical Society.}\index{TeX?\TeX} и troff\index{troff}.
+%%It
+%%is really a programming language for generating graphics, especially
+%%figures for \TeX\footnote{\TeX\ is a trademark of the American
+%%Mathematical Society.}\index{TeX?\TeX} and troff\index{troff} documents.
+
+Для использования MetaPost вы должны приготовить входной файл
+с Metapost-кодом и затем вызвать сам MetaPost при помощи, как правило,
+команды в форме \index{mpost?\texttt{mpost}}
+$$ {\tt mpost}\, \descr{имя файла} $$
+%%To use MetaPost, you prepare an input file containing MetaPost code and
+%%then invoke MetaPost, usually by giving a command of the
+%%form\index{mpost?\texttt{mpost}}
+%%$$ {\tt mpost}\, \descr{filename} $$
+Синтаксис и имя программы являются системо-зависимыми, иногда она
+зовется \texttt{mp}.
+%%The syntax and program name itself are system-dependent; sometimes it is
+%%named \texttt{mp}.
+Входные файлы для MetaPost\index{файлы!ввод} обычно имеют имена,
+заканчивающиеся на ``{\tt .mp}'', и эта часть имени может опускаться при
+вызове MetaPost.
+%%MetaPost input
+%%files\index{files!input} normally have names ending ``{\tt .mp}'' but
+%%this part of the name can be omitted when invoking MetaPost.
+Например, для входного файла {\tt foo.mp}
+$$ \hbox{\tt mpost foo} $$
+вызовет MetaPost и произведет выходные файлы с именами типа {\tt foo.1}
+и {\tt foo.2}.
+%%For an
+%%input file {\tt foo.mp}
+%%$$ \hbox{\tt mpost foo} $$
+%%invokes MetaPost and produces output files with names like {\tt foo.1}
+%%and {\tt foo.2}.
+Все сообщения, появляющиеся на терминале, собираются в
+файл-дубликат\index{файлы!дубликат}\index{файл-дубликат} с именем
+{\tt foo.log}.
+%%Any terminal I/O is summarized in a
+%%transcript\index{files!transcript}\index{transcript file} file called
+%%{\tt foo.log}.
+Туда включаются сообщения об ошибках и все команды MetaPost, введенные
+интерактивно.\footnote{Знак {\tt *}\index{*?\texttt{*}} используется
+для приглашения к интерактивному вводу и знак {\tt **}\index{**?\texttt{**}}
+показывает, что ожидается имя входного файла. Диалога можно избежать
+вызовом MetaPost с файлом, который заканчивается командой {\tt
+end}\index{end?\texttt{end}}.}
+%%This includes error messages and any MetaPost commands
+%%entered interactively.\footnote{A {\tt *}\index{*?\texttt{*}} prompt is
+%%used for interactive input and a {\tt **}\index{**?\texttt{**}} prompt
+%%indicates that an input file name is expected. This can be avoided by
+%%invoking MetaPost on a file that ends with an {\tt
+%%end}\index{end?\texttt{end}} command.}
+
+\label{Dmpversion}Файл-дубликат начинается с заголовочной строки,
+идентифицирующей используемую вами версию MetaPost.
+%%\label{Dmpversion}The transcript file starts with a banner line that
+%%identifies the version of MetaPost you are using.
+Вы можете также определить текущую версию из программы MetaPost через
+строковую константу \texttt{mpversion} (это стало возможным с версии 0.9).
+%%You can also determine
+%%the current version from within a MetaPost program via the
+%%\texttt{mpversion} predefined constant string (this was introduced in
+%%version 0.9).
+Например,
+%%For instance:
+$$\begin{verbatim}
+if known mpversion:
+ message "mp = " & mpversion;
+ if scantokens(mpversion) < 1: message "Поддержка цветов CMYK недоступна!" fi
+fi
+\end{verbatim}
+$$
+печатает
+%%prints
+$$\begin{verbatim}[commandchars=\\\{\}]
+mp = \mpversion
+\end{verbatim}
+$$
+Команда {\tt scantokens} описана на с.~\pageref{Dscantokens} и
+может быть употреблена для конвертирования строк в числа.
+\index{Комментарий Creator в выводе PostScript}%
+%%The {\tt scantokens} command is described on p.~\pageref{Dscantokens}
+%%and can be utilized to convert strings to numbers.
+%%\index{Creator comment in PostScript output}%
+Номер версии также включается в комментарий \texttt{Creator} в
+Postscript-выводе.
+%%The version number is also included in the \texttt{Creator} comment in
+%%the PostScript output.
+
+Этот документ представляет язык MetaPost, начиная с простейших для
+использования и наиболее важных для простых приложений свойств.
+%%This document introduces the MetaPost language, beginning with the
+%%features that are easiest to use and most important for simple
+%%applications.
+Чтение руководства не требует знания \MF\ или доступа к {\sl The \MF book},
+но обе возможности будут полезными.
+%%Reading the manual does not require knowledge of \MF\ or
+%%access to {\sl The \MF book}, but both are beneficial.
+Первые несколько разделов описывают язык таким, каким он кажется
+пользователю-новичку с ключевыми параметрами, зафиксированными на
+предопределенных значениях.
+%%The first few sections describe the language as it
+%%appears to the novice user with key parameters at their default values.
+Некоторые свойства, определяемые в этих разделах, --- часть макропакета
+с именем Plain.
+%%Some features described in these sections are part of a predefined macro
+%%package called Plain.
+Следующие разделы охватывают весь язык и отличают примитивы от макросов
+из автоматически загружаемого макропакета Plain\index{макросы Plain}.
+%%Later sections summarize the complete language
+%%and distinguish between primitives and preloaded macros from the Plain
+%%macro package\index{Plain macros}.
+Вследствие того, что большая часть языка идентична \MF\ Кнута, приложение
+дает детальное сравнение таким образом, что опытные пользователи смогут
+узнать больше о MetaPost, читая {\sl The \MF book\/} \cite{kn:c}.
+%%Since much of the language is
+%%identical to Knuth's \MF, the appendix gives a detailed comparison so
+%%that advanced users can learn more about MetaPost by reading {\sl The
+%%\MF book\/} \cite{kn:c}.
+
+Документация к MetaPost дополняется ``Drawing Boxes with MetaPost'' ---
+руководством к пакету \texttt{graph}, изначально разработанному
+Джоном~Д. Хобби.
+%%MetaPost documentation is completed by ``Drawing Boxes with MetaPost''
+%%and ``Drawing Graphs with MetaPost''---the manuals of the \texttt{boxes}
+%%and \texttt{graph} packages originally developed by John~D. Hobby.
+
+Домашняя страница MetaPost --- \url{http://tug.org/metapost}.
+%%The MetaPost home page is \url{http://tug.org/metapost}.
+Она содержит ссылки на много дополнительной информации, включая множество
+статей, которые написаны о MetaPost.
+%%It has links
+%%to much additional information, including many articles that have been
+%%written about MetaPost.
+При поиске подсказки попробуйте рассылку на \url{metapost@tug.org}; вы
+можете подписаться туда на \url{http://tug.org/mailman/listinfo/metapost}.
+%%For general help, try the
+%%\url{metapost@tug.org} mailing list; you can subscribe to this list at
+%%\url{http://tug.org/mailman/listinfo/metapost}.
+
+Текущая разработка размещена на \url{https://foundry.supelec.fr/projects/metapost/}; посетите этот
+сайт для контактов с членами текущей команды разработчиков, загрузки
+исходников и многого другого.
+%%The development is currently hosted at
+%%\url{https://foundry.supelec.fr/projects/metapost/}; visit this site
+%%for the current development team members, sources, and much else.
+
+Пожалуйста, сообщайте об ошибках и требуемых улучшениях в список на
+\url{metapost@tug.org} или через адреса, приведенные выше.
+%%Please report bugs and request enhancements either on the
+%%\url{metapost@tug.org} list, or through the address given above.
+Пожалуйста, не посылайте больше отчеты напрямую Dr.\ Hobby.
+%%(Please do not send reports directly to Dr.\ Hobby any more.)
+
+\section{Базовые команды для рисования}
+%%\section{Basic Drawing Statements}
+\label{basic}
+
+Простейшие команды рисования --- для генерации прямых линий.
+%The simplest drawing statements are the ones that generate straight lines.
+Таким образом\index{draw?\texttt{draw}}\index{-{}-?\texttt{-{}-}},
+%%Thus\index{draw?\texttt{draw}}\index{-{}-?\texttt{-{}-}}
+$$ \hbox{\verb|draw (20,20)--(0,0)|} $$
+рисует\index{draw?\texttt{draw}} диагональную линию и
+%%draws\index{draw?\texttt{draw}} a diagonal line and
+$$ \hbox{\verb|draw (20,20)--(0,0)--(0,30)--(30,0)--(0,0)|} $$
+рисует ломаную линию, подобную этой:
+%%draws a polygonal line like this:
+$$ \includegraphics{manfig-ru-1} $$
+
+\label{Ddrawdot}MetaPost также имеет команду \ttt{drawdot} для печати
+одной точки, например, \ttt{drawdot(30,0)}.
+%%\label{Ddrawdot}MetaPost also has a \ttt{drawdot} command to print a
+%%single point, as in \ttt{drawdot(30,0)}.
+
+Что означается координатами подобными \verb|(30,0)|?
+%%What is meant by coordinates like \verb|(30,0)|?
+MetaPost использует ту же самую типовую систему координат, что и
+PostScript\index{PostScript!система координат}.
+%%MetaPost uses the same
+%%default coordinate system that PostScript\index{PostScript!coordinate
+%%system} does.
+Это значит, что \verb|(30,0)| --- это 30 единиц вправо от начала
+координат, где единица --- это $1\over72$ дюйма.
+%%This
+%%means that \verb|(30,0)| is 30 units to the right of the origin, where a
+%%unit is $1\over72$ of an inch.
+Мы будем ссылаться на эту единицу измерения по-умолчанию как на
+{\sl PostScript-пункт}\index{PostScript!пункт}\index{пункт!PostScript}
+для отличения его от стандартного для принтеров
+пункта\index{пункт!принтера}, который равен $1\over72.27$ дюйма.
+%We shall refer to this default unit as a
+%{\sl PostScript point\/}\index{PostScript!point}\index{point!PostScript}
+%to distinguish it from the standard printer's
+%point\index{point!printer's} which is $1\over72.27$ inches.
+
+MetaPost использует те же имена для единиц измерения, что и \TeX\ и \MF.
+%%MetaPost uses the same names for units of measure that \TeX\ and \MF\
+%%do.
+Таким образом, \verb|bp|\index{bp?\texttt{bp}}\label{Dbp} ссылается на PostScript-пункты (``большие пункты''), а \verb|pt|\index{pt?\texttt{pt}}\label{Dpt} --- на пункты принтера.
+%%Thus \verb|bp|\index{bp?\texttt{bp}}\label{Dbp} refers to
+%%PostScript points (``big points'') and
+%%\verb|pt|\index{pt?\texttt{pt}}\label{Dpt} refers to printer's points.
+Другие единицы измерения включают
+\verb|in|\index{in?\texttt{in}}\label{Din} для дюймов,
+\verb|cm|\index{cm?\texttt{cm}}\label{Dcm} для сантиметров и \verb|mm|\index{mm?\texttt{mm}}\label{Dmm} для миллиметров.
+%%Other units of measure include
+%%\verb|in|\index{in?\texttt{in}}\label{Din} for inches,
+%%\verb|cm|\index{cm?\texttt{cm}}\label{Dcm} for centimeters, and
+%%\verb|mm|\index{mm?\texttt{mm}}\label{Dmm} for millimeters.
+Например,
+%%For example,
+$$ \hbox{\verb|(2cm,2cm)--(0,0)--(0,3cm)--(3cm,0)--(0,0)|} $$
+генерирует больший вариант диаграммы выше.
+%%generates a larger version of the above diagram.
+Будет верно сказать \verb|0| вместо \verb|0cm|, потому что {\tt cm}
+в действительности только множитель преобразования и {\tt 0cm} только
+умножает этот множитель на ноль.
+%%It is OK to say
+%%\verb|0| instead \verb|0cm| because {\tt cm} is really just a conversion
+%%factor and {\tt 0cm} just multiplies the conversion factor by zero.
+(MetaPost понимает конструкции подобные
+{\tt 2cm}\index{умножение, неявное} как сокращение для \verb|2*cm|).
+%%(MetaPost understands constructions like {\tt
+%%2cm}\index{multiplication, implicit} as shorthand for \verb|2*cm|).
+
+Удобно ввести свой собственный масштабирующий множитель, скажем $u$.
+%%It is convenient to introduce your own scale factor, say $u$.
+Затем вы можете определить координаты относительно $u$ и позже решать,
+хотите ли вы начать с \verb|u=1cm| или \verb|u=0.5cm|.
+%%Then you
+%%can define coordinates in terms of $u$ and decide later whether you want
+%%to begin with \verb|u=1cm| or \verb|u=0.5cm|.
+Это даст вам контроль над тем, что масштабируемо и над тем, что нет, т.~к.
+изменение $u$ не повлияет на такие свойства как толщина линий.
+%%This gives you control
+%%over what gets scaled and what does not so that changing $u$ will not
+%%affect features such as line widths.
+
+Есть много путей изменять вид линии сверх простого
+изменения ее толщины, однако механизмы управления шириной вводят
+много общих понятий, которыt нам пока еще не нужны.
+%%There are many ways to affect the appearance of a line besides just
+%%changing its width, so the width-control mechanisms allow a lot of
+%%generality that we do not need yet.
+Соответствующие команды могут странно выглядеть, например,
+команда\index{pickup?\texttt{pickup}}\index{pencircle?\texttt{pencircle}}%
+\index{scaled?\texttt{scaled}}
+%%This leads to the strange looking
+%%statement\index{pickup?\texttt{pickup}}\index{pencircle?\texttt{pencircle}}%
+%%\index{scaled?\texttt{scaled}}
+$$ \hbox{\verb|pickup pencircle scaled 4pt|} $$
+устанавливает толщину линии в 4 пункта для последующей команды \verb|draw|.
+%%for setting the line width for subsequent \verb|draw| statements to 4 points.
+(Это примерно в 8 раз больше стандартной толщины линии).
+%%(This is about eight times the default line width).
+
+С такой большой толщиной даже линия длины ноль выглядит как большая жирная
+точка\index{точки}.
+%%With such a wide line width, even a line of zero length comes out as a big bold
+%%dot\index{dots}.
+Мы можем это использовать для создания решетки из жирных точек, имея одну
+команду \verb|drawdot| для каждого узла решетки.
+%%We can use this to make a grid of bold dots by having one
+%%\verb|drawdot| statement for each grid point.
+Такая повторяющаяся последовательность команд \verb|draw| записывается
+наилучшим образом как пара вложенных циклов:\index{циклы}%
+\index{for?\texttt{for}}\index{endfor?\texttt{endfor}}
+%%Such a repetitive sequence of \verb|draw| statements is
+%%best written as a pair of nested loops:\index{loops}%
+%%\index{for?\texttt{for}}\index{endfor?\texttt{endfor}}
+$$\begin{verbatim}
+for i=0 upto 2:
+ for j=0 upto 2: drawdot (i*u,j*u); endfor
+endfor
+\end{verbatim}
+$$
+Внешний цикл исполняется для $i=0,1,2$, а внутренний --- для $j=0,1,2$.
+%%The outer loop runs for $i=0,1,2$ and the inner loop runs for $j=0,1,2$.
+Результат --- решетка три на три из жирных точек, как показано на
+рис.~\ref{fig1}.
+%%The result is a three-by-three grid of bold dots as shown in Figure~\ref{fig1}.
+Этот рисунок включает также больший вариант ломаной линии, которую мы
+видели раньше.
+%%The figure also includes a larger version of the polygonal line diagram that we
+%%saw before.
+
+\begin{figure}[htp]
+$$ \begin{verbatim}
+beginfig(2);
+u=1cm;
+draw (2u,2u)--(0,0)--(0,3u)--(3u,0)--(0,0);
+pickup pencircle scaled 4pt;
+for i=0 upto 2:
+ for j=0 upto 2: drawdot (i*u,j*u); endfor
+endfor
+endfig;
+\end{verbatim}
+\quad \mathcenter{\includegraphics{manfig-ru-2}}
+$$
+\caption{Команды MetaPost и результирующий вывод}
+%%\caption{MetaPost commands and the resulting output}
+\label{fig1}
+\end{figure}
+
+Заметьте, что программа на рис.~\ref{fig1} начинается с
+\verb|beginfig(2)|\index{beginfig?\texttt{beginfig}} и заканчивается с
+\verb|endfig|\index{endfig?\texttt{endfig}}.
+%%Note that the program in Figure~\ref{fig1} starts with
+%%\verb|beginfig(2)|\index{beginfig?\texttt{beginfig}} and ends with
+%%\verb|endfig|\index{endfig?\texttt{endfig}}.
+Эти макросы, выполняющие административные функции, гарантируют, что
+результаты всех команд \verb|draw| собираются вместе и транслируются в
+PostScript.
+%%These are macros that
+%%perform various administrative functions and ensure that the results of
+%%all the \verb|draw| statements get packaged up and translated into
+%%PostScript.
+Входной файл для MetaPost обычно содержит последовательность пар
+\verb|beginfig| и \verb|endfig| с командой {\tt end}\index{end?\texttt{end}}
+после последней пары.
+%%A MetaPost input file normally contains a sequence of
+%%\verb|beginfig|, \verb|endfig| pairs with an {\tt
+%%end}\index{end?\texttt{end}} statement after the last one.
+Если этот файл именован {\tt fig.mp}, то вывод от команд \verb|draw|
+между \verb|beginfig(1)| и следующей \verb|endfig| пишется в файл
+{\tt fig.1}\index{файлы!вывод}.
+%%If this file
+%%is named {\tt fig.mp}, the output from \verb|draw| statements between
+%%\verb|beginfig(1)| and the next \verb|endfig| is written in a file {\tt
+%%fig.1}\index{files!output}.
+Другими словами, числовой аргумент в макросе \verb|beginfig| определяет
+имя соответствующего выходного файла.
+%%In other words, the numeric argument to the
+%%\verb|beginfig| macro determines the name of the corresponding output
+%%file.
+
+Что делать со всеми этими PostScript-файлами?
+%%What does one do with all the PostScript files?
+Они могут быть включены как рисунки в документы \TeX\index{TeX?\TeX} или
+troff\index{troff}, если вы имеете драйвер, который может работать с
+PostScript-картинками.
+%%They can be included as
+%%figures in a \TeX\index{TeX?\TeX} or troff\index{troff} document if you
+%%have an output driver that can handle encapsulated PostScript figures.
+Они также могут быть предварительно просмотрены до их включения в документ
+с тысячей страниц.
+%%They can also be previewed before they are included in a thousand pages
+%%document.
+Следующие разделы дают больше информации.
+%%The next sections give some more information.
+
+\section{Управление выводом MetaPost}
+%%\section{Handling MetaPost output}
+\label{Dmpoutput}
+
+Взаимодействие между \TeX\ и MetaPost может быть двояким.
+%%There can be a two-fold interaction between \TeX\ and MetaPost.
+С одной стороны, графика MetaPost может импортироваться в документы,
+набираемые \TeX\ и его друзьями.
+%%On one
+%%hand, MetaPost graphics can be imported into documents typeset by \TeX\
+%%and friends.
+С другой стороны, MetaPost может поручить набор текстовых элементов \TeX,
+\LaTeX\ или \emph{troff}, например, текстовых меток или математических
+формул в графике.
+%%On the other hand, MetaPost can delegate typesetting
+%%textual elements to \TeX, \LaTeX\ or \emph{troff}, e.g., text labels or
+%%mathematical formulas in a graphic.
+Таким способом графика MetaPost может легко принять стиль документа
+(шрифт, размер шрифта и т.~п.) и соответствовать качеству его набора
+(использовать кернинг, лигатуры и т.~п.).
+%%That way, MetaPost graphics can
+%%easily adopt the style of a document (type, type size, etc.) and fit its
+%%typesetting quality (use kerning, ligatures, etc.)
+Это делает MetaPost идеальным инструментом для приготовления высококачественной
+графики для документов \TeX\ или \emph{troff}.
+%%This makes MetaPost
+%%an ideal tool for preparing high-quality graphics for \TeX\ or
+%%\emph{troff} documents.
+
+Этот раздел относится к первой стороне взаимодействия \TeX--MetaPost:
+импорту графики MetaPost в \TeX\ и его друзей.
+%%This section deals with the first aspect of \TeX--MetaPost interaction,
+%%the import of MetaPost graphics into \TeX\ and friends.
+Набор текстов в MetaPost обсуждается в разделе~\ref{text}.
+%%Typesetting
+%%text in MetaPost is discussed in section~\ref{text}.
+
+\subsection{Предварительный просмотр графики MetaPost}
+%%\subsection{Previewing MetaPost graphics}
+
+\label{Dpreview}
+\index{предпросмотр}
+%%\index{previewing}
+
+Вывод MetaPost --- это вариант PostScript, называемый Encapsulated
+PostScript\index{PostScript!структурный} (EPSF\index{EPSF}).
+%%The output of MetaPost is a variant of PostScript, called Encapsulated
+%%PostScript\index{PostScript!structured} (EPSF\index{EPSF}).
+Графика MetaPost может, следовательно, быть просмотрена в любом
+PostScript-просмотрщике, например, GSview\index{GSview}.
+%%MetaPost
+%%graphics can therefore be previewed with any decent PostScript viewer,
+%%e.\,g., GSview\index{GSview}.
+
+Ситуация становится только немного сложнее, когда вывод MetaPost содержит
+текст.
+%%The situation becomes only a little bit fussy when MetaPost output
+%%contains text.
+Обычно MetaPost не производит самодостаточные EPS-файлы, например,
+шрифты и таблицы кодировок не помещаются в вывод.
+%%By default, MetaPost doesn't produce self-contained EPS
+%%files, e.\,g., font resources and encoding vectors are not stored in
+%%the output.
+Поэтому вывод MetaPost, содержащий текст, может быть показан с неверными
+шрифтами, неверными символами или вообще без текста в
+PostScript-просмотрщике.
+%%For that reason MetaPost output containing text may be
+%%rendered with wrong fonts, wrong glyphs or with no text at all in a
+%%PostScript viewer.
+Долгое время, наиболее надежный путь для просмотра был в подготовке
+тест-документа, включающего все картинки MetaPost, обработке его либо
+\TeX, либо \LaTeX, затем \ttindex{dvips} и показу результирующего
+\ttt{ps}-файла в PostScript-просмотрщике.\footnote{Хотя есть и
+альтернативы: \ttindex{mpstoeps} --- это Perl-сценарий, который
+автоматизирует процесс, обозначенный выше, а
+\ttindex{mptopdf} --- это другое средство, которое конвертирует
+MetaPost-файлы в PDF.}
+%%For a long time, the most reliable way for
+%%previewing was to prepare a test document that includes all MetaPost
+%%figures, process that with \TeX\ or \LaTeX\ and \ttindex{dvips} and
+%%display the resulting \ttt{ps} file in a PostScript
+%%viewer.\footnote{There are alternatives, though. \ttindex{mpstoeps} is
+%%a Perl script that automates the process outlined above.
+%%\ttindex{mptopdf} is another tools that converts MetaPost files to
+%%PDF.}
+
+Однако, с версии 1.000 MetaPost ситуация изменилась. С этой версии
+MetaPost способен производить самодостаточные файлы EPS, которые
+могут быть достоверно просмотрены в независимости от того, есть ли в них
+текст или нет.
+%%However, with MetaPost version~1.000 the situation changed. Since that
+%%version MetaPost is able to produce self-contained EPS files, that can
+%%reliably be previewed, may they contain text or not.
+Новые возможности могут быть включены установкой внутренней переменной
+MetaPost \ttt{prologues}\index{prologues?\texttt{prologues}} в~3.
+%%The
+%%new behaviour can be triggered by setting MetaPost's internal variable
+%%\ttt{prologues}\index{prologues?\texttt{prologues}} to~3.
+Смотри раздел~\ref{Dbtex} для большей информации о \ttt{prologues}.
+%%See
+%%section~\ref{Dbtex} for more information on \ttt{prologues}.
+
+\subsection{Использование графики MetaPost в \TeX, \LaTeX, pdf\LaTeX, pdf\TeX, Con\TeX{}t и troff}
+%\subsection{Using MetaPost graphics in \TeX, \LaTeX, pdf\LaTeX, pdf\TeX, Con\TeX{}t and troff}
+\label{Dteximport}
+\index{TeX?\TeX!импорт файлов MetaPost}
+\index{LaTeX?\LaTeX!импорт файлов MetaPost}
+\index{pdfLaTeX?pdf\LaTeX!импорт файлов MetaPost}
+\index{pdfTeX?pdf\TeX!импорт файлов MetaPost}
+\index{ConTeXt?Con\TeX t!импорт файлов MetaPost}
+\index{troff!импорт файлов MetaPost}
+%%\index{TeX?\TeX!importing MetaPost files}
+%%\index{LaTeX?\LaTeX!importing MetaPost files}
+%%\index{pdfLaTeX?pdf\LaTeX!importing MetaPost files}
+%%\index{pdfTeX?pdf\TeX!importing MetaPost files}
+%%\index{ConTeXt?Con\TeX t!importing MetaPost files}
+%%\index{troff!importing MetaPost files}
+
+То как рисунки MetaPost могут быть интегрированы с документами,
+подготовленными в \TeX\ и родственных \TeX\ программах, зависит от
+формата документов и драйвера вывода.
+%%How MetaPost figures can be integrated into documents prepared with
+%%\TeX\ and friends depends on the exact format and output driver.
+Рис.~\ref{fig0} показывает процесс работы для plain \TeX, \LaTeX\ и
+свободно доступной программы \ttindex{dvips}\footnote{Исходники на C для
+\ttt{dvips} находятся вместе с web2c \TeX-дистрибутивом. Подобные
+программы доступны и в других местах.}.
+%%Figure~\ref{fig0} shows the workflow for plain \TeX, \LaTeX\ and the
+%%freely available program \ttindex{dvips}.\footnote{The C source for
+%%\ttt{dvips} comes with the web2c \TeX\ distribution. Similar programs
+%%are available from other sources.}
+Схожая процедура работает с troff: процессор вывода \ttt{grops} включает рисунки на PostScript, когда они запрашиваются через команду troff
+\ttt{\string\X}.
+%%A similar procedure works with
+%%troff: the \ttt{grops} output processor includes PostScript figures when
+%%they are requested via troff's \ttt{\string\X} command.
+С использованием PDF с \TeX\ и \LaTeX\ ситуация несколько иная.
+%%For the PDF
+%%flavour of \TeX\ and \LaTeX\ the situation is a little bit different.
+Следующие абзацы дают краткую информацию по некоторым популярным
+\TeX-форматам и драйверам вывода.
+%%The next paragraphs give brief information on some popular \TeX\ formats
+%%and output drivers.
+
+\begin{figure}[htp]
+$$ \includegraphics{manfig-ru-0} $$
+\caption[Диаграмма обработки для документа с рисунками MetaPost]
+ {Диаграмма обработки для \TeX-документа с рисунками в MetaPost}
+%%\caption[A diagram of the processing for a document with MetaPost figures]
+%% {A diagram of the processing for a \TeX\ document with figures
+%% in MetaPost}
+\label{fig0}
+\end{figure}
+
+\paragraph{\TeX}
+Пользователи \TeX\ могут импортировать графику, загрузив сначала пакет
+\ttt{epsf}\index{epsf.tex?\texttt{epsf.tex}} через \verb+\input epsf+ и
+затем введя команду
+$$ \verb+\epsfbox{+\descr{имя файла}\verb+}+ $$%
+\index{epsfbox?\texttt{\string\epsfbox}}
+для загрузки EPS-файла, например, \verb+\epsfbox{fig.1}+.
+%%\TeX\ users can import EPS graphics by first loading package
+%%\ttt{epsf}\index{epsf.tex?\texttt{epsf.tex}} via \verb+\input epsf+ and
+%%then issuing the command
+%%$$ \verb+\epsfbox{+\descr{filename}\verb+}+ $$%
+%%\index{epsfbox?\texttt{\string\epsfbox}}
+%%to load an EPS file, e.\,g., \verb+\epsfbox{fig.1}+.
+
+\paragraph{\LaTeX}
+Для документов \LaTeX\ процедура похожая: первый пакет
+\ttindex{graphicx} должен быть загружен размещением
+\verb+\usepackage{graphicx}+ в преамбулу документа и затем
+EPS-файлы могут быть загружены через
+$$ \verb+\includegraphics{+\descr{имя файла}\verb+}+, $$%
+\index{includegraphics?\texttt{\string\includegraphics}}%
+например, \verb+\includegraphics{fig.1}+.
+%%For \LaTeX\ documents the procedure is similar: first package
+%%\ttindex{graphicx} has to be loaded by putting
+%%\verb+\usepackage{graphicx}+ into the document preamble and then EPS
+%%files can be loaded via
+%%$$ \verb+\includegraphics{+\descr{filename}\verb+}+ $$%
+%%e.\,g., \verb+\includegraphics{fig.1}+.
+
+Как можно заметить на рис.~\ref{fig0} графические файлы никогда не
+включаются при исполнении \TeX\index{TeX?\TeX!импорт файлов MetaPost} или
+\LaTeX\index{LaTeX?\LaTeX!импорт файлов MetaPost}.
+%%As can be seen in figure~\ref{fig0} graphic files are never included in a
+%%\TeX\index{TeX?\TeX!importing MetaPost files} or
+%%\LaTeX\index{LaTeX?\LaTeX!importing MetaPost files} run.
+Вместо этого \TeX\ и \LaTeX\ только читают информацию об охватывающих
+рамках из PostScript-файла, резервируя столько места на странице, сколько
+занимает графика и записывая ссылку на соответствующий файл в
+\ttt{dvi}-выводе.
+%%Instead,
+%%\TeX\ and \LaTeX\ only read bounding box information off the PostScript
+%%file, reserve as much space on a page as the graphic
+%%occupies and write a reference to the corresponding file into the
+%%\ttt{dvi} output.
+Графический файл включается только при последующем исполнении драйвера
+вывода, который может обрабатывать PostScript-файлы,
+например, \ttindex{dvips}.
+%%The graphic file is only included in the subsequent
+%%run of an output driver, that can handle PostScript files, e.\,g.,
+%%\ttindex{dvips}.
+
+\paragraph{pdf\LaTeX}
+Приложение pdf\LaTeX, когда исполняется в режиме PDF, является сразу и
+\LaTeX-интерпретатором, и драйвером вывода для документа в PDF-формат.
+%%The application pdf\LaTeX, when run in PDF mode, is both, a
+%%\LaTeX\ interpreter and an output driver for the PDF document format.
+Поэтому графические файлы включаются во время исполнения pdf\LaTeX, за
+один проход.
+%%For that reason graphic files are included in a single
+%%pdf\LaTeX\ run.
+В отличие от \ttt{dvips}, pdf\LaTeX\ не может обрабатывать обычные
+PostScript-файлы --- он может работать только с так называемыми очищенными
+EPS\index{PostScript!очищенный}-файлами, которые могут использовать только
+ограниченное множество возможностей языка PostScript.
+%%In contrast to \ttt{dvips}, pdf\LaTeX\ can't process
+%%general PostScript files, but only so-called purified
+%%EPS\index{PostScript!purified} files, which may only use a restricted
+%%set of PostScript language features.
+К счастью, вывод MetaPost --- это и \emph{есть} очищенный EPS, так что тут
+нам повезло.
+%%Fortunately, MetaPost output
+%%\emph{is} purified EPS, so we are in luck.
+Из того, что \ttt{mps}\index{файлы!mps?\texttt{mps}} --- это
+типовое расширение pdf\LaTeX\ для очищенных EPS-файлов, а вывод
+MetaPost обычно имеет расширения-числа, мы должны
+%%Since
+%%pdf\LaTeX's default extension for purified EPS files is
+%%\ttt{mps}\index{files!mps?\texttt{mps}}, but MetaPost output by
+%%default has a number as extensions, we either have to
+\begin{itemize}
+\item сказать pdf\LaTeX\ обрабатывать занумерованные файлы MetaPost
+согласно правилам для файлов \ttt{mps} или
+%%\item tell pdf\LaTeX\ to handle MetaPost's numbered files according to
+%%\ttt{mps} file rules, or
+\item изменить расширение файла вывода MetaPost на \ttt{mps}.
+%%\item change the file extension of MetaPost output to \ttt{mps}.
+\end{itemize}
+
+При первом подходе мы должны добавить строку
+%%For the conventional first approach we have to add the line
+$$ \verb+\DeclareGraphicsRule{*}{mps}{*}{}+ $$%
+\index{DeclareGraphicsRule?\texttt{\string\DeclareGraphicsRule}}%
+к преамбуле документа после загрузки пакета \ttt{graphicx}.
+%%to the document preamble after loading package \ttt{graphicx}.
+Эта декларация скажет pdf\LaTeX\ загружать \emph{все} файлы с
+неизвестным расширением как \ttt{mps}-файлы.
+%%That
+%%declaration tells pdf\LaTeX\ to load \emph{all} files with unknown file
+%%extensions as \ttt{mps} files.
+См. документацию по пакетам \ttt{graphicx} и \ttt{graphics} для
+дополнительной информации.
+%%Refer to the documentation of the
+%%\ttt{graphicx} and \ttt{graphics} packages for more details.
+
+С версии MetaPost 1.000 рекомендован второй подход.\footnote{Для обработки
+расширений MetaPost-файлов предположительно более естественно вместо
+\LaTeX-исходников использовать исходники MetaPost.
+Тем более, что установка расширения MetaPost-файла в \ttt{mps} предохраняет
+от загрязнения избытком расширений --- вам будет нужно зарегистрировать только
+одно расширение для вашего PostScript-просмотрщика --- \ttt{.mps}, вместо \ttt{.0}, \ttt{.1},
+\ttt{.2} и т.~д.}
+%%Since MetaPost version~1.000 the second approach is
+%%recommended.\footnote{For handling MetaPost file extensions in MetaPost
+%%source files seems to be the more natural place than \LaTeX\ sources.
+%%Moreover, setting the MetaPost file extension to \ttt{mps} prevents from
+%%file extension pollution and you only have to register one new extension
+%%with your PostScript viewer, \ttt{.mps}, instead of \ttt{.0}, \ttt{.1},
+%%\ttt{.2}, etc.}
+Примитив MetaPost \verb+filenametemplate+ может быть использован для
+установки расширения файла вывода MetaPost в \ttt{mps} (см.
+раздел~\ref{Dfilenametemplate})
+%%The MetaPost primitive \verb+filenametemplate+ can be
+%%used to set the file extension of MetaPost output to \ttt{mps} (see
+%%section~\ref{Dfilenametemplate}).
+Поэтому декларация \verb+\DeclareGraphicsRule+ здесь не нужна.
+%%Hence, no \verb+\DeclareGraphicsRule+
+%%declaration is needed.
+Более того, расширение может опускаться в команде \verb+\includegraphics+.
+%%Moreover, the file extension can then be omitted
+%%in the \verb+\includegraphics+ command.
+
+\paragraph{\LaTeX\ и pdf\LaTeX}
+Если вы хотите сохранить гибкость и возможность компилировать как \LaTeX,
+так и pdf\LaTeX, то нужно позаботиться о некоторых вещах.
+%%If you want to keep flexible and be able to compile your documents with
+%%both, \LaTeX\ and pdf\LaTeX, there are some things to take care of.
+Стандартная декларация \verb+\DeclareGraphicsRule+ может быть активирована
+только, если pdf\LaTeX\ исполняется в PDF-режиме.
+%%If
+%%you're using the conventional \verb+\DeclareGraphicsRule+ declaration,
+%%that may only be activated if pdf\LaTeX\ runs in PDF mode.
+Поэтому универсальная декларация должна выглядеть подобно этой:
+%%A fully-featured declaration should therefore look like this:
+
+$$
+\begin{verbatim}
+\usepackage{graphicx}
+\usepackage{ifpdf}
+\ifpdf
+ \DeclareGraphicsRule{*}{mps}{*}{}
+\fi
+\end{verbatim}
+$$
+
+Если вы используете метод \ttt{filenametemplate}, то расширение файла
+\ttt{mps} не следует опускать в команде \verb+\includegraphics+, т.~к.
+\ttt{mps} --- это не часть имени \LaTeX-файла, заполняемая по-умолчанию.
+%%If you're using the \ttt{filenametemplate} method the \ttt{mps} file
+%%extension should not be omitted in \verb+\includegraphics+ commands,
+%%since \ttt{mps} is not part of \LaTeX's file name completion scheme, by
+%%default.
+Если расширение \ttt{mps} присутствует, то \LaTeX\ обрабатывает эти
+файлы как \ttt{eps}-файлы, что очевидно является корректным.
+%%If the \ttt{mps} extension is present, \LaTeX\ handles those
+%%files as \ttt{eps} files, which is obviously correct.
+Для дополнительной информации см. описание \verb+\DeclareGraphicsExtensions+%
+\index{DeclareGraphicsExtensions?\texttt{\string\DeclareGraphicsExtensions}}
+и \verb+\DeclareGraphicsRule+ в документации пакетов \ttt{graphicx} и
+\ttt{graphics}.
+%%For more
+%%information see the description of \verb+\DeclareGraphicsExtensions+%
+%%\index{DeclareGraphicsExtensions?\texttt{\string\DeclareGraphicsExtensions}}
+%%and \verb+\DeclareGraphicsRule+ in the documentation of packages
+%%\ttt{graphicx} and \ttt{graphics}.
+
+\paragraph{pdf\TeX}
+Пользователи plain pdf\TeX\ должны ознакомиться с отдельной программой
+\ttindex{mptopdf}, которую можно найти в
+\url{http://context.aanhet.net/mptopdf.htm}.
+%%Users of plain pdf\TeX\ should refer to the standalone macros of the
+%%\ttindex{mptopdf} bundle, that can be found at
+%%\url{http://context.aanhet.net/mptopdf.htm}.
+
+\paragraph{Con\TeX t}
+В Con\TeX t\index{ConTeXt?Con\TeX t} поддержка MetaPost интегрирована в
+ядро.
+%%In Con\TeX t\index{ConTeXt?Con\TeX t} support of MetaPost is integrated
+%%in the kernel.
+Отдельно от встроенной графики (см. руководство по MetaFun\index{MetaFun})
+можно также встраивать графику извне командой
+\verb+\externalfigure+%
+\index{externalfigure?\texttt{\string\externalfigure}}.
+%%Apart from inline graphics (see MetaFun\index{MetaFun}
+%%manual), one can embed graphics explictely with the
+%%\verb+\externalfigure+%
+%%\index{externalfigure?\texttt{\string\externalfigure}} command.
+Занумерованные файлы распознаются автоматически, как графика с
+\ttt{mps}-расширением.
+%%Numbered graphics are recognized automatically, as are graphics with the
+%%\ttt{mps} suffix.
+Специальные свойства, такие как затенение, прозрачность, включение рисунков,
+цветовое пространство и подобные обрабатываются автоматически.
+%%Special features like shading, transparency, image
+%%inclusion, color spaces and such are handled automatically.
+Практически пользователи Con\TeX t будут вероятно определять графику
+MetaPost в документе-исходнике, который использует некоторые новшества,
+например, более естественный интерфейс со свойствами документа, поддержка
+шрифтов и автоматическая обработка.
+%%In practice
+%%Con\TeX t users will probably define MetaPost graphics in the document
+%%source which has some advantages, like a more natural interfacing with
+%%document properties, font support, and automatic processing.
+Поддержка включений MetaPost представлена в версиях MkII и MkIV, но
+используемые методы слегка различаются.
+%%Support
+%%for MetaPost inclusion is present in the versions MkII as well as MkIV,
+%%but the used methods are slightly different.
+Будущие версии MkIV будут поддерживать даже более тесную интеграцию.
+%%Future versions of MkIV
+%%will support an even more tight integration.
+
+\paragraph{troff}
+Также возможно включать вывод MetaPost в GNU
+\emph{troff}-документ.
+%%It is also possible to include MetaPost output in a GNU \emph{troff}
+%%document.
+Макропакет \ttt{-mpspic}\index{mpspic?\texttt{-mpspic}} определяет команду \verb|.PSPIC|\index{PSPIC?\texttt{.PSPIC}}, которая включает EPS-файл.
+%%The \ttt{-mpspic}\index{mpspic?\texttt{-mpspic}} macro
+%%package defines a command \verb|.PSPIC|\index{PSPIC?\texttt{.PSPIC}}
+%%that includes an encapsulated PostScript file.
+Например, команда \emph{troff}
+%%For instance, the \emph{troff} command
+$$ \hbox{\verb|.PSPIC fig.1|} $$
+включает \ttt{fig.1}, используя заданные в файле охватывающей рамкой естественные высоту и ширину образа.
+%%includes \ttt{fig.1}, using the natural height and width of the
+%%image as given in the file's bounding box.
+
+\subsection{Шаблоны имен файлов}
+%%\subsection{File name templates}
+\suppressfloats[t]
+
+MetaPost поддерживает шаблоны для выходных файлов.
+%%MetaPost has support for output file name templates.
+Эти шаблоны используют стиль \ttt{printf} escape-последовательностей
+и пересчитываются перед тем, как рисунок записывается на диск
+%%These templates
+%%use \ttt{printf}-style escape sequences and are re-evaluated before
+%%each figure is written to disk.
+
+Здесь используется команда \ttt{filenametemplate}%
+\index{filenametemplate?\texttt{filenametemplate}}\label{Dfilenametemplate},
+которая воспринимает строку-аргумент.
+%%The command to use is \ttt{filenametemplate}%
+%%\index{filenametemplate?\texttt{filenametemplate}}\label{Dfilenametemplate},
+%%and it accepts a string as argument.
+Ее несложный синтаксис:
+%%The syntax is as simple as:
+
+\begin{center}\begin{tabular}{l}
+\verb|filenametemplate "%j-%3c.mps";|\\
+\verb|beginfig(1);|\\
+\verb| draw p;|\\
+\verb|endfig;|
+\end{tabular}\end{center}
+
+Если исходный файл сохранялся как \ttt{fig.mp}, то будет создан выходной файл
+\ttt{fig-001.mps} вместо \ttt{fig.1}.
+%%If the file is saved as \ttt{fig.mp}, then this will create the output
+%%file \ttt{fig-001.mps} instead of \ttt{fig.1}.
+Маленькое множество возможных escape-последовательностей см. в
+таблице~\ref{tab:fntmpl}.
+%%A small set of escape
+%%sequences are possible, see table~\ref{tab:fntmpl} for details.
+
+\def\d{$\langle$0-9$\rangle$}
+
+\begin{table}
+\centering
+\begin{tabular}{|>{\ttfamily}l|l|}
+\hline
+\multicolumn1{|c|}{Escape-последовательность} & \multicolumn1{c|}{Смысл}\\\hline
+%%\multicolumn1{|c|}{Escape sequence} & \multicolumn1{c|}{Meaning}\\\hline
+\%\% & Знак процента \\
+%%\%\% & A percent sign \\
+\%\,j & Имя текущей работы\\
+%%\%\,j & The current jobname\\
+\%\d c & Значение {\tt charcode}\\
+%%\%\d c & The charcode value\\
+\%\d y & Текущий год\\
+%%\%\d y & The current year\\
+\%\d m & Номер месяца\\
+%%\%\d m & The numeric month\\
+\%\d d & День месяца\\
+%%\%\d d & The day of the month\\
+\%\d H & Час\\
+%%\%\d H & The hour\\
+\%\d M & Минута\\
+%%\%\d M & The minute\\
+\hline
+\end{tabular}
+\caption{Разрешенные escape-последовательности для \ttt{filenametemplate}}
+%%\caption{Allowed escape sequences for \ttt{filenametemplate}}
+\label{tab:fntmpl}
+\end{table}
+
+Примитив \ttt{filenametemplate} может быть также полезным для именования
+графических файлов индивидуально и еще для хранения всех
+MetaPost-исходников в одном файле.
+%%The \ttt{filenametemplate} primitive can also be helpful for naming
+%%graphic files individually, yet keeping all MetaPost sources in one file.
+Например, соберем исходники разных диаграмм в один файл \ttt{fig.mp}
+%%E.\,g., collecting different diagram sources in a file \ttt{fig.mp}
+$$
+\begin{verbatim}
+filenametemplate "fig-quality.mps";
+beginfig(1);
+ ...
+endfig;
+
+filenametemplate "fig-cost-vs-productivity.mps";
+beginfig(2);
+ ...
+endfig;
+\end{verbatim}
+$$
+--- может оказаться проще вспомнить правильное имя диаграммы в документе
+\TeX, чем нумерованное имя файла.
+%%it might be easier to recall the correct diagram names in a
+%%\TeX\ document than with numbered file names.
+Заметьте, что аргумент \ttt{beginfig} не используется при отсутствии
+образца \ttt{\%c} в строке шаблона имени файла.
+%%Note, the argument to
+%%\ttt{beginfig} is not relevant as long as there's no \ttt{\%c} pattern
+%%in the file name template string.
+
+Для обеспечения совместимости со старыми файлами начальное значение
+\ttt{filenametemplate} устанавливается в \verb|%j.%c|.
+%%To ensure compatibility with older files, the default value of
+%%\ttt{filenametemplate} is \verb|%j.%c|.
+Если вы присвоите пустую строку, то это будет означать возврат к
+начальному значению.
+%%If you assign an empty string, it will revert to that default.
+
+\section{Кривые}
+%%\section{Curves}
+\label{curves}
+
+MetaPost совершенно счастлив при рисовании как кривых, так и прямых линий.
+%%MetaPost is perfectly happy to draw curved lines as well as straight ones.
+Команда \verb|draw| с разделенными
+\verb|..|\index{..?\texttt{..}} аргументами-точками рисует плавную
+кривую через эти точки.
+%%A \verb|draw| statement with the points separated by
+%%\verb|..|\index{..?\texttt{..}} draws a smooth curve through the points.
+Например, посмотрите на результат
+%%For example consider the result of
+$$ \hbox{\verb|draw z0..z1..z2..z3..z4|} $$
+после определения пяти точек таким образом:
+%%after defining five points as follows:
+$$\begin{verbatim}
+z0 = (0,0); z1 = (60,40);
+z2 = (40,90); z3 = (10,70);
+z4 = (30,50);
+\end{verbatim}
+$$
+Рис.~\ref{fig2} показывает кривую через точки, помеченные от \verb|z0|
+до \verb|z4|
+%%Figure~\ref{fig2} shows the curve with points \verb|z0| through \verb|z4|
+%%labeled.
+
+\begin{figure}[htp]
+$$ \includegraphics{manfig-ru-3}
+$$
+\caption[Кривая через точки 0, 1, 2, 3 и 4]
+ {Результат {\tt draw z0..z1..z2..z3..z4}}
+%%\caption[A curve through points 0, 1, 2, 3, and 4]
+% {The result of {\tt draw z0..z1..z2..z3..z4}}
+\label{fig2}
+\end{figure}
+
+Есть много других способов нарисовать путь через те же самые пять точек.
+%%There are many other ways to draw a curved path through the same five
+%%points.
+Для получения гладкой замкнутой кривой соедините \verb|z4| с началом
+добавлением \verb|..cycle|\index{cycle?\texttt{cycle}} к команде
+\verb|draw| как показано на рис.~\ref{fig3}a.
+%%To make a smooth closed curve, connect \verb|z4| back to the
+%%beginning by appending \verb|..cycle|\index{cycle?\texttt{cycle}} to the
+%%\verb|draw| statement as shown in Figure~\ref{fig3}a.
+Также возможно в одной команде \verb|draw| смешивать кривые и прямые
+линии как показано на рис.~\ref{fig3}b.
+%%It is also
+%%possible in a single \verb|draw| statement to mix curves and straight
+%%lines as shown in Figure~\ref{fig3}b.
+Просто используйте \verb|--| там, где вы хотите прямые линии, и \verb|..|
+там, где вы хотите кривые.
+%%Just use \verb|--| where you want
+%%straight lines and \verb|..| where you want curves.
+Таким образом,
+%%Thus
+$$ \hbox{\verb|draw z0..z1..z2..z3--z4--cycle|} $$
+произведет кривую через точки 0,~1, 2 и~3, затем ломаную линию из точки~3
+в точку~4 и обратно в точку~0.
+%%produces a curve through points 0,~1, 2, and~3, then a polygonal line from
+%%point~3 to point~4 and back to point~0.
+Результат будет точно таким же как после двух команд рисования
+%%The result is essentially the same
+%%as having two draw statements
+\begin{eqnarray*}
+ \hbox{\verb|draw z0..z1..z2..z3|}\\
+\noalign{\hbox{и}}
+%%\noalign{\hbox{and}}
+ \hbox{\verb|draw z3--z4--z0|}
+\end{eqnarray*}
+
+\begin{figure}[htp]
+$$ {\includegraphics{manfig-ru-104} \atop (a)}
+ \qquad {\includegraphics{manfig-ru-204} \atop (b)}
+$$
+\caption[Замкнутая кривая через пять точек]
+ {(a)~Результат {\tt draw z0..\linebreak[0]z1..\linebreak[0]%
+ z2..\linebreak[0]z3..\linebreak[0]z4..\linebreak[0]cycle};
+ (b)~Результат {\tt draw z0..\linebreak[0]z1..\linebreak[0]%
+ z2..\linebreak[0]z3--\linebreak[0]z4--\linebreak[0]cycle}.}
+%%\caption[Closed curves through five points]
+%% {(a)~The result of {\tt draw z0..\linebreak[0]z1..\linebreak[0]%
+%% z2..\linebreak[0]z3..\linebreak[0]z4..\linebreak[0]cycle};
+%% (b)~the result of {\tt draw z0..\linebreak[0]z1..\linebreak[0]%
+%% z2..\linebreak[0]z3--\linebreak[0]z4--\linebreak[0]cycle}.}
+\label{fig3}
+\end{figure}
+
+\subsection{Кубические кривые Безье}
+%%\subsection{B\'ezier Cubic Curves}
+
+Когда MetaPost просят нарисовать гладкую кривую через последовательность
+точек, он конструирует кусочную кубическую кривую с непрерывным уклоном и
+с приблизительно непрерывной кривизной\index{кривизна}.
+%%When MetaPost is asked to draw a smooth curve through a sequence of
+%%points, it constructs a piecewise cubic curve with continuous slope and
+%%approximately continuous curvature\index{curvature}.
+Это значит, что спецификация пути такая как
+%%This means that a
+%%path specification such as
+$$ \hbox{\verb|z0..z1..z2..z3..z4..z5|} $$
+дает в результате кривую, что может быть определена
+параметрически\index{параметризация} как $(X(t),Y(t))$ для
+$0\leqslant t\leqslant5$, где $X(t)$ и $Y(t)$ --- кусочные кубические функции.
+%%results in a curve that can be defined parametrically\index{parameterization}
+%%as $(X(t),Y(t))$ for
+%%$0\le t\le5$, where $X(t)$ and $Y(t)$ are piecewise cubic functions.
+Таким образом существуют различные пары кубических функций для каждого ограниченного
+целыми числами интервала для $t$.
+%%That is,
+%%there is a different pair of cubic functions for each integer-bounded
+%%$t$-interval.
+Если ${\tt z0}=(x_0,y_0)$, ${\tt z1}=(x_1,y_1)$,
+${\tt z2}=(x_2,y_2)$, \ldots, то MetaPost выбирает
+контрольные\index{управляющие точки} точки Безье
+%%If ${\tt z0}=(x_0,y_0)$, ${\tt z1}=(x_1,y_1)$,
+%%${\tt z2}=(x_2,y_2)$, \ldots, MetaPost selects
+%%B\'ezier control\index{control points} points
+$(x_0^+,y_0^+)$, $(x_1^-,y_1^-)$, $(x_1^+,y_1^+)$, \ldots,
+где
+%%where
+\begin{eqnarray*}
+ X(t+i) &=& (1-t)^3x_i + 3t(1-t)^2x_i^+ + 3t^2(1-t)x_{i+1}^- + t^3x_{i+1},\\
+ Y(t+i) &=& (1-t)^3y_i + 3t(1-t)^2y_i^+ + 3t^2(1-t)y_{i+1}^- + t^3y_{i+1}
+\end{eqnarray*}
+для
+%%for
+$0\le t\le1$.
+Точные правила для выбора контрольных точек Безье приведены в \cite{ho:splin}
+и в {\sl \MF book\/}~\cite{kn:c}.
+%%The precise rules for choosing the B\'ezier control points
+%%are described in \cite{ho:splin} and in {\sl The \MF book\/}~\cite{kn:c}.
+
+Для того, чтобы путь имел непрерывный уклон в $(x_i,y_i)$ входящее и
+исходящее направления в $(X(i),Y(i))$ должны соответствовать.
+%%In order for the path to have a continuous slope at $(x_i,y_i)$, the incoming
+%%and outgoing directions at $(X(i),Y(i))$ must match.
+Таким образом, вектора
+%%Thus the vectors
+$$ (x_i-x_i^-,\,y_i-y_i^-) \qquad
+\hbox{и}
+%%\hbox{and}
+ \qquad (x_i^+-x_i,\,y_i^+-y_i)
+$$
+должны иметь одинаковое направление, т.~е. $(x_i,y_i)$ должна быть на
+отрезке линии между $(x_i^-,y_i^-)$ и $(x_i^+,y_i^+)$.
+%%must have the same direction; i.e., $(x_i,y_i)$ must be on the line segment
+%%between $(x_i^-,y_i^-)$ and $(x_i^+,y_i^+)$.
+Эта ситуация иллюстрируется на рис.~\ref{fig4}, где контрольные точки Безье,
+выбираемые MetaPost, соединены пунктирными линиями.
+%%This situation is illustrated
+%%in Figure~\ref{fig4} where the B\'ezier control points selected by MetaPost
+%%are connected by dashed lines.
+Для тех, кто знаком с интересными свойствами такой конструкции, MetaPost
+позволяет специфицировать контрольные точки напрямую в следующем
+формате: \index{controls?\texttt{controls}}
+%%For those who are familiar with the interesting
+%%properties of this construction, MetaPost allows the control points to be
+%%specified directly in the following format:\index{controls?\texttt{controls}}
+$$ \begin{verbatim}
+draw (0,0)..controls (26.8,-1.8) and (51.4,14.6)
+ ..(60,40)..controls (67.1,61.0) and (59.8,84.6)
+ ..(40,90)..controls (25.4,94.0) and (10.5,84.5)
+ ..(10,70)..controls ( 9.6,58.8) and (18.8,49.6)
+ ..(30,50);
+\end{verbatim}
+$$
+
+\begin{figure}[htp]
+$$ \includegraphics{manfig-ru-5}
+$$
+\caption[Кривая и управляющая ломаная]
+ {Результат {\tt draw z0..z1..z2..z3..z4} с автоматически
+ выбираемой управляющей ломаной Безье, иллюстрируемой
+ пунктирными линиями.}
+%%\caption[A curve and the control polygon]
+%% {The result of {\tt draw z0..z1..z2..z3..z4} with the
+%% automatically-selected B\'ezier control polygon illustrated by dashed
+%% lines.}
+\label{fig4}
+\end{figure}
+
+\subsection{Спецификация направления, напряжения и изгиба}
+%%\subsection{Specifying Direction, Tension, and Curl}
+\label{tenscurl}
+
+MetaPost обеспечивает много способов управления поведением пути кривой
+без действительного указания контрольных точек.
+%%MetaPost provides many ways of controlling the behavior of a curved path
+%%without actually specifying the control points.
+Например, некоторые точки на пути могут быть выбраны как вертикальный или
+горизонтальный экстремумы.
+%%For instance, some
+%%points on the path may be selected as vertical or horizontal extrema.
+Если \verb|z1| следует быть горизонтальным экстремумом, а \verb|z2| ---
+вертикальным, то вы можете указать, что $(X(t),Y(t))$ должна идти вверх
+в \verb|z1| и влево в \verb|z2|:
+%%If \verb|z1| is to be a horizontal extreme and \verb|z2| is to be a
+%%vertical extreme, you can specify that $(X(t),Y(t))$ should go upward at
+%%\verb|z1| and to the left at \verb|z2|:
+$$ \hbox{\verb|draw z0..z1{up}..z2{left}..z3..z4;|} $$
+Картинка-результат, показанная на рис.~\ref{fig5}, имеет желаемые
+вертикальное и горизонтальное направления в \verb|z1| и \verb|z2|, но
+она не выглядит такой плавной, как кривая на рис.~\ref{fig2}.
+%%The resulting shown in Figure~\ref{fig5} has the desired vertical and
+%%horizontal directions at \verb|z1| and \verb|z2|, but it does not look
+%%as smooth as the curve in Figure~\ref{fig2}.
+Это обусловлено большим разрывом в величине кривизны \index{кривизна}
+в \verb|z1|.
+%%The reason is the large
+%%discontinuity in curvature\index{curvature} at \verb|z1|.
+Если явно не указать направление в \verb|z1|, то MetaPost-интерпретатор
+выберет направление таким, чтобы кривизна над \verb|z1| была почти
+такой же как и кривизна под этой точкой.
+%%If it were
+%%not for the specified direction at \verb|z1|, the MetaPost interpreter
+%%would have chosen a direction designed to make the curvature above
+%%\verb|z1| almost the same as the curvature below that point.
+
+\begin{figure}[htp]
+$$ \includegraphics{manfig-ru-6}
+$$
+\caption[Кривая и управляющая ломаная]
+ {Результат {\tt draw z0..z1\char`\{up\char`\}..z2\char`\{left\char`\}%
+ ..z3..z4}.}
+%%\caption[A curve and the control polygon]
+%% {The result of {\tt draw z0..z1\char`\{up\char`\}..z2\char`\{left\char`\}%
+%% ..z3..z4}.}
+\label{fig5}
+\end{figure}
+
+Как может выбор направлений в данных точках на кривой определять будет ли
+кривизна непрерывной?
+%%How can the choice of directions at given points on a curve determine whether
+%%the curvature will be continuous?
+Ответ в том, что кривые, используемые в MetaPost, пришли из семейства, где
+путь определяется своими концами и направлениями там.
+%%The reason is that curves used in MetaPost
+%%come from a family where a path is determined by its endpoints and the
+%%directions there.
+Рисунки \ref{fig6} и~\ref{fig7} дают хорошую идею о том, на что похоже
+это семейство кривых.
+%%Figures \ref{fig6} and~\ref{fig7} give a good idea of what
+%%this family of curves is like.
+
+\begin{figure}[htp]
+$$ \mathcenter{\includegraphics{manfig-ru-7}} \quad
+\begin{verbatim}
+beginfig(7)
+for a=0 upto 9:
+ draw (0,0){dir 45}..{dir -10a}(6cm,0);
+endfor
+endfig;
+\end{verbatim}
+$$
+\caption{Семейство кривых и инструкции MetaPost для его генерации}
+%%\caption{A curve family and the MetaPost instructions for generating it}
+\label{fig6}
+\end{figure}
+
+\begin{figure}[htp]
+$$ \mathcenter{\includegraphics{manfig-ru-8}} \quad
+\begin{verbatim}
+beginfig(8)
+for a=0 upto 7:
+ draw (0,0){dir 45}..{dir 10a}(6cm,0);
+endfor
+endfig;
+\end{verbatim}
+$$
+\caption{Другое семейство кривых с соответствующими инструкциями MetaPost}
+%%\caption{Another curve family with the corresponding MetaPost instructions}
+\label{fig7}
+\end{figure}
+
+Рисунки \ref{fig6} и~\ref{fig7} иллюстрируют новые возможности MetaPost.
+%%Figures \ref{fig6} and~\ref{fig7} illustrate a few new MetaPost
+%%features.
+Первая --- это оператор {\tt dir}\index{dir?\texttt{dir}}\label{Ddirop},
+который по углу в градусах генерирует единичный вектор в этом направлении.
+%%The first is the {\tt
+%%dir}\index{dir?\texttt{dir}}\label{Ddirop} operator that takes an angle
+%%in degrees and generates a unit vector in that direction.
+Таким образом, \verb|dir 0| эквивалентен {\tt
+right}\index{right?\texttt{right}}\label{Dright} и \verb|dir 90|
+эквивалентен {\tt up}\index{up?\texttt{up}}\label{Dup}.
+%%Thus \verb|dir 0| is equivalent to {\tt
+%%right}\index{right?\texttt{right}}\label{Dright} and \verb|dir 90| is
+%%equivalent to {\tt up}\index{up?\texttt{up}}\label{Dup}.
+Есть также готовые вектора направлений {\tt left}\index{left?\texttt{left}}\label{Dleft} и {\tt
+down}\index{down?\texttt{down}}\label{Ddown} для {\tt dir 180} и {\tt
+dir 270}.
+%%There are also predefined direction vectors {\tt
+%%left}\index{left?\texttt{left}}\label{Dleft} and {\tt
+%%down}\index{down?\texttt{down}}\label{Ddown} for {\tt dir 180} and {\tt
+%%dir 270}.
+
+Вектора направлений, заданные в \verb|{}|, могут быть любой длины и они
+могут как входить в точку, так и выходить из нее.
+%%The direction
+%%vectors given in \verb|{}| can be of any length, and they can come before a
+%%point as well as after one.
+Возможно даже в спецификации пути иметь оба направления для одной точки, до и
+после.
+%%It is even possible for a path specification
+%%to have directions given before and after a point.
+Например, участок спецификации пути
+%%For example a path specification containing
+$$ \hbox{\verb|..{dir 60}(10,0){up}..|} $$
+произведет кривую с углом в $(10,0)$.
+%%produces a curve with a corner at $(10,0)$.
+
+Заметьте, что некоторые кривые на рис.~\ref{fig6} имеют
+точки перегиба\index{перегибы}.
+%%Note that some of the curves in Figure~\ref{fig6} have points of
+%%inflection\index{inflections}.
+Это необходимо при создании гладкой кривой в ситуации подобной
+рис.~\ref{fig3}a, но это вероятно нежелательно при работе с
+вертикальными и горизонтальными точками экстремума как показано
+на рис.~\ref{fig8}a.
+%%This is necessary in order to produce
+%%smooth curves in situations like Figure~\ref{fig3}a, but it is probably
+%%not desirable when dealing with vertical and horizontal extreme points
+%%as in Figure~\ref{fig8}a.
+Если \verb|z1| нужно сделать наивысшей точкой на кривой, то
+это можно получить, используя
+\verb|...|\index{...?\texttt{...}} вместо \verb|..| в
+спецификации пути как показано на рис.~\ref{fig8}b.
+%%If \verb|z1| is supposed to be the topmost
+%%point on the curve, this can be achieved by using
+%%\verb|...|\index{...?\texttt{...}} instead of \verb|..| in the path
+%%specification as shown in Figure~\ref{fig8}b.
+Значение \verb|...| --- это ``выбрать свободный от перегибов путь между
+этими точками, если направления в концовых точках дают такую возможность''.
+%%The meaning of \verb|...|
+%%is ``choose an inflection-free path between these points unless the
+%%endpoint directions make this impossible.''
+На рис.~\ref{fig6} возможно избавиться от перегибов, а на рис.~\ref{fig7} нет.
+%%(It would be possible to
+%%avoid inflections in Figure~\ref{fig6}, but not in Figure~\ref{fig7}).
+
+\begin{figure}[htp]
+$$ {\mathcenter{\includegraphics{manfig-ru-109}} \atop
+ \hbox{\verb|draw z0{up}..z1{right}..z2{down}|}}
+ \quad
+ {\mathcenter{\includegraphics{manfig-ru-209}} \atop
+ \hbox{\verb|draw z0{up}...z1{right}...z2{down}|}}
+$$
+\caption{Две команды {\tt draw} и кривая-результат.}
+%%\caption{Two {\tt draw} statements and the resulting curves.}
+\label{fig8}
+\end{figure}
+
+Другой способ управлять неподходящим путем в увеличении параметра
+"напряжение"\index{напряжение}.
+%%Another way to control a misbehaving path is to increase the
+%%``tension''\index{tension} parameter.
+Использование \verb|..| в спецификации пути устанавливает параметр
+напряжения в типовое значение 1.
+%%Using \verb|..| in a path
+%%specification sets the tension parameter to the default value~1.
+Если это делает некоторую часть пути слишком дикой, то мы можем
+выборочно увеличить напряжение.
+%%If this makes some part of a path a little too wild, we can selectively
+%%increase the tension.
+Если рис.~\ref{fig9}a рассматривается как ``слишком дикий'',
+то команда {\tt draw} в следующей форме увеличит напряжение между
+{\tt z1} и {\tt z2}:
+%%If Figure~\ref{fig9}a is considered ``too wild,''
+%%a {\tt draw} statement of the following form increases the tension
+%%between {\tt z1} and {\tt z2}:
+$$ \hbox{\verb|draw z0..z1..tension 1.3..z2..z3|} $$
+Это произведет рис.~\ref{fig9}b.
+%%This produces Figure~\ref{fig9}b.
+Для асимметричного эффекта подобного рис.~\ref{fig9}c, команда \verb|draw|
+получает вид
+%%For an asymmetrical effect like
+%%Figure~\ref{fig9}c, the \verb|draw| statement becomes
+$$ \hbox{\verb|draw z0..z1..tension 1.5 and 1..z2..z3|} $$
+Параметр напряжения может быть меньшим единицы, но он должен быть не
+менее $3\over4$.
+%%The tension parameter can be less than one, but it must be at least $3\over4$.
+
+\begin{figure}[htp]
+$$ {\mathcenter{\includegraphics{manfig-ru-110}} \atop (a)}
+ \quad
+ {\mathcenter{\includegraphics{manfig-ru-210}} \atop (b)}
+ \quad
+ {\mathcenter{\includegraphics{manfig-ru-310}} \atop (c)}
+$$
+\caption[Эффект изменения параметра напряжения]
+ {Результаты {\tt draw z0..z1..tension} $\alpha$ {\tt и} $\beta$
+ {\tt ..z2..z3} для разных $\alpha$ и $\beta$:
+%%\caption[Effects of changing the tension parameter]
+%% {Results of {\tt draw z0..z1..tension} $\alpha$ {\tt and} $\beta$
+%% {\tt ..z2..z3} for various $\alpha$ and $\beta$:
+ (a)~$\alpha=\beta=1$; (b)~$\alpha=\beta=1.3$;
+ (c)~$\alpha=1.5$, $\beta=1$.}
+\label{fig9}
+\end{figure}
+
+Пути MetaPost имеют также параметр, называемый
+``изгиб''\index{curl?\texttt{curl}}, который влияет на концы путей.
+%%MetaPost paths also have a parameter called
+%%``curl''\index{curl?\texttt{curl}} that affects the ends of a path.
+При отсутствии спецификаций направления первый и последний отрезки
+нециклического пути --- это приблизительно дуги окружности, как в случае
+$c=1$ на рис.~\ref{fig10}.
+%%In
+%%the absence of any direction specifications, the first and last segments
+%%of a non-cyclic path are approximately circular arcs as in the $c=1$
+%%case of Figure~\ref{fig10}.
+Для использования другого значения для параметра изгиба укажите
+\verb|{curl c}| для некоторого значения $c$.
+%%To use a different value for the curl
+%%parameter, specify \verb|{curl c}| for some other value of $c$.
+Таким образом,
+%%Thus
+$$ \hbox{\verb|draw z0{curl c}..z1..{curl c}z2|} $$
+установит параметр изгиба для \verb|z0| и \verb|z2|.
+%%sets the curl parameter for \verb|z0| and \verb|z2|.
+Маленькие значения параметра изгиба уменьшают кривизну\index{кривизна}
+в указанных концовых точках пути, а большие значения увеличивают кривизну
+как показано на рис.~\ref{fig10}.
+%%Small values of
+%%the curl parameter reduce the curvature\index{curvature} at the
+%%indicated path endpoints, while large values increase the curvature as
+%%shown in Figure~\ref{fig10}.
+В частности, значение изгиба ноль делает кривизну нулевой.
+%%In particular, a curl value of zero makes
+%%the curvature approach zero.
+
+\begin{figure}[htp]
+$$ {\mathcenter{\includegraphics{manfig-ru-111}} \atop c=0}
+ \qquad
+ {\mathcenter{\includegraphics{manfig-ru-211}} \atop c=1}
+ \qquad
+ {\mathcenter{\includegraphics{manfig-ru-311}} \atop c=2}
+ \qquad
+ {\mathcenter{\includegraphics{manfig-ru-411}} \atop c=\infty}
+$$
+\caption[Эффект изменения параметра изгиба]
+ {Результаты {\tt draw z0\char`\{curl c\char`\}..z1..%
+ \char`\{curl c\char`\}z2} для разных значений
+ параметра изгиба~$c$.}
+%%\caption[Effects of changing the curl parameter]
+%% {Results of {\tt draw z0\char`\{curl c\char`\}..z1..%
+%% \char`\{curl c\char`\}z2} for various values
+%% of the curl parameter~$c$.}
+\label{fig10}
+\end{figure}
+
+\subsection{Полный синтаксис пути}
+%%\subsection{Summary of Path Syntax}
+
+Есть еще несколько других свойств синтаксиса пути MetaPost, но они
+относительно неважны.
+%%There are a few other features of MetaPost path syntax, but they are
+%%relatively unimportant.
+Из-за того, что \MF\ использует такой же синтаксис пути, заинтересованным
+читателям стоит посмотреть \cite[раздел 14]{kn:c}.
+%%Since \MF\ uses the same path syntax,
+%%interested readers can refer to \cite[chapter 14]{kn:c}.
+Сводка синтаксиса пути на рис.~\ref{sypath} включает все,
+обсуждаемое до сих пор, включая конструкции \verb|--| и \verb|...|,
+которые \cite{kn:c} показывает как макросы, а не примитивы.
+%%The summary of
+%%path syntax in Figure~\ref{sypath} includes everything discussed so far
+%%including the \verb|--| and \verb|...| constructions which \cite{kn:c}
+%%shows to be macros rather than primitives.
+Несколько комментариев по семантике приведены здесь: если непустой
+$\descr{указатель направления}$ стоит перед $\descr{узлом пути}$, но
+не после, или наоборот, то указанное направление (или величина изгиба)
+прилагается как к входящим, так и к выходящим отрезкам пути.
+%%A few comments on the
+%%semantics are in order here: If there is a non-empty $\descr{direction
+%%specifier}$ before a $\descr{path knot}$ but not after it, or vice
+%%versa, the specified direction (or curl amount) applies to both the
+%%incoming and outgoing path segments.
+Похожее соглашение применяется, когда спецификатор $\descr{управления}$
+дает только одну $\descr{первичную пару}$.
+%%A similar arrangement applies when
+%%a $\descr{controls}$ specification gives only one $\descr{pair
+%%primary}$.
+Таким образом,
+%%Thus
+$$ \hbox{\verb|..controls (30,20)..|} $$
+эквивалентно
+%%is equivalent to
+$$ \hbox{\verb|...controls (30,20) and (30,20)..|} $$
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\descr{выражение-путь} \rightarrow
+ \descr{подвыражение-путь}$\\
+\qquad \= ${}\mid \descr{подвыражение-путь} \descr{указатель направления}$\\
+\> ${}\mid \descr{подвыражение-путь} \descr{соединитель пути}$ \verb|cycle|\\
+$\descr{подвыражение-путь} \rightarrow
+ \descr{узел пути}$\\
+\> ${}\mid \descr{выражение-путь} \descr{соединитель пути} \descr{узел пути}$\\
+$\descr{соединитель пути} \rightarrow
+ \hbox{\verb|--|}$\\
+\> ${}\mid \descr{указатель направления} \descr{базовый соединитель пути}
+ \descr{указатель направления}$\\
+$\descr{указатель направления} \rightarrow
+ \descr{пусто}$\\
+\> ${}\mid {}$\verb|{curl| $\descr{числовое выражение}$\verb|}|\\
+\> ${}\mid {}$\verb|{|$\descr{выражение-пара}$\verb|}|\\
+\> ${}\mid {}$\verb|{|$\descr{числовое выражение}$\verb|,|%
+ $\descr{числовое выражение}$\verb|}|\\
+$\descr{базовый соединитель пути} \rightarrow
+ \hbox{\verb|..|}
+ \mid \hbox{\verb|...|}
+ \mid \hbox{\verb|..|}\descr{напряжение}\hbox{\verb|..|}
+ \mid \hbox{\verb|..|}\descr{управление}\hbox{\verb|..|}$\\
+$\descr{напряжение} \rightarrow
+ \hbox{\verb|tension|}\descr{числовая первичность}$\\
+\> ${}\mid \hbox{\verb|tension|}\descr{числовая первичность}
+ \hbox{\verb|and|}\descr{числовая первичность}$\\
+$\descr{управление} \rightarrow
+ \hbox{\verb|controls|}\descr{первичная пара}$\\
+\> ${}\mid \hbox{\verb|controls|}\descr{первичная пара}
+ \hbox{\verb|and|}\descr{первичная пара}$
+%%$\descr{path expression} \rightarrow
+%% \descr{path subexpression}$\\
+%%\qquad \= ${}\mid \descr{path subexpression} \descr{direction specifier}$\\
+%%\> ${}\mid \descr{path subexpression} \descr{path join}$ \verb|cycle|\\
+%%$\descr{path subexpression} \rightarrow
+%% \descr{path knot}$\\
+%%\> ${}\mid \descr{path expression} \descr{path join} \descr{path knot}$\\
+%%$\descr{path join} \rightarrow
+%% \hbox{\verb|--|}$\\
+%%\> ${}\mid \descr{direction specifier} \descr{basic path join}
+%% \descr{direction specifier}$\\
+%%$\descr{direction specifier} \rightarrow
+%% \descr{empty}$\\
+%%\> ${}\mid {}$\verb|{curl| $\descr{numeric expression}$\verb|}|\\
+%%\> ${}\mid {}$\verb|{|$\descr{pair expression}$\verb|}|\\
+%%\> ${}\mid {}$\verb|{|$\descr{numeric expression}$\verb|,|%
+%% $\descr{numeric expression}$\verb|}|\\
+%%$\descr{basic path join} \rightarrow
+%% \hbox{\verb|..|}
+%% \mid \hbox{\verb|...|}
+%% \mid \hbox{\verb|..|}\descr{tension}\hbox{\verb|..|}
+%% \mid \hbox{\verb|..|}\descr{controls}\hbox{\verb|..|}$\\
+%%$\descr{tension} \rightarrow
+%% \hbox{\verb|tension|}\descr{numeric primary}$\\
+%%\> ${}\mid \hbox{\verb|tension|}\descr{numeric primary}
+%% \hbox{\verb|and|}\descr{numeric primary}$\\
+%%$\descr{controls} \rightarrow
+%% \hbox{\verb|controls|}\descr{pair primary}$\\
+%%\> ${}\mid \hbox{\verb|controls|}\descr{pair primary}
+%% \hbox{\verb|and|}\descr{pair primary}$
+\end{ctabbing}
+\caption{Синтаксис конструкции пути}
+%%\caption{The syntax for path construction}
+\label{sypath}
+\end{figure}
+
+Пара координат, подобная \verb|(30,20)| или переменной \verb|z|,
+представляющей координатную пару, --- это то, что на рис.~\ref{sypath}
+зовется $\descr{первичной парой}$.
+%%A pair of coordinates like \verb|(30,20)| or a \verb|z| variable that
+%%represents a coordinate pair is what Figure~\ref{sypath} calls a
+%%$\descr{pair primary}$.
+Похожим является $\descr{узел пути}$ за исключением того, что он может
+приобретать другие формы, такие как выражение пути в скобках.
+%%A $\descr{path knot}$ is similar except that it
+%%can take on other forms such as a path expression in parentheses.
+Первичности и выражения различных типов будут обсуждаться в полном объеме
+в разделе~\ref{exprs}.
+%%Primaries and expressions of various types will be discussed in full
+%%generality in Section~\ref{exprs}.
+
+\section{Линейные уравнения}
+%%\section{Linear Equations}
+\label{lin.eq}
+
+Важным свойством, взятым из \MF, является возможность решать линейные
+уравнения, вследствие этого программы могут писаться в частично
+декларативной манере.
+%%An important feature taken from \MF\ is the ability to solve linear
+%%equations so that programs can be written in a partially declarative fashion.
+Например, MetaPost-интерпретатор может считать
+%%For example, the MetaPost interpreter can read
+$$ \hbox{\verb|a+b=3; 2a=b+3;|} $$
+и вывести, что $a=2$ и $b=1$.
+%%and deduce that $a=2$ and $b=1$.
+Эти же выражения могут быть записаны слегка более компактно путем
+соединения их вместе несколькими знаками равенства:
+%%The same equations can be written
+%%slightly more compactly by stringing them together with multiple equal
+%%signs:
+$$ \hbox{\verb|a+b = 2a-b = 3;|} $$
+Каким бы способом вы не задавали уравнения, вы можете затем дать
+команду\index{show?\texttt{show}}
+%%Whichever way you give the equations, you can then give the
+%%command\index{show?\texttt{show}}
+$$ \hbox{\tt show a,b;} $$
+для просмотра значений {\tt a} и {\tt b}.
+%%to see the values of {\tt a} and {\tt b}.
+MetaPost ответит, напечатав
+%%MetaPost responds by typing
+$$\begin{verbatim}
+>> 2
+>> 1
+\end{verbatim}
+$$
+
+Заметьте, что {\tt =}\index{=?\texttt{=}} не является оператором присваивания;
+он просто объявляет, что левая часть равна правой.
+%%Note that {\tt =}\index{=?\texttt{=}} is not an assignment operator; it
+%%simply declares that the left-hand side equals the right-hand side.
+Таким образом, {\tt a=a+1} приведет к сообщению об ошибке, жалующемуся
+на ``противоречивое уравнение\index{Inconsistent equation?\texttt{Inconsistent
+equation}}''.
+%%Thus {\tt a=a+1} produces an error message complaining about an
+%%``inconsistent equation\index{Inconsistent equation?\texttt{Inconsistent
+%%equation}}.''
+Способ увеличения значения {\tt a} --- в использовании оператора
+присваивания\index{присваивание} {\tt :=}\index{:=?\texttt{:=}} как в
+примере:
+%%The way to increase the value of {\tt a} is to use the
+%%assignment\index{assignment} operator {\tt :=}\index{:=?\texttt{:=}} as
+%%follows:
+$$ \hbox{\tt a:=a+1;} $$
+Другими словами, {\tt :=} для изменения существующих значений, а
+{\tt =} для задания линейных уравнений для решения.
+%%In other words, {\tt :=} is for changing existing values while {\tt =} is for
+%%giving linear equations to solve.
+
+Нет ограничений на смешивание уравнений и операций присваивания, например,
+%%There is no restriction against mixing equations and assignment
+%%operations as in the following example:
+$$ \hbox{\tt a = 2; b = a; a := 3; c = a;} $$
+После первых двух уравнений, устанавливающих {\tt a} и~{\tt b} равными 2,
+операция присваивания изменит {\tt a} на~3 без влияния на {\tt b}.
+%%After the first two equations set {\tt a} and~{\tt b} equal to 2, the
+%%assignment operation changes {\tt a} to~3 without affecting {\tt b}.
+Окончательное значение {\tt c} --- 3, т.~к. оно приравняется новому
+значению {\tt a}.
+%%The final value of {\tt c} is 3 since it is equated to the new value of
+%%{\tt a}.
+В общем, операция присваивания интерпретируется сначала вычислением нового
+значения и затем уничтожением старого значения из всех существующих уравнений
+перед собственно присваиванием.
+%%In general, an assignment operation is interpreted by first
+%%computing the new value, then eliminating the old value from all
+%%existing equations before actually assigning the new value.
+
+\subsection{Уравнения и координатные пары}
+%%\subsection{Equations and Coordinate Pairs}
+
+MetaPost может также решать линейные уравнения, содержащие координатные пары.
+%%MetaPost can also solve linear equations involving coordinate pairs.
+Мы уже видели много тривиальных примеров этого в форме уравнений, подобных
+%%We have
+%%already seen many trivial examples of this in the form of equations like
+$$ \hbox{\verb|z1=(0,.2in)|} $$
+Каждая сторона уравнения должна быть сформирована сложением или вычитанием
+координатных пар и умножением или делением их на известные числовые
+количества.
+%%Each side of the equation must be formed by adding or subtracting
+%%coordinate pairs and multiplying or dividing them by known numeric
+%%quantities.
+Другие способы именования пар значений переменных будут обсуждаться позже,
+а пока рассмотрим именование вида
+${\tt z}\descr{число}$\index{z convention?{\tt z}-соглашение}, которое весьма
+удобно, потому что оно --- сокращение для
+$$ \hbox{\tt (x}\descr{число} \hbox{\tt, y}\descr{число}\hbox{\tt)} $$
+%%Other ways of naming pair-valued variables will be
+%%discussed later, but the ${\tt z}\descr{number}$\index{z convention?{\tt
+%%z} convention} is convenient because it is an abbreviation for
+%%$$ \hbox{\tt (x}\descr{number} \hbox{\tt, y}\descr{number}\hbox{\tt)} $$
+Это делает возможным давать значения переменным \verb|z| заданием
+уравнений для их координат.
+%%This makes it possible to give values to \verb|z| variables by giving
+%%equations involving their coordinates.
+Например, точки {\tt z1}, {\tt z2}, {\tt z3}, и~{\tt z6} на рис.~\ref{fig12}
+были инициализированы следующими уравнениями:
+%%For instance, points {\tt z1},
+%%{\tt z2}, {\tt z3}, and~{\tt z6} in Figure~\ref{fig12} were initialized
+%%via the following equations:
+\begin{eqnarray*}
+ &&\hbox{\verb|z1=-z2=(.2in,0);|} \\
+ &&\hbox{\verb|x3=-x6=.3in;|} \\
+ &&\hbox{\verb|x3+y3=x6+y6=1.1in;|}
+\end{eqnarray*}
+В точности те же самые точки могли быть получены прямой установкой их значений:
+%%Exactly the same points could be obtained by setting their values directly:
+$$ \begin{verbatim}
+z1=(.2in,0); z2=(-.2in,0);
+z3=(.3in,.8in); z6=(-.3in,1.4in);
+\end{verbatim}
+$$
+
+После чтения уравнений MetaPost-интерпретатор знает значения
+{\tt z1}, {\tt z2}, {\tt z3} и~{\tt z6}.
+%%After reading the equations, the MetaPost interpreter knows the values
+%%of {\tt z1}, {\tt z2}, {\tt z3}, and~{\tt z6}.
+Следующий шаг в конструировании рис.~\ref{fig12} --- это определение точек
+{\tt z4} и {\tt z5}, одинаково удаленных от {\tt z3} и {\tt z6} и лежащих на
+одной линии с ними.
+%%The next step in the
+%%construction of Figure~\ref{fig12} is to define points {\tt z4} and {\tt
+%%z5} equally spaced along the line from {\tt z3} to {\tt z6}.
+Потому как эта операция появляется часто, MetaPost имеет для нее специальный
+синтаксис.
+%%Since this
+%%operation comes up often, MetaPost has a special syntax for it.
+Усредняющая конструкция\index{усреднение}\index{[]?\texttt{[]}!усреднение}
+%%This
+%%mediation construction\index{mediation}\index{[]?\texttt{[]}!mediation}
+$$ \hbox{\verb|z4=1/3[z3,z6]|} $$
+означает, что {\tt z4} прошла $1\over3$ пути от $z3$ до $z6$, т.~е.
+%%means that {\tt z4} is $1\over3$ of the way from $z3$ to $z6$; i.e.,
+$$ {\tt z4}={\tt z3}+{1\over3}({\tt z6}-{\tt z3}). $$
+Схожая конструкция
+%%Similarly
+$$ \hbox{\verb|z5=2/3[z3,z6]|} $$
+устанавливает {\tt z5} на $2\over3$ пути от $z3$ до $z6$.
+%%makes {\tt z5} $2\over3$ of the way from $z3$ to $z6$.
+
+\begin{figure}[htp]
+$$ \begin{verbatim}
+beginfig(13);
+z1=-z2=(.2in,0);
+x3=-x6=.3in;
+x3+y3=x6+y6=1.1in;
+z4=1/3[z3,z6];
+z5=2/3[z3,z6];
+z20=whatever[z1,z3]=whatever[z2,z4];
+z30=whatever[z1,z4]=whatever[z2,z5];
+z40=whatever[z1,z5]=whatever[z2,z6];
+draw z1--z20--z2--z30--z1--z40--z2;
+pickup pencircle scaled 1pt;
+draw z1--z2;
+draw z3--z6;
+endfig;
+\end{verbatim}
+\quad \mathcenter{\includegraphics{manfig-ru-13}}
+$$
+\caption[Код MetaPost, использующий линейные уравнения, и рисунок]
+ {Команды MetaPost и рисунок-результат. Ярлыки точек добавлены
+ к рисунку для ясности.}
+%%\caption[MetaPost code and figure using linear equations]
+%% {MetaPost commands and the resulting figure. Point labels have been
+%% added to the figure for clarity.}
+\label{fig12}
+\end{figure}
+
+Усреднение может быть также использовано для того, чтобы сказать, что
+некоторая точка находится в неизвестной позиции на прямой между двумя
+известными точками.
+%%Mediation can also be used to say that some point is at an unknown
+%%position along the line between two known points.
+Например, мы можем ввести новую переменную {\tt aa} и записать что-то вроде
+%%For instance, we
+%%could a introduce new variable {\tt aa} and write something like
+$$ \hbox{\verb|z20=aa[z1,z3];|} $$
+Это означает, что {\tt z20} --- это неизвестное отношение {\tt aa} пути
+по прямой между {\tt z1} и {\tt z3}.
+%%This says that {\tt z20} is some unknown fraction {\tt aa} of the way
+%%along the line between {\tt z1} and {\tt z3}.
+Еще одного такого отношения для другой линии достаточно для фиксации
+значения {\tt z20}.
+%%Another such equation
+%%involving a different line is sufficient to fix the value of {\tt z20}.
+Описание того, что {\tt z20} пересечение прямых {\tt z1}-{\tt z3}
+и {\tt z2}-{\tt z4} вводит еще одну переменную {\tt ab} и устанавливается
+%%To say that {\tt z20} is at the intersection of the {\tt z1}-{\tt z3}
+%%line and the {\tt z2}-{\tt z4} line, introduce another variable {\tt ab}
+%%and set
+$$ \hbox{\verb|z20=ab[z2,z4];|} $$
+Это позволяет MetaPost найти {\tt x20}, {\tt y20}, {\tt aa} и {\tt ab}.
+%%This allows MetaPost to solve for {\tt x20}, {\tt y20}, {\tt aa}, and {\tt ab}.
+
+Несколько сложновато постоянно думать о новых именах, подобных {\tt aa} и
+{\tt ab}.
+%%It is a little painful to keep thinking up new names like {\tt aa} and
+%%{\tt ab}.
+Этого можно избежать, используя специальную возможность, называемую
+{\tt whatever}\index{whatever?\texttt{whatever}}\label{Dwhatev}.
+%%This can be avoided by using a special feature called {\tt
+%%whatever}\index{whatever?\texttt{whatever}}\label{Dwhatev}.
+Этот макрос генерирует новую анонимную переменную каждый раз, когда он
+появляется.
+%%This macro
+%%generates a new anonymous variable each time it appears.
+Таким образом, команда
+%%Thus the statement
+$$ \hbox{\verb|z20=whatever[z1,z3]=whatever[z2,z4]|} $$
+устанавливает {\tt z20} как и раньше, но она использует
+{\tt whatever} для генерации двух {\em различных\/} анонимных переменных
+вместо {\tt aa} и {\tt ab}.
+%%sets {\tt z20} as before, except it uses {\tt whatever} to generate two
+%%{\em different\/} anonymous variables instead of {\tt aa} and {\tt ab}.
+Рис.~\ref{fig12} показывает как устанавливаются {\tt z20}, {\tt z30} и
+{\tt z40}.
+%%This is how Figure~\ref{fig12} sets {\tt z20}, {\tt z30}, and
+%%{\tt z40}.
+
+\subsection{Работа с неизвестными}
+%%\subsection{Dealing with Unknowns}
+
+Уравнения в системе такой, как на рис.~\ref{fig12}, могут быть заданы в любом
+порядке, но все уравнения должны быть линейными и все переменные должно быть
+возможным вычислить тогда, когда они понадобятся.
+%%A system of equations such as those used in Figure~\ref{fig12} can be given in
+%%any order as long as all the equations are linear and all the variables can
+%%be determined before they are needed.
+Это значит, что уравнения
+%%This means that the equations
+\begin{eqnarray*}
+ && \hbox{\verb|z1=-z2=(.2in,0);|}\\
+ && \hbox{\verb|x3=-x6=.3in;|}\\
+ && \hbox{\verb|x3+y3=x6+y6=1.1in;|}\\
+ && \hbox{\verb|z4=1/3[z3,z6];|}\\
+ && \hbox{\verb|z5=2/3[z3,z6];|}
+\end{eqnarray*}
+достаточны для определения {\tt z1} и остальных до {\tt z6} и порядок
+уравнений не важен.
+%%suffice to determine {\tt z1} through {\tt z6}, no matter what order the
+%%equations are given in.
+С другой стороны
+%%On the other hand
+$$ \hbox{\verb|z20=whatever[z1,z3]|} $$
+будет правильно только в случае, когда известное значение было предварительно
+указано для разности ${\tt z3}-{\tt z1}$, потому что это уравнение
+эквивалентно\index{усреднение}
+%%is legal only when a known value has previously been specified for the difference
+%%${\tt z3}-{\tt z1}$, because the equation is equivalent
+%%to\index{mediation}
+$$ \hbox{\verb|z20 = z1 + whatever*(z3-z1)|} $$
+и требования линейности не позволяют умножать неизвестные компоненты
+${\tt z3}-{\tt z1}$ на анонимный неизвестный результат
+{\tt whatever}.
+%%and the linearity requirement disallows multiplying unknown components
+%%of ${\tt z3}-{\tt z1}$ by the anonymous unknown result of {\tt
+%%whatever}.
+Общее правило в том, что вы не можете умножать два неизвестных количества,
+делить на неизвестное количество или использовать неизвестное количество в
+команде {\tt draw}.
+%%The general rule is that you cannot multiply two unknown
+%%quantities or divide by an unknown quantity, nor can an unknown quantity
+%%be used in a {\tt draw} statement.
+Из-за того, что разрешены только линейные уравнения, MetaPost-интерпретатор
+может легко решать уравнения и хранить информацию о том, какие величины
+известны.
+%%Since only linear equations are
+%%allowed, the MetaPost interpreter can easily solve the equations and
+%%keep track of what values are known.
+
+Наиболее естественный способ гарантировать, что MetaPost сможет воспринять
+выражение типа
+%%The most natural way to ensure that MetaPost can handle an expression like
+$$ \hbox{\verb|whatever[z1,z3]|} $$
+в гарантии, что {\tt z1} и {\tt z3} известны.
+%%is to ensure that {\tt z1} and {\tt z3} are both known.
+Однако этого в действительности не требуется, т.~к. MetaPost сможет вывести
+значение для ${\tt z3}-{\tt z1}$, не зная предварительно {\tt z1} и {\tt z3}.
+%%However this is not
+%%actually required since MetaPost may be able to deduce a known value for
+%%${\tt z3}-{\tt z1}$ before either of {\tt z1} and {\tt z3} are known.
+Например, MetaPost воспринимает правильными уравнения
+%%For instance, MetaPost will accept the equations
+$$ \hbox{\verb|z3=z1+(.1in,.6in); z20=whatever[z1,z3];|} $$
+и при этом не будет способен определить любую из компонент {\tt z1},
+{\tt z3} или {\tt z20}.
+%%but it will not be able to determine any of the components of {\tt z1},
+%%{\tt z3}, or {\tt z20}.
+
+Эти уравнения дают частичную информацию о {\tt z1}, {\tt z3} и {\tt z20}.
+%%These equations do give partial information about {\tt z1}, {\tt z3},
+%%and {\tt z20}.
+Хороший способ понять это в рассмотрении другого уравнения
+%%A good way to see this is to give another equation such as
+$$ \hbox{\verb|x20-x1=(y20-y1)/6;|} $$
+Оно произведет сообщение об ошибке ``{\tt ! Redundant
+equation}''\index{Redundant equation?\texttt{Redundant
+equation}}\footnote{Избыточное уравнение}.
+%%This produces the error message ``{\tt ! Redundant
+%%equation}\index{Redundant equation?\texttt{Redundant equation}}.''
+MetaPost считает, что вы пытаетесь сообщать ему что-то новое и поэтому
+он обычно предупреждает при задании избыточного уравнения.
+%%MetaPost assumes that you are trying to tell it something new, so it
+%%will usually warn you when you give a redundant equation.
+Новое уравнение вида
+%%If the new equation had been
+$$ \hbox{\verb|(x20-x1)-(y20-y1)/6=1in;|} $$
+произведет сообщение об ошибке\index{Inconsistent equation?\texttt{Inconsistent equation}}\footnote{Противоречивое уравнение
+(отклонение на 71.99979).}
+%%the error message would have been\index{Inconsistent
+%%equation?\texttt{Inconsistent equation}}
+$$ \hbox{\verb|! Inconsistent equation (off by 71.99979).|} $$
+Это сообщение об ошибке иллюстрирует ошибку округления\index{ошибка округления}
+в механизме MetaPost для решения линейных уравнений.
+%%This error message illustrates
+%%roundoff\index{roundoff error} error in MetaPost's linear equation solving
+%%mechanism.
+Ошибка округления --- это обычно несерьезная проблема, но она может вызвать
+затруднение при попытке найти пересечение двух почти параллельных прямых.
+%%Roundoff error
+%%is normally not a serious problem. but it is likely to cause trouble if you are
+%%trying to do something like find the intersection of two lines that are almost
+%%parallel.
+
+\section{Выражения}
+%%\section{Expressions}
+\label{exprs}
+
+Настало время для более систематического обзора языка MetaPost.
+%%It is now time for a more systematic view of the MetaPost language.
+Мы видели числовые количества и координатные пары и то, что их можно
+соединять для указания пути для команд {\tt draw}.
+%%We
+%%have seen that there are numeric quantities and coordinate pairs, and
+%%that these can be combined to specify paths for {\tt draw} statements.
+Мы также видели, как переменные могут быть использованы в линейных уравнениях,
+но не обсуждали всех операций и типов данных, что могут быть использованы в
+уравнениях.
+%%We have also seen how variables can be used in linear equations, but we
+%%have not discussed all the operations and data types that can be used in
+%%equations.
+
+Использование команды \index{show?\texttt{show}}\label{Dshow}
+$$ {\tt show}\, \descr{выражение} $$
+для печати символьного представления значения любого выражения делает
+возможным эксперименты с выражениями любых типов данных, встречающихся далее.
+%%It is possible to experiment with expressions involving any of the data types
+%%mentioned below by using the statement\index{show?\texttt{show}}\label{Dshow}
+%%$$ {\tt show}\, \descr{expression} $$
+%%to ask MetaPost to print a symbolic representation of the value of each
+%%expression.
+Известные числовые значения печатаются в отдельных строках,
+предваряемые ``{\tt >>} ''.
+%%For known numeric values, each is printed on a new line
+%%preceded by ``{\tt >>} ''.
+Другие типы результата расчета печатаются похожим образом, за
+исключением того, что сложные значения иногда не распечатываются на устройстве
+вывода.
+%%Other types of result are printed similarly,
+%%except that complicated values are sometimes not printed on standard
+%%output.
+Последнее производит ссылку на
+файл-дубликат\index{файлы!дубликат}, которая выглядит примерно
+так\footnote{картинка (см. файл-дубликат)}
+%%This produces a reference to the transcript
+%%file\index{files!transcript} that looks like this:
+$$ \hbox{\tt >> picture (see the transcript file)} $$
+Если вы захотите распечатки на терминале полных результатов команды
+{\tt show}, то назначьте положительное значение внутренней\index{внутренние
+переменные} переменной\index{переменные!внутренние} {\tt
+tracingonline}\index{tracingonline?\texttt{tracingonline}}\label{Dtonline}.
+%%If you want to the full results of {\tt show} statements to be printed
+%%on your terminal, assign a positive value to the internal\index{internal
+%%variables} variable\index{variables!internal} {\tt
+%%tracingonline}\index{tracingonline?\texttt{tracingonline}}\label{Dtonline}.
+
+\subsection{Типы данных}
+%%\subsection{Data Types}
+
+MetaPost в действительности имеет десять типов данных\index{типы}: числовой,
+для пар, для путей, трансформации, цвета (rgb-цвета), cmyk-цвета, строковый,
+логический, для картинок и тип пера.
+%%MetaPost actually has ten basic data types\index{types}: numeric,
+%%pair, path, transform, (rgb)color, cmykcolor, string, boolean, picture, and
+%%pen.
+Давайте рассматривать их по-одному, начиная с числового типа.
+%%Let us consider these one at a time beginning with the numeric
+%%type.
+
+Числовые (numeric)\index{числовой тип} количества представляются в MetaPost с фиксированной
+десятичной точкой\index{арифметика} как целые, умноженные на $1\over65536$.
+%%Numeric\index{numeric type} quantities in MetaPost are represented in fixed
+%%point arithmetic\index{arithmetic} as
+%%integer multiples of $1\over65536$.
+Они должны обычно иметь модуль, меньший 4096, но промежуточные результаты могут
+быть в восемь раз больше.
+%%They must normally have absolute values
+%%less than 4096 but intermediate results can be eight times larger.
+Это не должно быть проблемой для расстояний или значений координат, т.~к. 4096
+PostScript-пунктов составляют более 1.4 метра.
+%%This should not be a problem for distances or coordinate values since 4096
+%%PostScript points is more than 1.4~meters.
+Если вам нужно работать с числами размера 4096 и более, то установка внутренней
+переменной {\tt warningcheck}\index{warningcheck?\texttt{warningcheck}}\label{Dwarncheck} в
+ноль подавит предупреждающие сообщения о больших числовых количествах.
+%%If you need to work with numbers
+%%of magnitude 4096 or more, setting the internal variable
+%%{\tt warningcheck}\index{warningcheck}\label{Dwarncheck} to zero
+%%suppresses the warning messages about large numeric quantities.
+
+Тип pair (пары) \index{тип-пара} представляется как пара числовых количеств.
+%%The pair\index{pair type} type is represented as a pair of numeric
+%%quantities.
+Мы видели, что пары используются для задания координат в команде {\tt draw}.
+%%We have seen that pairs are used to give coordinates in
+%%{\tt draw} statements.
+Пары можно складывать, вычитать, использовать в выражениях усреднения, умножать и
+делить на числа.
+%%Pairs can be added, subtracted, used in
+%%mediation expressions, or multiplied or divided by numerics.
+
+Тип путей (path)\index{тип-путь} уже обсуждался в контексте команды {\tt draw}, но
+это обсуждение обошло стороной то, что пути важные отдельные объекты, которые
+можно сохранять и изменять.
+%%Paths\index{path type} have already been discussed in the context of {\tt draw}
+%%statements, but
+%%that discussion did not mention that paths are first-class objects that can be
+%%stored and manipulated.
+Путь представляет прямую линию или кривую, определяемые параметрически.
+%%A path represents a straight or curved line that is
+%%defined parametrically.
+
+Другой тип данных представляет произвольную аффинную
+трансформацию (transform)\index{тип-трансформация}.
+%%Another data type represents an arbitrary affine
+%%transformation\index{transform type}.
+{\em Трансформация} может быть любой комбинацией вращений, масштабирований,
+наклонов и сдвигов.
+%%A {\em transform\/} can be any
+%%combination of rotating, scaling, slanting, and shifting.
+Если ${\tt
+p}=(p_x,p_y)$ --- это пара и {\tt T} --- это
+трансформация,\index{transformed?\texttt{transformed}} то
+$$ \hbox{\tt p transformed T} $$
+%%If ${\tt
+%%p}=(p_x,p_y)$ is a pair and {\tt T} is a
+%%transform,\index{transformed?\texttt{transformed}}
+%%$$ \hbox{\tt p transformed T} $$
+--- это пара вида
+%%is a pair of the form
+$$ (t_x+t_{xx}p_x+t_{xy}p_y, t_y+t_{yx}p_x+t_{yy}p_y), $$
+где 6 числовых количеств $(t_x,t_y,t_{xx},t_{xy},t_{yx},t_{yy})$
+определяют {\tt T}.
+%%where the six numeric quantities $(t_x,t_y,t_{xx},t_{xy},t_{yx},t_{yy})$
+%%determine {\tt T}.
+Трансформации могут быть применимы к путям, рисункам, перьям и трансформациям.
+%%Transforms can also be applied to paths, pictures, pens,
+%%and transforms.
+
+Тип цвета (color)\index{тип-цвет} подобен типу пары, но он имеет три компоненты
+вместо двух и каждая компонента обычно находится в диапазоне от 0 до 1.
+%%The color\index{color type} type is like the pair type, except
+%%that it has three components instead of two and each component is
+%%normally between 0 and 1.
+Подобно парам, цвета могут складываться, вычитаться, использоваться в выражения усреднения, умножаться и делиться на числа.
+%%Like pairs, colors can be added,
+%%subtracted, used in mediation expressions, or multiplied or divided
+%%by numerics.
+Цвета могут задаваться при помощи констант \ttindex{black}\label{Dblack}, \ttindex{white}\label{Dwhite},
+\ttindex{red}\label{Dred}, \ttindex{green}\label{Dgreen},
+\ttindex{blue}\label{Dblue} или явно заданными красной, зеленой и синей
+компонентами.
+%%Colors can be specified in terms of the predefined
+%%constants \ttindex{black}\label{Dblack}, \ttindex{white}\label{Dwhite},
+%%\ttindex{red}\label{Dred}, \ttindex{green}\label{Dgreen},
+%%\ttindex{blue}\label{Dblue}, or the red, green, and
+%%blue components can be given explicitly.
+Черный --- это {\tt (0,0,0)} и белый --- это {\tt (1,1,1)}.
+%%Black is {\tt (0,0,0)} and
+%%white is {\tt (1,1,1)}.
+Уровень серого, такой как {\tt (.4,.4,.4)}, можно также задать как
+{\tt 0.4white}.
+%%A level of gray such as {\tt (.4,.4,.4)} can also be
+%%specified as {\tt 0.4white}.
+Хотя цветовой переменной может быть любая упорядоченная тройка, при
+добавлении объекта к картинке MetaPost преобразует ее цвета обрезкой
+каждой цветовой компоненты до диапазона от 0 до 1.
+%%Although color typed variables may be
+%%any ordered triplet, when adding an object to a picture, MetaPost will
+%%convert its color by clipping each component between 0 and 1.
+Например, MetaPost будет выводить цвет (1,2,3) как (1,1,1).
+%%For
+%%example, MetaPost will output the color (1,2,3) as (1,1,1).
+MetaPost решает линейные уравнения с цветами таким же образом как и с парами.
+%%MetaPost solves linear equations involving
+%%colors the same way it does for pairs.
+Тип `rgbcolor' (rgb-цвет) --- это синоним типа `color' (цвет).
+%%The type `rgbcolor' is an alias of.
+%%type `color'.
+
+Тип cmykcolor\index{тип-cmyk-цвет} (cmyk-цвета) подобен типу color, но
+имеет четыре компоненты вместо трех.
+%%The cmykcolor\index{cmykcolor type} type is similar to the color
+%%type except that it has four components instead of three.
+Этот тип используется для задания цветов их зеленоголубой (cyan),
+пурпурнокрасной (magenta), желтой и черной компонентами.
+%%This type is used to
+%%specify colors by their cyan, magenta, yellow, and black components explicitly.
+Из-за того, что cmyk-цвет использует краски вместо световых лучей, белый
+цвет будет выражаться как {\tt (0,0,0,0)} и черный как {\tt (0,0,0,1)}.
+%%Because CMYK colors deal with pigments instead of light rays, the color
+%%black would be expressed as {\tt (1,1,1,1)} and white as {\tt (0,0,0,0)}.
+Теоретически цвета {\tt ($c$,$m$,$y$,1)} и {\tt (1,1,1,$k$)} должны давать черный
+для любых значений $c$, $m$, $y$ и~$k$.
+%%In theory, the colors
+%%{\tt ($c$,$m$,$y$,1)} and {\tt (1,1,1,$k$)} should result in black for
+%%any values of $c$, $m$, $y$ and~$k$, too.
+На практике этого избегают, т.~к. это тратит цветные чернила и может приводить к
+неудовлетворительным результатам.
+%%But in practice, this is
+%%avoided since it is a waste of colored ink and can lead to
+%%unsatisfactory results.
+
+Строки (string)\index{строковый тип} представляют последовательность символов.
+%%A string\index{string type} represents a sequence of characters.
+Строковые константы\index{строковые константы} задаются в двойных кавычках
+\hbox{\verb|"подобно этой"|}.
+%%String constants\index{string constants} are given
+%%in double quotes \hbox{\verb|"like this"|}.
+Строковые константы не могут содержать двойных кавычек или переходов на новую
+строку, но есть способ конструировать строки, содержащие любую
+последовательность восьмибитных знаков.
+%%String constants cannot contain
+%%double quotes or newlines, but there is a way to construct a string containing
+%%any sequence of eight-bit characters.
+
+\label{Dscantokens}
+Преобразование строк в другие типы, обычно числовые, возможно примитивом
+{\tt scantokens}\index{scantokens?\texttt{scantokens}}:
+\begin{center}\texttt{n := scantokens(}\textit{строка}\texttt{);}\end{center}
+%%Conversion from strings to other types, notably numeric, can be accomplished by
+%%the {\tt scantokens}\index{scantokens?\texttt{scantokens}} primitive:
+%%\begin{center}\texttt{n := scantokens(}\textit{str}\texttt{);}\end{center}
+Более абстрактно, \texttt{scantokens} разбирает строку на последовательность
+знаков, также как MetaPost считывал бы их при вводе.
+%%More generally, \texttt{scantokens} parses a string into a token
+%%sequence, as if MetaPost had read it as input.
+
+Логический\index{логический тип} тип (boolean) имеет константы {\tt
+true}\index{true?\texttt{true}}\label{Dtrue} и {\tt
+false}\index{false?\texttt{false}}\label{Dfalse} и операторы {\tt
+and}\index{and?\texttt{and}}\label{Dand}, {\tt
+or}\index{or?\texttt{or}}\label{Dor}, {\tt
+not}\index{not?\texttt{not}}\label{Dnot}.
+%%The boolean\index{boolean type} type has the constants {\tt
+%%true}\index{true?\texttt{true}}\label{Dtrue} and {\tt
+%%false}\index{false}\label{Dfalse} and the operators {\tt
+%%and}\index{and?\texttt{and}}\label{Dand}, {\tt
+%%or}\index{or?\texttt{or}}\label{Dor}, {\tt
+%%not}\index{not?\texttt{not}}\label{Dnot}.
+Отношения \verb|=| и \verb|<>|\index{<>?\texttt{<>}}\label{Dcmpar}
+проверяют объекты любых типов на равенство и неравенство\index{неравенство}.
+%%The relations \verb|=| and
+%%\verb|<>|\index{<>?\texttt{<>}}\label{Dcmpar} test objects of any type
+%%for equality and inequality\index{inequality}.
+Отношения сравнения \index{сравнение} \verb|<|\index{<?\texttt{<}},
+\verb|<=|\index{<=?\texttt{<=}}, \verb|>|\index{>?\texttt{>}} и
+\verb|>=|\index{>=?\texttt{>=}} определяются словарно для строк и
+обычным способом для чисел.
+%%Comparison\index{comparison} relations \verb|<|\index{<?\texttt{<}},
+%%\verb|<=|\index{<=?\texttt{<=}}, \verb|>|\index{>?\texttt{>}}, and
+%%\verb|>=|\index{>=?\texttt{>=}} are defined lexicographically for
+%%strings and in the obvious way for numerics.
+Отношения порядка определены также и для логических величин, пар, цветов и
+трансформаций, но правила их сравнения не стоит обсуждать здесь.
+%%Ordering relations are
+%%also defined for booleans, pairs, colors, and transforms, but the
+%%comparison rules are not worth discussing here.
+
+Тип данных picture\index{тип-рисунок} (рисунок) --- это в точности то, что
+подразумевается его именем.
+%%The picture\index{picture type} data type is just what the name implies.
+Все, что можно нарисовать в MetaPost, можно сохранить в переменной-картинке.
+%%Anything that can be drawn in MetaPost can be stored in a picture
+%%variable.
+Фактически команда {\tt draw}\index{draw?\texttt{draw}} сохраняет свои
+результаты в особой переменной-картинке, называемой {\tt
+currentpicture}\index{currentpicture?\texttt{currentpicture}}.
+%%In fact, the {\tt draw}\index{draw?\texttt{draw}} statement
+%%actually stores its results in a special picture variable called {\tt
+%%currentpicture}\index{currentpicture?\texttt{currentpicture}}.
+Картинки могут быть добавлены к другим картинкам и их можно трансформировать.
+%%Pictures
+%%can be added to other pictures and operated on by transforms.
+
+Наконец, тип данных, называемый pen\index{тип-перо} (перо).
+%%Finally, there is a data type called a pen\index{pen type}.
+Главная функция перьев в MetaPost в определении толщины линии, но их
+также можно использовать для достижения каллиграфических эффектов.
+%%The main
+%%function of pens in MetaPost is to determine line thickness, but they
+%%can also be used to achieve calligraphic effects.
+Команда\index{pickup?\texttt{pickup}}\label{Dpickup}
+$$ {\tt pickup\ }\descr{выражение-перо} $$
+обусловит использование заданного пера в последующих командах {\tt draw}.
+%%The statement\index{pickup?\texttt{pickup}}\label{Dpickup}
+%%$$ {\tt pickup\ }\descr{pen expression} $$
+%%causes the given pen to be used in subsequent {\tt draw} statements.
+
+Обычно выражение-перо имеет форму
+$$ {\tt pencircle\ scaled\ }\descr{числовая первичность}. $$
+%%Normally, the pen expression is of the form
+%%$$ {\tt pencircle\ scaled\ }\descr{numeric primary}. $$
+Оно определяет круговое перо, производящее линии постоянной толщины.
+%%This defines a circular pen that produces lines of constant thickness.
+Если желательны каллиграфические эффекты, то выражение-перо может быть
+приспособлено для задания эллиптического или многоугольного пера.
+%%If calligraphic effects are desired, the pen expression can be adjusted to give
+%%an elliptical pen or a polygonal pen.
+
+\subsection{Операторы}
+%%\subsection{Operators}
+
+Есть много разных способов сделать выражения десяти базовых типов, но
+большинство операций можно сопоставить сравнительно простому
+синтаксису с четырьмя уровнями приоритета как показано на рис.~\ref{syexpr}.
+%%There are many different ways to make expressions of the ten basic
+%%types, but most of the operations fit into a fairly simple syntax with
+%%four levels of precedence as shown in Figure~\ref{syexpr}.
+Есть первичности\index{первичность?\tdescr{первичность}},
+вторичности\index{вторичность?\tdescr{вторичность}},
+третичности\index{третичность?\tdescr{третичность}} и
+выражения\index{выражение?\tdescr{выражение}} каждого из базовых типов,
+поэтому синтаксические правила могут уточняться для работы с такими
+сущностями как \tdescr{числовая первичность}, \tdescr{логическая третичность}
+и т.~д.
+%%There are
+%%primaries\index{primary?\tdescr{primary}},
+%%secondaries\index{secondary?\tdescr{secondary}},
+%%tertiaries\index{tertiary?\tdescr{tertiary}}, and
+%%expressions\index{expression?\tdescr{expression}} of each of the basic
+%%types, so the syntax rules could be specialized to deal with items such
+%%as \tdescr{numeric primary}, \tdescr{boolean tertiary}, etc.
+Это позволяет типу результата операции зависеть от выбора оператора и типов
+операндов.
+%%This
+%%allows the result type for an operation to depend on the choice of
+%%operator and the types of its operands.
+Например, отношение {\tt <} --- это \tdescr{третичная бинарность}, которую
+можно применить к \tdescr{числовому выражению} и к \tdescr{числовой третичности}
+для получения \tdescr{логического выражения}.
+%%For example, the {\tt <}
+%%relation is a \tdescr{tertiary binary} that can be applied to a
+%%\tdescr{numeric expression} and a \tdescr{numeric tertiary} to give a
+%%\tdescr{boolean expression}.
+Этот же оператор может допускать другие типы операндов такие как
+\tdescr{строковое выражение} и \tdescr{строковая третичность}, но
+результатом в случае несовпадения типов операндов будет сообщение об
+ошибке.
+%%The same operator can accept other operand
+%%types such as \tdescr{string expression} and \tdescr{string tertiary},
+%%but an error message results if the operand types do not match.
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{первичность} \rightarrow \descr{переменная}$\\
+%%$\tt \descr{primary} \rightarrow \descr{variable}$\\
+$\tt \qquad \;|\; \hbox{\tt (}\descr{выражение}\hbox{\tt )}$\\
+%%$\tt \qquad \;|\; \hbox{\tt (}\descr{expression}\hbox{\tt )}$\\
+$\tt \qquad \;|\; \descr{оператор 0-уровня}$\\
+%%$\tt \qquad \;|\; \descr{nullary op}$\\
+$\tt \qquad \;|\; \descr{of-оператор} \descr{выражение}
+ of \descr{первичность}$\\
+%%$\tt \qquad \;|\; \descr{of operator} \descr{expression}
+%% of \descr{primary}$\\
+$\tt \qquad \;|\; \descr{унарный оператор} \descr{первичность}$\\
+%%$\tt \qquad \;|\; \descr{unary op} \descr{primary}$\\
+$\tt \descr{вторичность} \rightarrow \descr{первичность}$\\
+%%$\tt \descr{secondary} \rightarrow \descr{primary}$\\
+$\tt \qquad \;|\; \descr{вторичность} \descr{первичный бин. оп-р} \descr{первичность}$\\
+%%$\tt \qquad \;|\; \descr{secondary} \descr{primary binop} \descr{primary}$\\
+$\tt \descr{третичность} \rightarrow \descr{вторичность}$\\
+%%$\tt \descr{tertiary} \rightarrow \descr{secondary}$\\
+$\tt \qquad \;|\; \descr{третичность} \descr{вторичный бин. оп-р}
+ \descr{вторичность}$\\
+%%$\tt \qquad \;|\; \descr{tertiary} \descr{secondary binop}
+%% \descr{secondary}$\\
+$\tt \descr{выражение} \rightarrow \descr{третичность}$\\
+%%$\tt \descr{expression} \rightarrow \descr{tertiary}$\\
+$\tt \qquad \;|\; \descr{выражение} \descr{третичный бин. оп-р}
+ \descr{третичность}$
+%%$\tt \qquad \;|\; \descr{expression} \descr{tertiary binop}
+%% \descr{tertiary}$
+\end{ctabbing}
+\caption{Общие синтаксические правила для выражений}
+%%\caption{The overall syntax rules for expressions}
+\index{унарный op?\tdescr{унарный оператор}} \index{оператор 0?\tdescr{оператор 0-уровня}}
+\index{первичный binop?\tdescr{первичный бинарный оператор}}
+\index{вторичный binop?\tdescr{вторичный бинарный оператор}}
+\index{третичный binop?\tdescr{третичный бинарный оператор}}
+%%\index{unary op?\tdescr{unary op}} \index{nullary op?\tdescr{nullary op}}
+%%\index{primary binop?\tdescr{primary binop}}
+%%\index{secondary binop?\tdescr{secondary binop}}
+%%\index{tertiary binop?\tdescr{tertiary binop}}
+\label{syexpr}
+\end{figure}
+
+Операторы умножения и деления, {\tt *}\label{Dmldiv} и~{\tt
+/}, --- примеры того, что на рис.~\ref{syexpr} зовется \tdescr{первичным
+бинарным оператором}.
+%%The multiplication and division operators {\tt *}\label{Dmldiv} and~{\tt
+%%/} are examples of what Figure~\ref{syexpr} calls a \tdescr{primary
+%%binop}.
+Каждый из них может допускать два числовых операнда или один числовой
+операнд и один типа пара или цвет.
+%%Each can accept two numeric operands or one numeric operand and
+%%one operand of type pair or color.
+Оператор возведения в степень \verb|**|\index{**?\texttt{**}}\index{степень}\label{Dpow}
+--- это \tdescr{первичный бинарный оператор}, который требует два числовых операнда.
+%%The exponentiation operator
+%%\verb|**|\index{**?\texttt{**}}\index{exponentiation}\label{Dpow} is a
+%%\tdescr{primary binop} that requires two numeric operands.
+Размещение его на том же уровне приоритета, что и умножение и деление, имеет
+неприятное последствие в том, что \verb|3*a**2| значит $(3a)^2$, а не
+$3(a^2)$\index{нерегулярности разбора}.
+%%Placing this
+%%at the same level of precedence as multiplication and division has the
+%%unfortunate consequence that \verb|3*a**2| means $(3a)^2$, not
+%%$3(a^2)$\index{parsing irregularities}.
+Из-за того, что унарный минус\label{Dneg} относится к первичному уровню, он также
+приводит к неудобочитаемости типа \verb|-a**2|, означающей $(-a)^2$.
+%%Since unary
+%%negation\label{Dneg} applies at the primary level, it also turns out
+%%that \verb|-a**2| means $(-a)^2$.
+К счастью, вычитание имеет меньший приоритет и \verb|a-b**2|
+означает $a-(b^2)$ вместо $(a-b)^2$
+%%Fortunately, subtraction has lower
+%%precedence so that \verb|a-b**2| does mean $a-(b^2)$ instead of
+%%$(a-b)^2$.
+
+Другим \tdescr{первичным бинарным оператором} является оператор {\tt
+dotprod}\index{dotprod?\texttt{dotprod}}\label{Ddprod}, вычисляющий
+скалярное произведение двух пар.
+%%Another \tdescr{primary binop} is the {\tt
+%%dotprod}\index{dotprod?\texttt{dotprod}}\label{Ddprod} operator that
+%%computes the vector dot product of two pairs.
+Например, {\tt z1 dotprod z2} эквивалентно {\tt x1*x2 + y1*y2}.
+%%For example, {\tt z1
+%%dotprod z2} is equivalent to {\tt x1*y1 + x2*y2}.
+
+Аддитивные операторы {\tt -} и {\tt +}\label{Dadd} ---
+\tdescr{вторичные бинарные операторы}, применимые к числам, парам или
+цветам и производящие результаты того же типа.
+%%The additive operators {\tt +} and {\tt -}\label{Dadd} are
+%%\tdescr{secondary binops} that operate on numerics, pairs, or colors and
+%%produce results of the same type.
+Другие операторы, что попадают в эту категорию --- это ``Пифагорово
+сложение'' \verb|++|\index{++?\texttt{++}}\label{Dpyadd} и ``Пифагорово
+вычитание'' \verb|+-+|\index{+-+?\texttt{+-+}}\label{Dpysub}:
+\verb|a++b| значит $\sqrt{a^2+b^2}$ и \verb|a+-+b| значит
+$\sqrt{a^2-b^2}$.
+%%Other operators that fall in this
+%%category are ``Pythagorean addition''
+%%\verb|++|\index{++?\texttt{++}}\label{Dpyadd} and ``Pythagorean
+%%subtraction'' \verb|+-+|\index{+-+?\texttt{+-+}}\label{Dpysub}:
+%%\verb|a++b| means $\sqrt{a^2+b^2}$ and \verb|a+-+b| means
+%%$\sqrt{a^2-b^2}$.
+Есть еще слишком много других операторов для перечисления здесь, но
+одни из самых важных --- это логические операторы {\tt
+and}\index{and?\texttt{and}} и {\tt or}\index{or?\texttt{or}}.
+%%There are too many other operators to list here, but
+%%some of the most important are the boolean operators {\tt
+%%and}\index{and?\texttt{and}} and {\tt or}\index{or?\texttt{or}}.
+Оператор {\tt and} --- это \tdescr{первичный бинарный оператор} и оператор
+{\tt or} --- это \tdescr{вторичный бинарный оператор}.
+%%The
+%%{\tt and} operator is a \tdescr{primary binop} and the {\tt or} operator
+%%is a \tdescr{secondary binop}.
+
+Базовые операции со строками --- это склейка\index{склейка},
+выделение подстроки и вычисление длины строки.
+%%e basic operations on strings are concatenation\index{concatenation},
+%%substring construction and calculating the length of a string.
+Склейка реализуется \tdescr{третичным бинарным
+оператором} \verb|&|\index{&?\texttt{\&}}\label{Damp}, например,
+%%The \tdescr{tertiary binop} \verb|&|\index{&?\texttt{\&}}\label{Damp}
+%%implements concatenation; e.g.,
+$$ \hbox{\verb|"abc" & "de"|} $$
+производит строку \verb|"abcde"|.
+%%produces the string \verb|"abcde"|.
+Оператор {\tt
+length}\index{length?\texttt{length}}\label{DlengthString} возвращает
+число символов в строке, если аргументом является \tdescr{строковая
+первичность}, например,
+%%The {\tt
+%%length}\index{length?\texttt{length}}\label{DlengthString} operator
+%%returns the number of characters in a string if the argument is a
+%%\tdescr{string primary}; e.g.,
+$$ \hbox{\verb|length "abcde"|} $$
+возвращает \verb|5|.
+%%returns \verb|5|.
+Другое применение оператора {\tt length} обсуждается на
+стр.\ \pageref{Dlength}.
+%%Another application of the {\tt length} operator is
+%%discussed on p.\ \pageref{Dlength}.
+Для выделения подстроки \tdescr{of-оператор}
+{\tt substring}\index{substring
+of?\texttt{substring of}}\label{Dsubstr} используется таким образом:
+$$ {\tt substring}\, \descr{выражение-пара} \,{\tt of}\, \descr{строковая первичность} $$
+%%For substring construction, the
+%%\tdescr{of operator} {\tt substring}\index{substring
+%%of?\texttt{substring of}}\label{Dsubstr} is used like this:
+%%$$ {\tt substring}\, \descr{pair expression} \,{\tt of}\, \descr{string primary} $$
+Часть строки для выделение определяется \tdescr{выражением-парой}.
+%%The \tdescr{pair expression} determines what part of the string to
+%%select.
+Позиции в строке нумеруются\index{индексация} так, что целые позиции
+попадают {\em между\/} символами.
+%%For this purpose, the string is indexed\index{indexing} so that
+%%integer positions fall {\em between\/} characters.
+Представим строку, написанную на кусочке бумаге в клетку так, что первый
+символ займет $x$-координаты между нулем и единицей, а следующий символ
+покроет координаты в диапазоне $1\leqslant x\leqslant2$, и т.~д.
+%%Pretend the string
+%%is written on a piece of graph paper so that the first character
+%%occupies $x$~coordinates between zero and one and the next character
+%%covers the range $1\le x\le2$, etc.
+Поэтому строку \verb|"abcde"| следует представлять в виде
+%%Thus the string \verb|"abcde"|
+%%should be thought of like this
+$$ \includegraphics{manfig-ru-14} $$
+и {\tt substring (2,4) of {\qq}abcde{\qq}} будет {\tt {\qq}cd{\qq}}.
+%%and {\tt substring (2,4) of {\qq}abcde{\qq}} is {\tt {\qq}cd{\qq}}.
+Это выглядит несколько усложнено, но имеет целью избежать надоедающих
+ошибок ``на единицу''.
+%%This takes a little
+%%getting used to but it tends to avoid annoying ``off by one'' errors.
+
+Некоторые операторы не берут аргументов вообще.
+%%Some operators take no arguments at all.
+Пример того, что на рис.~\ref{syexpr} зовется \tdescr{оператором 0-уровня}, ---
+это {\tt
+nullpicture}\index{nullpicture?\texttt{nullpicture}}\label{Dnlpic},
+который возвращает совершенно пустую картинку.
+%%An example of what
+%%Figure~\ref{syexpr} calls a \tdescr{nullary op} is {\tt
+%%nullpicture}\index{nullpicture?\texttt{nullpicture}}\label{Dnlpic} which
+%%returns a completely blank picture.
+
+Базовый синтаксис на рис.~\ref{syexpr} покрывает только те аспекты
+синтаксиса выражений, которые являются независимыми от типа.
+%%The basic syntax in Figure~\ref{syexpr} only covers aspects of the
+%%expression syntax that are relatively type-independent.
+Например, непростой синтаксис пути на рис.~\ref{sypath}, дает
+альтернативные правила для конструирования \tdescr{выражения-пути}.
+%%For instance,
+%%the complicated path syntax given in Figure~\ref{sypath} gives
+%%alternative rules for constructing a \tdescr{path expression}.
+Дополнительное правило\index{узел пути?\tdescr{узел пути}}
+$$ \descr{узел пути} \rightarrow \descr{третичная пара} \;|\; \descr{третичный путь}
+$$
+объясняет значение \tdescr{узла пути} на рис.~\ref{sypath}.
+%%An
+%%additional rule\index{path knot?\tdescr{path knot}}
+%%$$ \descr{path knot} \rightarrow \descr{pair tertiary} \;|\; \descr{path tertiary}
+%%$$
+%%explains the meaning of \tdescr{path knot} in Figure~\ref{sypath}.
+Таким образом, выражение-путь
+%%This means
+%%that the path expression
+$$ \hbox{\verb|z1+(1,1){right}..z2|} $$
+не нуждается в скобках вокруг {\tt z1+(1,1)}.
+%%does not need parentheses around {\tt z1+(1,1)}.
+
+\subsection{Дроби, усреднения и унарные операторы}
+%%\subsection{Fractions, Mediation, and Unary Operators}
+
+Выражения усреднения\index{усреднение} отсутствуют в синтаксисе базового
+выражения на рис.~\ref{syexpr}.
+%%Mediation\index{mediation} expressions do not appear in the basic expression
+%%syntax of Figure~\ref{syexpr}.
+Выражения усреднения разбираются на \tdescr{первичном} уровне, так что
+общее правило для их конструирования следующее
+$$ \descr{первичность} \rightarrow
+ \descr{числовой атом} \hbox{\tt [} \descr{выражение}
+ \hbox{\tt ,} \descr{выражение} \hbox{\tt ]},
+$$
+где каждое \tdescr{выражение} может быть типа число, пара или цвет.
+%%Mediation expressions are parsed at the
+%%\tdescr{primary} level, so the general rule for constructing them is
+%%$$ \descr{primary} \rightarrow
+%% \descr{numeric atom} \hbox{\tt [} \descr{expression}
+%% \hbox{\tt ,} \descr{expression} \hbox{\tt ]}
+%%$$
+%%where each \tdescr{expression} can be of type numeric, pair, or color.
+\tdescr{Числовой атом}\index{числовой атом?\tdescr{числовой атом}} в
+выражении усреднения имеет очень простой тип \tdescr{числовой первичности},
+как показано на рис.~\ref{synprim}.
+%%The \tdescr{numeric atom}\index{numeric atom?\tdescr{numeric atom}} in a
+%%mediation expression is an extra simple type of \tdescr{numeric primary}
+%%as shown in Figure~\ref{synprim}.
+Значением всего этого является то, что первый параметр в выражении
+усреднения требует заключения в скобки, если он в точности не переменная,
+не положительное число или не положительная дробь.
+%%The meaning of all this is that the
+%%initial parameter in a mediation expression needs to be parenthesized
+%%when it is not just a variable, a positive number, or a positive
+%%fraction.
+Например,\index{нерегулярности разбора}
+$$ \hbox{\tt -1[a,b]} \quad {\rm и}\quad \hbox{\tt (-1)[a,b]} $$
+очень различны: первое --- это $-b$, т.~к. оно эквивалентно
+{\tt -(1[a,b])}; второе --- это $a-(b-a)$ или $2a-b$.
+%%For example,\index{parsing irregularities}
+%%$$ \hbox{\tt -1[a,b]} \quad {\rm and}\quad \hbox{\tt (-1)[a,b]} $$
+%%are very different: the former is $-b$ since it is equivalent to
+%%{\tt -(1[a,b])}; the latter is $a-(b-a)$ or $2a-b$.
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{числовая первичность} \rightarrow \descr{числовой атом}$\\
+%%$\tt \descr{numeric primary} \rightarrow \descr{numeric atom}$\\
+$\tt \qquad \;|\; \descr{числовой атом}\hbox{\tt [}
+ \descr{числовое выражение}\hbox{\tt ,}\descr{числовое выражение}\hbox{\tt ]}$\\
+%%$\tt \qquad \;|\; \descr{numeric atom}\hbox{\tt [}
+%% \descr{numeric expression}\hbox{\tt ,}\descr{numeric expression}\hbox{\tt ]}$\\
+$\tt \qquad \;|\; \descr{of-оператор} \descr{выражение} of \descr{первичность}$\\
+%%$\tt \qquad \;|\; \descr{of operator} \descr{expression} of \descr{primary}$\\
+$\tt \qquad \;|\; \descr{унарный оператор} \descr{первичность}$\\
+%%$\tt \qquad \;|\; \descr{unary op} \descr{primary}$\\
+$\tt \descr{числовой атом} \rightarrow \descr{числовая переменная}$\\
+%%$\tt \descr{numeric atom} \rightarrow \descr{numeric variable}$\\
+$\tt \qquad \;|\; \descr{число или дробь}$\\
+%%$\tt \qquad \;|\; \descr{number or fraction}$\\
+$\tt \qquad \;|\; \hbox{\tt (}\descr{числовое выражение}\hbox{\tt )}$\\
+%%$\tt \qquad \;|\; \hbox{\tt (}\descr{numeric expression}\hbox{\tt )}$\\
+$\tt \qquad \;|\; \descr{числовой оператор 0-уровня}$\\
+%%$\tt \qquad \;|\; \descr{numeric nullary op}$\\
+$\tt \descr{число или дробь} \rightarrow \descr{число}
+ \hbox{\tt /}\descr{число}$\\
+%%$\tt \descr{number or fraction} \rightarrow \descr{number}
+%% \hbox{\tt /}\descr{number}$\\
+$\tt \qquad \;|\; \descr{число, за которым нет
+ `$\hbox{\tt /}\descr{числа}$'}$
+%%$\tt \qquad \;|\; \descr{number not followed by
+%% `$\hbox{\tt /}\descr{number}$'}$
+\end{ctabbing}
+\caption{Синтаксические правила для числовых первичностей}
+%%\caption{Syntax rules for numeric primaries}
+\label{synprim}
+\end{figure}
+
+Заметным свойством синтаксических правил на рис.~\ref{synprim}
+является то, что оператор {\tt /}\index{дроби} связывает более крепко,
+когда его операнды являются числами.
+%%A noteworthy feature of the syntax rules in Figure~\ref{synprim} is that
+%%the {\tt /}\index{fractions} operator binds most tightly when its
+%%operands are numbers.
+Таким образом, {\tt 2/3} --- это \tdescr{числовой
+атом}\index{числовой атом?\tdescr{числовой атом}}\index{нерегулярности
+разбора}, а {\tt (1+1)/3} --- это только \tdescr{числовая
+вторичность}.
+%%Thus {\tt 2/3} is a \tdescr{numeric
+%%atom}\index{numeric atom?\tdescr{numeric atom}}\index{parsing
+%%irregularities} while {\tt (1+1)/3} is only a \tdescr{numeric
+%%secondary}.
+Применение \tdescr{унарного оператора}, такого как {\tt
+sqrt}\index{sqrt?\texttt{sqrt}}\label{Dsqrt}, делает разницу очевидной:
+$$ \hbox{\tt sqrt 2/3} $$
+значит $\sqrt{2\over3}$, а
+$$ \hbox{\tt sqrt(1+1)/3} $$
+значит $\sqrt 2/3$.
+%%Applying a \tdescr{primary binop} such as {\tt
+%%sqrt}\index{sqrt?\texttt{sqrt}}\label{Dsqrt} makes the difference clear:
+%%$$ \hbox{\tt sqrt 2/3} $$
+%%means $\sqrt{2\over3}$ while
+%%$$ \hbox{\tt sqrt(1+1)/3} $$
+%%means $\sqrt 2/3$.
+Операторы, такие как {\tt sqrt}, могут быть записаны в стандартной
+функциональной нотации, но часто нет нужды брать аргумент в скобки.
+%%Operators such as {\tt sqrt} can be written in
+%%standard functional notation, but it is often unnecessary to
+%%parenthesize the argument.
+Это верно для любой функции, что разбирается как \tdescr{унарная операция}.
+%%This applies to any function that is parsed
+%%as a \tdescr{primary binop}.
+Например, и {\tt abs(x)}\index{abs?\texttt{abs}}\label{Dabs}, и {\tt abs x}
+вычисляют модуль {\tt x}.
+%%For instance {\tt
+%%abs(x)}\index{abs?\texttt{abs}}\label{Dabs} and {\tt abs x} both compute
+%%the absolute value of {\tt x}.
+Это же верно для функций {\tt round}\index{round?\texttt{round}}\label{Dround},
+{\tt floor}\index{floor?\texttt{floor}}\label{Dfloor},
+{\tt ceiling}\index{ceiling?\texttt{ceiling}}\label{Dceil},
+{\tt sind}\index{sind?\texttt{sind}}\label{Dsind} и
+{\tt cosd}\index{cosd?\texttt{cosd}}\label{Dcosd}.
+%%The same holds for the {\tt
+%%round}\index{round?\texttt{round}}\label{Dround}, {\tt
+%%floor}\index{floor?\texttt{floor}}\label{Dfloor}, {\tt
+%%ceiling}\index{ceiling?\texttt{ceiling}}\label{Dceil}, {\tt
+%%sind}\index{sind?\texttt{sind}}\label{Dsind}, and {\tt
+%%cosd}\index{cosd?\texttt{cosd}}\label{Dcosd} functions.
+Две последние из них вычисляют тригонометрические функции от угла
+в градусах.
+%%The last two of
+%%these compute trigonometric functions of angles in degrees.
+
+Не все унарные операторы берут числовые аргументы и возвращают числовые
+результаты.
+%%Not all unary operators take numeric arguments and return numeric
+%%results.
+Например, оператор {\tt abs}\index{abs?\texttt{abs}} можно применять
+к паре для вычисления длины вектора.
+%%For instance, the {\tt abs}\index{abs?\texttt{abs}} operator
+%%can be applied to a pair to compute the Euclidean length of a vector.
+Применение оператора {\tt
+unitvector}\index{unitvector?\texttt{unitvector}}\label{Duvec}
+к паре производит опять пару, задающую вектор с тем же направлением и
+длиной~1.
+%%Applying the {\tt
+%%unitvector}\index{unitvector?\texttt{unitvector}}\label{Duvec} operator
+%%to a pair produces the same pair rescaled so that its Euclidean length
+%%is~1.
+Оператор {\tt decimal}\index{decimal?\texttt{decimal}}\label{Ddecop}
+берет число и возвращает его строковое представление.
+%%The {\tt decimal}\index{decimal?\texttt{decimal}}\label{Ddecop}
+%%operator takes a number and returns the string representation.
+Оператор {\tt angle}\index{angle?\texttt{angle}}\label{Dangle} берет пару
+и вычисляет арктангенс отношения ее компонент, т.~е. {\tt angle} --- это
+оператор, обратный {\tt dir}, что обсуждается в разделе~\ref{tenscurl}.
+%%The {\tt angle}\index{angle?\texttt{angle}}\label{Dangle} operator takes a pair
+%%and computes the two-argument arctangent; i.e., {\tt angle} is the
+%%inverse of the {\tt dir} operator that was discussed in
+%%Section~\ref{tenscurl}.
+Есть также оператор {\tt cycle}\index{cycle?\texttt{cycle}}\label{Dcycop}, что
+берет \tdescr{первичный путь} и возвращает логический результат, показывающий
+является ли этот путь замкнутой кривой.
+%%There is also an operator {\tt
+%%cycle}\index{cycle?\texttt{cycle}}\label{Dcycop} that takes a
+%%\tdescr{path primary} and returns a boolean result indicating whether
+%%the path is a closed curve.
+
+Существует целый класс других операторов для классификации выражений с
+логическим результатом.
+%%There is a whole class of other operators that classify expressions and
+%%return boolean results.
+Имя типа, такое как {\tt
+pair}\index{pair?\texttt{pair}}, может применяться к любому типу
+\tdescr{первичности} и возвращать логический результат, показывающий
+является ли аргумент парой\label{Dpairop}.
+%%A type name such as {\tt
+%%pair}\index{pair?\texttt{pair}} can operate on any type of
+%%\tdescr{primary} and return a boolean result indicating whether the
+%%argument is a {\tt pair}\label{Dpairop}.
+Аналогично, каждое имя из следующих далее можно использовать как унарный
+оператор:
+{\tt numeric}\index{numeric?\texttt{numeric}}\label{Dnumop},
+{\tt boolean}\index{boolean?\texttt{boolean}}\label{Dboolop},
+{\tt cmykcolor}\index{cmykcolor?\texttt{cmykcolor}}\label{Dccolrop},
+{\tt color}\index{color?\texttt{color}}\label{Dcolrop},
+{\tt string}\index{string?\texttt{string}}\label{Dstrgop},
+{\tt transform}\index{transform?\texttt{transform}}\label{Dtrnfop},
+{\tt path}\index{path?\texttt{path}}\label{Dpathop},
+{\tt pen}\index{pen?\texttt{pen}}\label{Dpenop},
+{\tt picture}\index{picture?\texttt{picture}}\label{Dpictop} и
+{\tt rgbcolor}\index{rgbcolor?\texttt{rgbcolor}}\label{Drcolrop}.
+%%Similarly, each of the
+%%following can be used as a unary operator:
+%%{\tt numeric}\index{numeric?\texttt{numeric}}\label{Dnumop},
+%%{\tt boolean}\index{boolean?\texttt{boolean}}\label{Dboolop},
+%%{\tt cmykcolor}\index{cmykcolor?\texttt{cmykcolor}}\label{Dccolrop},
+%%{\tt color}\index{color?\texttt{color}}\label{Dcolrop},
+%%{\tt string}\index{string?\texttt{string}}\label{Dstrgop},
+%%{\tt transform}\index{transform?\texttt{transform}}\label{Dtrnfop},
+%%{\tt path}\index{path?\texttt{path}}\label{Dpathop},
+%%{\tt pen}\index{pen?\texttt{pen}}\label{Dpenop},
+%%{\tt picture}\index{picture?\texttt{picture}}\label{Dpictop}, and
+%%{\tt rgbcolor}\index{rgbcolor?\texttt{rgbcolor}}\label{Drcolrop}.
+Кроме проверки типа \tdescr{первичности}, вы можете использовать операторы
+{\tt known}\index{known?\texttt{known}}\label{Dknown} и {\tt
+unknown}\index{unknown?\texttt{unknown}}\label{Dunknwn} для проверки,
+имеет ли она конкретное значение.
+%%Besides just
+%%testing the type of a \tdescr{primary}, you can use the {\tt
+%%known}\index{known?\texttt{known}}\label{Dknown} and {\tt
+%%unknown}\index{unknown?\texttt{unknown}}\label{Dunknwn} operators to
+%%test if it has a completely known value.
+
+Даже числа могут вести себя как оператор в некоторых контекстах.
+%%Even a number can behave like an operator in some contexts.
+Это ссылка на трюк, что позволяет {\tt 3x}\index{умножение, неявное} и
+{\tt 3cm} как альтернативы для {\tt 3*x} и {\tt 3*cm}.
+%%This refers
+%%to the trick that allows {\tt 3x}\index{multiplication, implicit} and
+%%{\tt 3cm} as alternatives to {\tt 3*x} and {\tt 3*cm}.
+Правило в том, что \tdescr{число или дробь}, за которыми нет {\tt +}, {\tt -}
+или другого \tdescr{числа или дроби}, может служить как \tdescr{первичный
+бинарный оператор}.
+%%The rule is that
+%%a \tdescr{number or fraction} that is not followed by {\tt +}, {\tt -},
+%%or another \tdescr{number or fraction} can serve as a \tdescr{primary
+%%binop}.
+Таким образом, {\tt 2/3x}\index{нерегулярности разбора} --- это две трети от
+{\tt x}, но {\tt (2)/3x} --- это $2\over3x$, а {\tt 3 3} --- это ошибка.
+%%Thus {\tt 2/3x}\index{parsing irregularities} is two thirds of
+%%{\tt x} but {\tt (2)/3x} is $2\over3x$ and {\tt 3 3} is illegal.
+
+Есть также операторы для извлечения числовых полей из пар, цветов,
+cmyk-цветов и даже трансформаций.
+%%There are also operators for extracting numeric subfields from pairs,
+%%colors, cmykcolors, and even transforms.
+Если {\tt p} --- это \tdescr{первичная
+пара}, то {\tt xpart p}\index{xpart?\texttt{xpart}}\label{Dxprt} и
+{\tt ypart p}\index{ypart?\texttt{ypart}}\label{Dyprt} извлекают ее компоненты
+так, что
+$$ \hbox{\tt (xpart p, ypart p)} $$ эквивалентно {\tt p}, даже если
+{\tt p} --- неизвестная пара, используемая в линейном уравнении.
+%%If {\tt p} is a \tdescr{pair
+%%primary}, {\tt xpart p}\index{xpart?\texttt{xpart}}\label{Dxprt} and
+%%{\tt ypart p}\index{ypart?\texttt{ypart}}\label{Dyprt} extract its components so that
+%%$$ \hbox{\tt (xpart p, ypart p)} $$ is equivalent to~{\tt p} even if
+%%{\tt p} is an unknown pair that is being used in a linear equation.
+Аналогично, цвет {\tt c} эквивалентен\index{redpart?\texttt{redpart}}%
+\index{greenpart?\texttt{greenpart}}%
+\index{bluepart?\texttt{bluepart}}\label{Drgbprt}
+$$ \hbox{\tt (redpart c, greenpart c, bluepart c)}. $$
+%%Similarly, a color {\tt c} is equivalent
+%%to\index{redpart?\texttt{redpart}}%
+%%\index{greenpart?\texttt{greenpart}}%
+%%\index{bluepart?\texttt{bluepart}}\label{Drgbprt}
+%%$$ \hbox{\tt (redpart c, greenpart c, bluepart c)} $$.
+Для cmyk-цвета {\tt c} его эквивалент\index{cyanpart?\texttt{cyanpart}}%
+\index{magentapart?\texttt{magentapart}}%
+\index{yellowpart?\texttt{yellowpart}}%
+\index{blackpart?\texttt{blackpart}}\label{Dcmykprt}
+$$ \hbox{\tt (cyanpart c, magentapart c, yellowpart c, blackpart c)}, $$
+а для оттенка серого {\tt c} есть только один компонент
+\index{greypart?\texttt{greypart}}\label{Dgreyprt}%
+$$ \hbox{\tt greypart c}. $$
+%%For a cmykcolor {\tt c}, the parts are:\index{cyanpart?\texttt{cyanpart}}%
+%%\index{magentapart?\texttt{magentapart}}%
+%%\index{yellowpart?\texttt{yellowpart}}%
+%%\index{blackpart?\texttt{blackpart}}\label{Dcmykprt}
+%%$$ \hbox{\tt (cyanpart c, magentapart c, yellowpart c, blackpart c)} $$
+%%and for a greyscale color {\tt c}, there is only one component%
+%%\index{greypart?\texttt{greypart}}\label{Dgreyprt}%
+%%$$ \hbox{\tt greypart c}. $$
+Все операторы компонент цвета обсуждаются более подробно в
+разделе~\ref{piccomp}.
+%%All color component operators are discussed in more detail in
+%%section~\ref{piccomp}.
+Спецификаторы частей трансформаций обсуждаются в разделе~\ref{transsec}.
+%%The part specifiers for transforms are discussed
+%%in section~\ref{transsec}.
+
+\section{Переменные}
+%%\section{Variables}
+\label{vars}
+MetaPost позволяет составные имена переменных, такие как {\tt z.a}, {\tt x2r},
+{\tt y2r} и {\tt z2r}, где {\tt z2r} означает {\tt (x2r,y2r)}, а
+{\tt z.a} --- {\tt (x.a,y.a)}.
+%%MetaPost allows compound variable names such as {x.a}, {\tt x2r}, {\tt y2r},
+%%and {\tt z2r}, where {\tt z2r} means {\tt (x2r,y2r)} and {\tt z.a} means
+%%{\tt (x.a,y.a)}.
+Фактически существует широкий класс суффиксов, например,
+{\tt z}\tdescr{суффикс}\index{суффикс?\tdescr{суффикс}}, означающий
+$$ (x\descr{суффикс},\, y\descr{суффикс}). $$
+%%In fact there is a broad class of suffixes such that
+%%{\tt z}\tdescr{suffix}\index{suffix?\tdescr{suffix}} means
+%%$$ (x\descr{suffix},\, y\descr{suffix}). $$
+Из-за того, что \tdescr{суффикс} составляется из знаков, будет наилучшим
+начать с нескольких слов о знаках.
+%%Since a \tdescr{suffix} is composed of tokens, it is best to begin with a few
+%%comments about tokens.
+
+\subsection{Знаки}
+%%\subsection{Tokens}
+
+Входной файл MetaPost рассматривается как последовательность чисел,
+строковых констант и символьных знаков\index{знаки}\index{знаки!символические}.
+%%A MetaPost input file is treated as a sequence of numbers, string
+%%constants, and symbolic tokens\index{tokens}\index{tokens!symbolic}.
+Число состоит из последовательности цифр и может содержать десятичную точку.
+%%A
+%%number consists of a sequence of digits possibly containing a decimal
+%%point.
+Технически знак минус вначале отрицательного числа --- это отдельный знак.
+%%Technically, the minus sign in front of a negative number is a
+%%separate token.
+Из-за того, что MetaPost использует арифметику\index{арифметика} с
+фиксированной точкой, он не понимает экспоненциальной нотации, такой как
+{\tt 6.02E23}.
+%%Since MetaPost uses fixed point
+%%arithmetic\index{arithmetic}, it does not understand exponential
+%%notation such as {\tt 6.02E23}.
+MetaPost будет интерпретировать это как число 6.02, за которым следует
+символьный знак {\tt E}, за которым идет число~23.
+%%MetaPost would interpret this as the
+%%number 6.02, followed by the symbolic token {\tt E}, followed by the
+%%number~23.
+
+Все между парой двойных кавычек, {\tt \qq}, является строковой
+константой\index{строковые константы}.
+%%Anything between a pair of double quotes {\tt \qq} is a
+%%string constant\index{string constants}.
+Строковой константе нельзя начинаться на одной строке и заканчиваться на
+другой.
+%%It is
+%%illegal for a string constant to start on one line and end on a later line.
+Строковая константа не может также содержать двойных кавычек, {\tt \qq}, и
+чего-нибудь еще, отличного от печатных символов ASCII.
+%%Nor can a string constant contain double quotes {\tt \qq} or anything other than
+%%printable ASCII characters.
+
+Все в строке ввода, отличное от чисел и символьных констант, разбивается на
+символьные знаки\index{знаки!символические}.
+%%Everything in a line of input other than numbers and string constants is broken
+%%into symbolic tokens\index{tokens!symbolic}.
+Символьный знак --- это последовательность одного или более схожих символов,
+где символы ``схожи'', если они встречаются на одной строке таблицы~\ref{classes}.
+%%A symbolic token is a sequence of
+%%one or more similar characters, where characters are ``similar'' if they occur
+%%on the same row of Table~\ref{classes}.
+
+\begin{table}
+$$\begin{tabular}{c}
+\verb|ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz|\\
+{\tt :<=>|}\\
+\verb|#&@$|\\
+\verb|/*\|\\
+{\tt +-}\\
+{\tt !?}\\
+{\tt '`}\\
+\verb|^~|\\
+\verb|{}|\\
+{\tt [}\\
+{\tt ]}\\
+\end{tabular}
+$$
+\caption{Классы символов для разбиения на знаки}
+%%\caption{Character classes for tokenization}
+\label{classes}
+\end{table}
+
+Таким образом, \verb|A_alpha| и {\tt +-+} --- это отдельные символические
+знаки, {\tt !=} интерпретируется как два знака, а {\tt x34} --- это
+символический знак, за которым следует число.
+%%Thus \verb|A_alpha| and {\tt +-+} are symbolic tokens but {\tt !=} is
+%%interpreted as two tokens and {\tt x34} is a symbolic token followed by
+%%a number.
+Вследствие того, что квадратные скобки приведены на отдельных строках,
+символическими знаками, включающими их, являются только {\tt [}, {\tt
+[[}, {\tt [[[}, ... и {\tt ]}, {\tt ]]}, ...
+%%Since the brackets {\tt [} and {\tt ]} are listed on lines by
+%%themselves, the only symbolic tokens involving them are {\tt [}, {\tt
+%%[[}, {\tt [[[}, etc.\ and {\tt ]}, {\tt ]]}, etc.
+
+Некоторые символы не приведены в таблице~\ref{classes}, потому что они
+требуют специального обращения.
+%%Some characters are not listed in Table~\ref{classes} because they need
+%%special treatment.
+Четыре символа {\tt ,;()} являются ``одиночками'': запятая, точка с запятой или
+скобка --- это отдельный знак, даже если одинаковые из них идут подряд.
+%%The four characters {\tt ,;()} are ``loners'': each
+%%comma, semicolon, or parenthesis is a separate token
+%%even when they occur consecutively.
+Таким образом, {\tt (())} --- это четыре знака, а не один или два.
+%%Thus {\tt (())} is four tokens, not
+%%one or two.
+Знак процента является весьма специальным, потому что он вводит
+комментарии\index{комментарии}.
+%%The percent sign is very special because it introduces
+%%comments\index{comments}.
+Знак процента и все после него до конца строки игнорируется.
+%%The percent sign and everything after it up
+%%to the end of the line are ignored.
+
+Другим специальным символом является точка.
+%%Another special character is the period.
+Две и более точек вместе формируют символьный знак, но отдельная точка
+игнорируется, а точка, перед которой или за которой идут цифры, является
+частью числа.
+%%Two or more periods
+%%together form a symbolic token, but a single period is ignored, and a period
+%%preceded or followed by digits is part of a number
+Таким образом, {\tt ..} и {\tt ...} --- это символьные знаки, а {\tt a.b} --- это
+просто два знака {\tt a} и {\tt b}.
+%%Thus {\tt ..}
+%%and {\tt ...} are symbolic tokens while {\tt a.b} is just two tokens {\tt a}
+%%and {\tt b}.
+Принято использовать точку таким образом для разделения знаков, когда имя
+переменной имеет длину более одного знака.
+%%It conventional to use periods to separate tokens in this fashion
+%%when naming a variable that is more than one token long.
+
+\subsection{Декларации переменных}
+%%\subsection{Variable Declarations}
+\label{vardecl}
+
+Имя переменной --- это либо символьный знак, либо последовательность
+символьных знаков.
+%%A variable name is a symbolic token or a sequence of symbolic tokens.
+Большинство символьных знаков являются правильными именами переменных, но
+что угодно с предопределенным значением подобно {\tt draw}, {\tt +} или {\tt ..}
+недопустимо, например, имена переменных не могут быть макросами или
+примитивами MetaPost.
+%%Most symbolic tokens are legitimate variable names, but anything with a
+%%predefined meaning like {\tt draw}, {\tt +}, or {\tt ..} is disallowed;
+%%i.e., variable names cannot be macros or MetaPost primitives.
+Это второстепенное ограничение допускает широкий класс имен переменных:
+{\tt alpha}, \verb|==>|, \verb|@&#$&| и \verb|~~| --- все они легитимные
+имена переменных.
+%%This
+%%minor restriction allows an amazingly broad class of variable names:
+%%{\tt alpha}, \verb|==>|, \verb|@&#$&|, and \verb|~~| are all legitimate
+%%variable names.
+Символьные знаки без специального значения называются этикетками
+({\em tags}\index{этикетки}).
+%%Such symbolic tokens without special meanings are
+%%called {\em tags}\index{tags}.
+
+Имя переменной может быть последовательностью этикеток, подобной
+{\tt f.bot} или {\tt f.top}.
+%%A variable name can be a sequence of tags like {\tt f.bot} or {\tt
+%%f.top}.
+Эта идея служит для создания некоторых возможностей записей Паскаля
+или структур Си.
+%%The idea is to provide some of the functionality of Pascal
+%%records or C structures.
+Также возможно симулировать массивы использованием имен переменных,
+содержащих числа и символьные знаки.
+%%It is also possible to simulate arrays by
+%%using variable names that contain numbers as well as symbolic tokens.
+Например, имя переменной {\tt x2r} состоит из этикетки {\tt x},
+числа 2 и этикетки~{\tt r}.
+%%For example, the variable name {\tt x2r} consists of the tag {\tt x},
+%%the number 2, and the tag~{\tt r}.
+Могут быть также переменные, именованные {\tt x3r} и даже {\tt x3.14r}.
+%%There can also be variables named {\tt x3r} and even {\tt x3.14r}.
+Эти переменные можно рассматривать как массив\index{массивы} через конструкции,
+подобные {\tt x[i]r}, где {\tt i} имеет подходящее числовое значение.
+%%These variables can be treated as an
+%%array\index{arrays} via constructions like {\tt x[i]r}, where {\tt i}
+%%has an appropriate numeric value.
+Суммарный обзор синтаксиса для имен переменных показан на рис.~\ref{syvar}.
+%%The overall syntax for variable names is shown in Figure~\ref{syvar}.
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{переменная} \rightarrow \descr{этикетка}\descr{суффикс}$\\
+%%$\tt \descr{variable} \rightarrow \descr{tag}\descr{suffix}$\\
+$\tt \descr{суффикс} \rightarrow \descr{пусто} \;|\;
+ \descr{суффикс}\descr{индекс} \;|\; \descr{суффикс}\descr{этикетка}$\\
+%%$\tt \descr{suffix} \rightarrow \descr{empty} \;|\;
+%% \descr{suffix}\descr{subscript} \;|\; \descr{suffix}\descr{tag}$\\
+$\tt \descr{индекс} \rightarrow \descr{число} \;|\;
+ \hbox{\tt [}\descr{числовое выражение}\hbox{\tt ]}$
+%%$\tt \descr{subscript} \rightarrow \descr{number} \;|\;
+%% \hbox{\tt [}\descr{numeric expression}\hbox{\tt ]}$
+\end{ctabbing}
+\caption{Синтаксис имен переменных.}
+%%\caption{The syntax for variable names.}
+\index{суффикс?\tdescr{суффикс}}\index{индекс?\tdescr{индекс}}
+%%\index{suffix?\tdescr{suffix}}\index{subscript?\tdescr{subscript}}
+\label{syvar}
+\end{figure}
+
+Переменные, подобные {\tt x2} и {\tt y2}, обычно имеют числовое значение,
+поэтому мы можем использовать факт, что {\tt z}\tdescr{суффикс} --- это
+сокращение для\index{z convention?{\tt z}-соглашение}\label{Dzconv}
+$$ (x\descr{суффикс},\, y\descr{суффикс}), $$
+для генерации пар-значений, когда нужно.
+%%Variables like {\tt x2} and {\tt y2} take on numeric values by default, so we
+%%can use the fact that {\tt z}\tdescr{suffix} is an abbreviation for\index{z %%convention?{\tt z} convention}\label{Dzconv}
+%%$$ (x\descr{suffix},\, y\descr{suffix}) $$
+%%to generate pair-valued variables when needed.
+С другой стороны, макрос {\tt beginfig}\index{beginfig?\texttt{beginfig}}
+уничтожает все существующие до его исполнения переменные, начинающиеся с
+этикеток {\tt x} или {\tt y}, так что блоки {\tt beginfig} \ldots\ {\tt endfig}
+не взаимодействуют друг с другом при использовании такой схемы именования.
+%%It turns out that the
+%%{\tt beginfig}\index{beginfig?\texttt{beginfig}} macro wipes out
+%%pre-existing values variables that begin with the tags {\tt x} or {\tt
+%%y} so that {\tt beginfig} \ldots\ {\tt endfig} blocks do not interfere
+%%with each other when this naming scheme is used.
+Другими словами, переменные, начинающиеся с {\tt x}, {\tt y}, {\tt z},
+локальны\index{переменные!локальные}\index{локальность} в той картинке, где они
+используются.
+%%In other words,
+%%variables that start with {\tt x}, {\tt y}, {\tt z} are
+%%local\index{variables!local}\index{locality} to the figure they are used
+%%in.
+Общий механизм для создания локальных переменных будет обсуждаться
+в разделе~\ref{grsec}.
+%%General mechanisms for making variables local will be discussed in
+%%Section~\ref{grsec}.
+
+Объявления типа\index{декларации}\index{декларации типа}
+делает возможным использование почти любой схемы именования при
+удалении всех предшествующих значений, что могут вызвать
+взаимодействие.
+%%Type declarations\index{declarations}\index{type declarations}
+%%make it possible to use almost any naming scheme while still
+%%wiping out any previous value that might cause interference.
+Например, декларация
+$$ \hbox{\tt pair pp, a.b;} $$
+делает {\tt pp} и {\tt a.b} неизвестными парами.
+%%For example, the declaration
+%%$$ \hbox{\tt pair pp, a.b;} $$
+%%makes {\tt pp} and {\tt a.b} unknown pairs.
+Такая декларация не является строго локальной, т.~к. {\tt pp} и {\tt a.b}
+не восстанавливают автоматически свои предшествующие значения в конце
+текущего рисунка.
+%%Such a declaration is not
+%%strictly local since {\tt pp} and {\tt a.b} are not automatically
+%%restored to their previous values at the end of the current figure.
+Они опять становятся неизвестными парами при повторении этой декларации.
+%%Of
+%%course, they are restored to unknown pairs if the declaration is
+%%repeated.
+
+Декларации работают одинаковым образом для любого другого из оставшихся
+девяти типов: числового, путевого, трансформационного, цветового,
+cmyk-цветового, строкового, логического, рисуночного и перьевого.
+%%Declarations work the same way for any of the other eight types:
+%%numeric, path, transform, color, string, boolean, picture, and pen.
+Единственное ограничение в том, что вы не можете задать точный числовой
+индекс в декларации переменной.
+%%The
+%%only restriction is that you cannot give explicit numeric subscripts in
+%%a variable declaration.
+Не пишите ошибочных деклараций типа
+$$ \hbox{\tt numeric q1, q2, q3;} $$
+используйте обобщенный символ индекса\index{индекс!обобщенный}
+{\tt []}\index{массивы}\index{[]?\texttt{[]}!массив}
+вместо чисел для объявления всего массива:
+$$ \hbox{\tt numeric q[];} $$
+%%Do not give the illegal declaration
+%%$$ \hbox{\tt numeric q1, q2, q3;} $$
+%%use the generic subscript\index{subscript!generic} symbol
+%%{\tt []}\index{arrays}\index{[]?\texttt{[]}!array}
+%%instead, to declare the whole array:
+%%$$ \hbox{\tt numeric q[];} $$
+Вы можете также определить ``многоразмерные''
+массивы\index{массивы!многомерные}.
+%%You can also declare ``multidimensional'' arrays\index{arrays!multidimensional}.
+После декларации
+$$ \hbox{\tt path p[]q[], pq[][];} $$
+{\tt p2q3} и {\tt pq1.4 5} --- это два пути.
+%%After the declaration
+%%$$ \hbox{\tt path p[]q[], pq[][];} $$
+%%{\tt p2q3} and {\tt pq1.4 5} are both paths.
+
+Внутренние\index{внутренние переменные}\index{переменные!внутренние} переменные,
+подобные {\tt tracingonline}, не могут быть объявлены нормальным образом.
+%%Internal\index{internal variables}\index{variables!internal} variables
+%%like {\tt tracingonline} cannot be declared in the normal fashion.
+Все внутренние переменные, обсуждаемые в этом руководстве имеют значения
+изначально и никак не могут быть декларированы снова, но есть способ
+объявить, что новая переменная должна вести себя подобно внутренней.
+%%All
+%%the internal variables discussed in this manual are predefined and do
+%%not have to be declared at all, but there is a way to declare that a
+%%variable should behave like a newly-created internal variable.
+Это декларация {\tt
+newinternal}\index{newinternal?\texttt{newinternal}}\label{Dnewint},
+за которой следует список символических знаков.
+%%The
+%%declaration is {\tt
+%%newinternal}\index{newinternal?\texttt{newinternal}}\label{Dnewint}
+%%followed by a list of symbolic tokens.
+Например,
+$$ \hbox{\tt newinternal a, b, c;} $$
+обусловит поведение {\tt a}, {\tt b} и {\tt c}, как и у внутренних переменных.
+%%For example,
+%%$$ \hbox{\tt newinternal a, b, c;} $$
+%%causes {\tt a}, {\tt b}, and {\tt c} to behave like internal variables.
+Такие переменные всегда имеют известные числовые значения и эти значения
+могут быть изменены только использованием оператора
+присваивания\index{присваивание} {\tt:=}\index{:=?\texttt{:=}}.
+%%Such variables always have known numeric values, and these values can
+%%only be changed by using the assignment\index{assignment} operator
+%%{\tt:=}\index{:=?\texttt{:=}}.
+Внутренние переменные инициализируются нулем и, кроме того, макропакет
+Plain\index{макросы Plain} дает некоторым из них ненулевые значения.
+%%Internal variables are initially zero
+%%except that the Plain\index{Plain macros} macro package gives some of
+%%them nonzero initial values.
+(Макросы Plain обычно загружаются автоматически в начале работы как
+описано в разделе~\ref{intro}.)
+%%(The Plain macros are normally preloaded
+%%automatically as explained in Section~\ref{intro}.)
+
+\section{Интеграция текста и графики}
+%%\section{Integrating Text and Graphics}
+\label{text}
+
+MetaPost имеет несколько возможностей для включения меток и прочего
+текста\index{текст и графика} в генерируемые им рисунки.
+%%MetaPost has a number of features for including labels and other
+%%text\index{text and graphics} in the figures it generates.
+Простейший способ сделать это в использовании команды {\tt
+label}\index{label?\texttt{label}}\label{Dlabel}\index{label
+suffix?\tdescr{суффикс метки}}
+$$ {\tt label}\descr{суффикс метки} \hbox{\tt (}
+ \descr{выражение-строка или картинка} \hbox{\tt,}\, \descr{выражение-пара}
+ \hbox{\tt );}
+$$
+%%The simplest
+%%way to do this is to use the {\tt
+%%label}\index{label?\texttt{label}}\label{Dlabel} statement\index{label
+%%suffix?\tdescr{label suffix}}
+%%$$ {\tt label}\descr{label suffix} \hbox{\tt (}
+%% \descr{string or picture expression} \hbox{\tt,}\, \descr{pair expression}
+%% \hbox{\tt );}
+%%$$
+\tdescr{Выражение-строка или картинка} задает метку, а
+\tdescr{выражение-пара} позицию для нее.
+%%The \tdescr{string or picture expression} gives the label and the
+%%\tdescr{pair expression} says where to put it.
+\tdescr{Суффикс метки} может быть \tdescr{пустым}, что будет означать
+центрировать метку на заданных координатах.
+%%The \tdescr{label
+%%suffix} can be \tdescr{empty} in which case the label is just centered
+%%on the given coordinates.
+Если вы размечаете некоторые участки диаграммы, то вам вероятно понадобится
+слегка сместить метку, чтобы избежать накладки.
+%%If you are labeling some feature of a diagram
+%%you probably want to offset the label slightly to avoid overlapping.
+Это иллюстрируется на рис.~\ref{fig16}, где метка {\tt \qq{a}\qq}
+размещается над серединой указываемой линии, а метка {\tt \qq{b}\qq} ---
+слева от середины своей линии.
+%%This is illustrated in Figure~\ref{fig16} where the {\tt \qq{a}\qq} label is
+%%placed above the midpoint of the line it refers to and the {\tt \qq{b}\qq}
+%%label is to the left of the midpoint of its line.
+Это достигается использованием {\tt label.top}\index{top?\texttt{top}} для
+метки {\tt \qq{a}\qq} и {\tt label.lft}\index{lft?\texttt{lft}} для
+метки {\tt \qq{b}\qq}, как показано на рисунке.
+%%This is achieved by
+%%using {\tt label.top}\index{top?\texttt{top}} for the {\tt \qq{a}\qq} label
+%%and {\tt label.lft}\index{lft?\texttt{lft}} for the {\tt \qq{b}\qq} label as
+%%shown in the figure.
+\tdescr{Суффикс метки} указывает позицию метки относительно заданных
+координат.
+%%The \tdescr{label suffix} specifies the position
+%%of the label relative to the specified coordinates.
+Полное множество возможностей --- это\index{rt?\texttt{rt}}\index{bot?\texttt{bot}}%
+\index{ulft?\texttt{ulft}}\index{urt?\texttt{urt}}\index{llft?\texttt{llft}}\index{lrt?\texttt{lrt}}
+$$ {\tt \descr{суффикс метки} \rightarrow
+ \descr{пусто} \;|\; lft \;|\; rt \;|\; top \;|\; bot \;|\;
+ ulft \;|\;urt \;|\; llft \;|\; lrt},
+$$
+где {\tt lft} и {\tt rt} означают влево и вправо, а {\tt llft}, {\tt
+ulft} и т.~п. значат вниз и влево, вверх и влево и т.~п.
+%%The complete set of
+%%possibilities is\index{rt?\texttt{rt}}\index{bot?\texttt{bot}}%
+%%\index{ulft?\texttt{ulft}}\index{urt?\texttt{urt}}\index{llft?\texttt{llft}}\index{lrt?\t%%exttt{lrt}}
+%%$$ \tt \descr{label suffix} \rightarrow
+%% \descr{empty} \;|\; lft \;|\; rt \;|\; top \;|\; bot \;|\;
+%% ulft \;|\;urt \;|\; llft \;|\; lrt
+%%$$
+%%where {\tt lft} and {\tt rt} mean left and right and {\tt llft}, {\tt
+%%ulft}, etc.\ mean lower left, upper left, etc.
+Действительное расстояние, на которое будет смещена метка в заданном
+направлении, определяется внутренней
+переменной \index{внутренние переменные}\index{переменные!внутренние}
+{\tt
+labeloffset}\index{labeloffset?\texttt{labeloffset}}\label{Dlaboff}.
+%%The actual amount by
+%%which the label is offset in whatever direction is determined by the
+%%internal variable\index{internal variables}\index{variables!internal}
+%%{\tt
+%%labeloffset}\index{labeloffset?\texttt{labeloffset}}\label{Dlaboff}.
+
+\begin{figure}[htp]
+$$
+\begin{verbatim}
+beginfig(17);
+a=.7in; b=.5in;
+z0=(0,0);
+z1=-z3=(a,0);
+z2=-z4=(0,b);
+draw z1..z2..z3..z4..cycle;
+draw z1--z0--z2;
+label.top("a", .5[z0,z1]);
+label.lft("b", .5[z0,z2]);
+dotlabel.bot("(0,0)", z0);
+endfig;
+\end{verbatim}
+\qquad \mathcenter{\includegraphics{manfig-ru-17}}
+$$
+\caption{Код MetaPost и результат вывода}
+%%\caption{MetaPost code and the resulting output}
+\label{fig16}
+\end{figure}
+
+Рис.\ref{fig16} также иллюстрирует команду {\tt dotlabel}\index{dotlabel?\texttt{dotlabel}}\label{Ddotlab}.
+%%Figure~\ref{fig16} also illustrates the
+%%{\tt dotlabel}\index{dotlabel?\texttt{dotlabel}}\label{Ddotlab}
+%%statement.
+Она в точности такая же как команда {\tt label}, за которой следует
+команда рисования точки в заданных координатах.
+%%This is effectively
+%%like a {\tt label} statement followed by a statement drawing a dot at
+%%the indicated coordinates.
+Например,
+$$ \hbox{\tt dotlabel.bot(\qq(0,0)\qq, z0)} $$
+помещает точку в {\tt z0} и затем размещает метку ``(0,0)'' точно под точкой.
+%%For example
+%%$$ \hbox{\tt dotlabel.bot("(0,0)", z0)} $$
+%%places a dot at {\tt z0} and then puts the label ``(0,0)'' just below the dot.
+
+Другой альтернативой является макрос {\tt thelabel}\index{thelabel?\texttt{thelabel}}\label{Dthelab}.
+%%Another alternative is the macro
+%%{\tt thelabel}\index{thelabel?\texttt{thelabel}}\label{Dthelab}.
+Он имеет такой же синтаксис, что и команды {\tt label} и {\tt dotlabel}, но
+он возвращает результат как \tdescr{первичный рисунок} вместо его
+действительного изображения.
+%%This has
+%%the same syntax as the {\tt label} and {\tt dotlabel} statements except that it
+%%returns the label as a \tdescr{picture primary} instead of actually drawing it.
+Таким образом,
+$$ \hbox{\tt label.bot(\qq(0,0)\qq, z0)} $$
+эквивалентно
+$$ \hbox{\tt draw thelabel.bot(\qq(0,0)\qq, z0)} $$
+%%Thus
+%%$$ \hbox{\tt label.bot("(0,0)", z0)} $$
+%%is equivalent to
+%%$$ \hbox{\tt draw thelabel.bot("(0,0)", z0)} $$
+
+Для простых случаев размеченных рисунков, вам может обычно быть достаточно
+{\tt label} и {\tt dotlabel}.
+%%For simple applications of labeled figures, you can normally get by with
+%%just {\tt label} and {\tt dotlabel}.
+Дополнительно вы можете использовать короткую форму команды {\tt dotlabel},
+что сэкономит много времени, когда вы имеете много точек {\tt z0}, {\tt z1},
+{\tt z.a}, {\tt z.b}, и т.~п. и хотите использовать суффиксы {\tt z} как метки.
+%%In fact, you may be able to use a
+%%short form of the {\tt dotlabel} statement that saves a lot of typing
+%%when you have many points {\tt z0}, {\tt z1}, {\tt z.a}, {\tt z.b},
+%%etc.\ and you want to use the {\tt z} suffixes as labels.
+Команда \index{dotlabels?\texttt{dotlabels}}\label{Ddotlbs}
+$$ \hbox{\tt dotlabels.rt(0, 1, a);} $$
+эквивалентна
+$$ \hbox{\tt dotlabel.rt(\qq0\qq,z0); dotlabel.rt(\qq1\qq,z1); dotlabel.rt({\qq}a{\qq},z.a);} $$
+%%The statement\index{dotlabels?\texttt{dotlabels}}\label{Ddotlbs}
+%%$$ \hbox{\tt dotlabels.rt(0, 1, a);} $$
+%%is equivalent to
+%%$$ \hbox{\tt dotlabel.rt("0",z0); dotlabel.rt("1",z1); dotlabel.rt("a",z.a);} $$
+Таким образом, аргумент {\tt dotlabels} --- это список суффиксов для
+переменных {\tt z}, а \tdescr{суффикс метки}, задаваемый с {\tt dotlabels},
+используется для позиционирования всех меток.
+%%Thus the argument to {\tt dotlabels} is a list of suffixes for which {\tt z}
+%%variables are known, and the \tdescr{label suffix} given with {\tt dotlabels}
+%%is used to position all the labels.
+
+Есть еще команда {\tt
+labels}\index{labels?\texttt{labels}}\label{Dlabels}, аналогичная
+{\tt dotlabels}, но ее использование не рекомендуется, т.~к. она создает
+проблемы совместимости с \MF\index{metafont?\MF}.
+%%There is also a {\tt
+%%labels}\index{labels?\texttt{labels}}\label{Dlabels} statement that is
+%%analogous to {\tt dotlabels} but its use is discouraged because it
+%%presents compatibility problems with \MF\index{metafont?\MF}.
+Некоторые версии стандартного макропакета Plain\index{макросы Plain} определяют
+{\tt labels} как синоним {\tt dotlabels}.
+%%Some
+%%versions of the preloaded Plain\index{Plain macros} macro package define
+%%{\tt labels} to be synonymous with {\tt dotlabels}.
+
+Для команд разметки, таких как {\tt label} и {\tt dotlabel}, использующих
+строковые выражения для текста меток, строки печатаются в стандартном
+шрифте, определяемом строковой переменной {\tt
+defaultfont}\index{defaultfont?\texttt{defaultfont}}\label{Ddffont}.
+%%For labeling statements such as {\tt label} and {\tt dotlabel} that use
+%%a string expression for the label text, the string gets typeset in a
+%%default font as determined by the string variable {\tt
+%%defaultfont}\index{defaultfont?\texttt{defaultfont}}\label{Ddffont}.
+Начальное значение {\tt defaultfont} --- это обычно {\tt \qq{cmr10}\qq},
+но оно может быть изменено на другое имя шрифта присваиванием, например,
+$$ \hbox{\tt defaultfont:=\qq{ptmr8r}\qq}, $$
+\ttt{ptmr8r} --- это типичный способ сослаться на шрифт Times-Roman в \TeX.
+%%The initial value of {\tt defaultfont} is likely to be {\tt \qq{cmr10}\qq},
+%%but it can be changed to a different font name by giving an assignment
+%%such as
+%%$$ \hbox{\tt defaultfont:=\qq{ptmr8r}\qq} $$
+%%\ttt{ptmr8r} is a typical way to refer to the Times-Roman font in \TeX.
+%%The discussion of font names on p.\ \pageref{fontname} explains further.
+
+Есть еще числовое количество, называемое {\tt defaultscale}\index{defaultscale?\texttt{defaultscale}}\label{Ddfscale},
+определяющее размер шрифта.
+%%There is also a numeric quantity called
+%%{\tt defaultscale}\index{defaultscale?\texttt{defaultscale}}\label{Ddfscale}
+%%that determines the type size.
+Пока {\tt default\-scale} равно 1, вы получаете ``нормальный размер'',
+который обычно равен 10 пунктам, но это можно изменить.
+%%When {\tt default\-scale} is 1, you get the ``normal size'' which is
+%%usually 10 point, but this can also be changed.
+Например,
+$$ \hbox{\tt defaultscale := 1.2} $$
+делает метки на двадцать процентов больше.
+%%For instance
+%%$$ \hbox{\tt defaultscale := 1.2} $$
+%%makes labels come out twenty percent larger.
+Если вам неизвестен нормальный размер и вы хотите быть уверенными в
+конкретном размере шрифта, скажем 12 пунктов, вы можете использовать
+оператор {\tt fontsize}\index{fontsize?\texttt{fontsize}}\label{Dfntsiz}
+для определения нормального размера, например,
+$$ \hbox{\tt defaultscale := 12pt/fontsize defaultfont;} $$
+%%If you do not know the
+%%normal size and you want to be sure the text comes out at some specific
+%%size, say 12 points, you can use the {\tt
+%%fontsize}\index{fontsize?\texttt{fontsize}}\label{Dfntsiz} operator to
+%%determine the normal size: e.g.,
+%%$$ \hbox{\tt defaultscale := 12pt/fontsize defaultfont;} $$
+
+\label{fontname}
+Когда вы меняете {\tt defaultfont}, то имя нового шрифта должно быть
+чем-то, что \TeX\ сможет понять, т.~к. MetaPost получает информацию о
+высоте и ширине чтением
+{\tt tfm}\index{tfm file?{\tt tfm}-файл}\index{файлы!tfm?{\tt tfm}}-файла.
+%%When you change {\tt defaultfont}, the new font name should be something
+%%that \TeX\ would understand since MetaPost gets height and width
+%%information by reading a {\tt tfm}\index{tfm file?{\tt tfm}
+%%file}\index{files!tfm?{\tt tfm}} file.
+(Это объясняется в {\sl The \TeX book\/} \cite{kn:a}.)
+%%(This is explained in {\sl The \TeX book\/} \cite{kn:a}.)
+Должно быть возможно использовать встроенные шрифты
+PostScript\index{PostScript!шрифты}, но их имена зависят от системы.
+%%It should be possible to use built-in
+%%PostScript\index{PostScript!fonts} fonts, but the names for
+%%them are system-dependent.
+Некоторые типичные имена шрифтов --- это {\tt ptmr8r} для
+Times-Roman\index{Times-Roman}, \ttt{pplr8r} для Palatino\index{Palatino}
+и \ttt{phvr} для Helvetica\index{Helvetica}.
+%%Some typical ones are {\tt ptmr8r} for
+%%Times-Roman\index{Times-Roman}, \ttt{pplr8r} for Palatino\index{Palatino},
+%%and \ttt{phvr} for Helvetica\index{Helvetica}.
+Документ Fontname, доступный в
+\url{http://tug.org/fontname}, содержит много информации об именах шрифтов
+и \TeX.
+%%The Fontname document,
+%%available at \url{http://tug.org/fontname}, has much more information
+%%about font names and \TeX.
+\TeX\index{TeX?\TeX!шрифты}-шрифт, такой как {\tt cmr10}, является немного
+опасным, потому что он не имеет символа пробел и некоторых других символов
+ASCII.
+%%A \TeX\index{TeX?\TeX!fonts} font such
+%%as {\tt cmr10} is a little dangerous because it does not have a space
+%%character or certain ASCII symbols.
+
+MetaPost не использует информацию о лигатурах\index{лигатуры} и
+кернингах\index{кернинг}, что содержится в шрифтах \TeX.
+%%MetaPost does not use the ligatures\index{ligatures} and
+%%kerning\index{kerning} information that comes with a \TeX\ font.
+Более того, сам MetaPost не может интерпретировать виртуальные шрифты.
+%%Further, MetaPost itself does not interpret virtual fonts.
+
+\subsection{Набор ваших меток}
+%%\subsection{Typesetting Your Labels}
+
+\label{Dbtex}
+\index{метки, набор}
+%%\index{labels, typesetting}
+
+\TeX\index{TeX?\TeX} может быть использован для форматирования сложных меток.
+%%\TeX\index{TeX?\TeX} may be used to format complex labels.
+Если вы напишите \index{btex?\texttt{btex}}\index{etex?\texttt{etex}}
+$$ {\tt btex}\, \descr{команды печати}\, {\tt etex} $$
+во входном файле MetaPost, то \tdescr{команды печати} будут обработаны
+\TeX\ и транслированы в выражение-картинку, точнее в \tdescr{первичный
+рисунок}, что сможет использоваться в команде {\tt label} или {\tt dotlabel}.
+%%If you say\index{btex?\texttt{btex}}\index{etex?\texttt{etex}}
+%%$$ {\tt btex}\, \descr{typesetting commands}\, {\tt etex} $$
+%%in a MetaPost input file, the \tdescr{typesetting commands} get processed by
+%%\TeX\ and translated into a picture expression
+%%(actually a \tdescr{picture primary}) that can be used in a {\tt label}
+%%or {\tt dotlabel} statement.
+Пробелы после {\tt btex} или перед {\tt etex} игнорируются.
+%%Any spaces after {\tt btex} or before {\tt etex} are ignored.
+Например, команда
+$$ \hbox{\verb|label.lrt(btex $\sqrt x$ etex, (3,sqrt 3)*u)|} $$
+на рис.~\ref{fig17} поместит метку $\sqrt x$ снизу и вправо от
+точки {\tt (3,sqrt 3)*u}.
+%%For instance, the statement
+%%$$ \hbox{\verb|label.lrt(btex $\sqrt x$ etex, (3,sqrt 3)*u)|} $$
+%%in Figure~\ref{fig17} places the label $\sqrt x$ at the lower right of the
+%%point {\tt (3,sqrt 3)*u}.
+
+\begin{figure}[htp]
+$$
+\begin{verbatim}
+beginfig(18);
+numeric u;
+u = 1cm;
+draw (0,2u)--(0,0)--(4u,0);
+pickup pencircle scaled 1pt;
+draw (0,0){up}
+ for i=1 upto 8: ..(i/2,sqrt(i/2))*u endfor;
+label.lrt(btex $\sqrt x$ etex, (3,sqrt 3)*u);
+label.bot(btex $x$ etex, (2u,0));
+label.lft(btex $y$ etex, (0,u));
+endfig;
+\end{verbatim}
+\qquad \mathcenter{\includegraphics{manfig-ru-18}}
+$$
+\caption{Произвольный \TeX\ в качестве метки}
+%%\caption{Arbitrary \TeX\ as labels}
+\label{fig17}
+\end{figure}
+
+Рис.~\ref{fig18} иллюстрирует некоторые более сложные вещи, что можно
+сделать с метками.
+%%Figure~\ref{fig18} illustrates some of the more complicated things that can
+%%be done with labels.
+Вследствие того, что результатом {\tt btex} \ldots {\tt etex} является
+картинка, им можно оперировать как картинкой.
+%%Since the result of {\tt btex} \ldots {\tt etex} is
+%%a picture, it can be operated on like a picture.
+В частности, к картинкам возможно применять трансформации.
+%%In particular, it is possible
+%%to apply transformations to pictures.
+Мы пока не обсуждали синтаксис для этого, но \tdescr{рисунок-вторичность}
+может быть \index{вращаемый текст}\index{rotated?\texttt{rotated}}
+$$ \descr{рисунок-вторичность}\, {\tt rotated}\, \descr{числовая первичность} $$
+%%We have not discussed the syntax for
+%%this yet, but a \tdescr{picture secondary}
+%%can be\index{rotated text}\index{rotated?\texttt{rotated}}
+%%$$ \descr{picture secondary}\, {\tt rotated}\, \descr{numeric primary} $$
+Это используется на рис.~\ref{fig18} для вращения метки ``$y$ axis'' так,
+что она располагается по-вертикали.
+%%This is used in Figure~\ref{fig18} to rotate the label ``$y$ axis'' so that
+%%it runs vertically.
+
+\begin{figure}[htp]
+$$
+\begin{verbatim}
+beginfig(19);
+numeric ux, uy;
+120ux=1.2in; 4uy=2.4in;
+draw (0,4uy)--(0,0)--(120ux,0);
+pickup pencircle scaled 1pt;
+draw (0,uy){right}
+ for ix=1 upto 8:
+ ..(15ix*ux, uy*2/(1+cosd 15ix))
+ endfor;
+label.bot(btex $x$ axis etex, (60ux,0));
+label.lft(btex $y$ axis etex rotated 90,
+ (0,2uy));
+label.lft(
+ btex $\displaystyle y={2\over1+\cos x}$ etex,
+ (120ux, 4uy));
+endfig;
+\end{verbatim}
+\qquad \mathcenter{\includegraphics{manfig-ru-19}}
+$$
+\caption{Математические метки \TeX\ и метки, вращаемые MetaPost}
+%%\caption{\TeX\ labels with display math, and rotated by MetaPost}
+\label{fig18}
+\end{figure}
+
+Другой сложностью на рис.~\ref{fig18} является использование уравнения
+$$y={2\over 1+\cos x}$$
+как метки.
+%%Another complication in Figure~\ref{fig18} is the use of the displayed equation
+%%$$y={2\over 1+\cos x}$$
+%%as a label.
+Будет более естественно закодировать эту метку как
+$$ \hbox{\verb|$$y={2\over 1+\cos x}$$|}, $$
+но это не сработает, потому что \TeX\ набирает метки в
+``горизонтальном режиме''.
+%%It would be more natural to code this as
+%%$$ \hbox{\verb|$$y={2\over 1+\cos x}$$|} $$
+%%but this would not work because
+%%\TeX\ typesets the labels in ``horizontal mode.''
+
+Для печати \emph{переменного} текста, как метки, используйте
+полезное средство \texttt{TEX}, описанное на стр.\ \pageref{dTEX}.
+%%For a way to typeset \emph{variable} text as labels, see the
+%%\texttt{TEX} utility routine described on p.\ \pageref{dTEX}.
+
+Далее о том, как \TeX-текст транслируется в форму, понятную MetaPost:
+процессор MetaPost пропускает блок {\tt
+btex}\index{btex?\texttt{btex}} \ldots\ {\tt
+etex}\index{etex?\texttt{etex}}, полагаясь на препроцессор,
+который должен перевести этот блок в команды низкого уровня MetaPost.
+%%Here is how \TeX\ material gets translated into a form MetaPost
+%%understands: The MetaPost processor skips over {\tt
+%%btex}\index{btex?\texttt{btex}} \ldots\ {\tt
+%%etex}\index{etex?\texttt{etex}} blocks and depends on a preprocessor to
+%%translate them into low level MetaPost commands.
+Если {\tt fig.mp} --- это главный файл, то транслированный \TeX-текст
+помещается в файл с именем {\tt fig.mpx}\index{файлы!mpx?{\tt mpx}}.
+%%If the main file is
+%%{\tt fig.mp}, the translated \TeX\ material is placed in a file named
+%%{\tt fig.mpx}\index{files!mpx?{\tt mpx}}.
+Это обычно делается незаметно для пользователя, но вызывает ошибку, если
+один из блоков {\tt btex} $\ldots$ {\tt etex} содержит ошибочную команду
+\TeX\index{TeX?\TeX!ошибки}.
+%%This is normally done
+%%silently without any user intervention but it could fail if one of the
+%%{\tt btex} $\ldots$ {\tt etex} blocks contains an erroneous
+%%\TeX\index{TeX?\TeX!errors} command.
+После ошибки, ошибочный текст \TeX\ сохраняется в файле
+{\tt mpxerr.tex}\index{mpxerr.tex?\texttt{mpxerr.tex}} и сообщения об ошибках
+появляются в {\tt
+mpxerr.log}\index{mpxerr.log?\texttt{mpxerr.log}}.
+%%Then the erroneous \TeX\ input is
+%%saved in the file {\tt mpxerr.tex}\index{mpxerr.tex?\texttt{mpxerr.tex}}
+%%and the error messages appear in {\tt
+%%mpxerr.log}\index{mpxerr.log?\texttt{mpxerr.log}}.
+
+Препроцессор для меток \TeX\ {\it понимает\/} виртуальные шрифты, т.~е. вы
+можете использовать команды вашего обычного \TeX\ для переключения шрифтов
+внутри метки.
+%%The preprocessor for \TeX\ labels {\it does\/} understand virtual
+%%fonts, so you can use your normal \TeX\ font switching commands inside
+%%the label.
+
+\label{Dverbatimtex}
+Определения макросов \TeX\ или любые другие вспомогательные команды \TeX\
+могут заключаться в блок {\tt verbatimtex}\index{verbatimtex?\texttt{verbatimtex}}
+\ldots\ {\tt etex}\index{etex?\texttt{etex}}.
+%%\TeX\ macro definitions or any other auxiliary \TeX\ commands can be
+%%enclosed in a {\tt verbatimtex}\index{verbatimtex?\texttt{verbatimtex}}
+%%\ldots\ {\tt etex}\index{etex?\texttt{etex}} block.
+Разница между {\tt btex} и {\tt verbatimtex} в том, что первый генерирует
+выражение-рисунок, а второй только добавляет данные для обработки \TeX.
+%%The difference
+%%between {\tt btex} and {\tt verbatimtex} is that the former generates a
+%%picture expression while the latter only adds material for \TeX\ to
+%%process.
+Например, если вы хотите, используя \TeX, напечатать метки, используя макросы из
+{\tt mymac.tex}, то ваш входной файл для MetaPost будет выглядеть подобно чему-то
+такому:
+%%For instance, if you want \TeX\ to typeset labels using macros
+%%defined in {\tt mymac.tex}, your MetaPost input file would look
+%%something like this:
+\begin{eqnarray*}
+&& \verb|verbatimtex \input mymac etex|\\
+&& \verb|beginfig(1);|\\
+&& \qquad \dots\\
+&& \verb|label(btex|\, \descr{\TeX-текст, использующий \hbox{\tt mymac.tex}}\,
+ \verb|etex, | \descr{некоторые координаты} \hbox{\tt );}\\
+%%&& \verb|label(btex|\, \descr{\TeX\ material using \hbox{\tt mymac.tex}}\,
+%% \verb|etex, | \descr{some coordinates} \hbox{\tt );}\\
+&& \qquad \dots
+\end{eqnarray*}
+
+\label{Dtroffmode}
+Для Unix\footnote{Unix --- это зарегистрированная торговая марка Unix Systems
+Laboratories.}\index{Unix} и других основанных на Web2C систем
+опция MetaPost {\tt -troff} скажет препроцессору, что блоки {\tt btex}
+$\ldots$ {\tt etex} и {\tt verbatimtex} $\ldots$ {\tt etex}
+представлены в troff\index{troff} вместо \TeX.
+%%On Unix\footnote{Unix is a registered trademark of Unix Systems
+%%Laboratories.}\index{Unix\regmark} and other Web2C-based systems, the
+%%option {\tt -troff} to MetaPost tells the preprocessor that {\tt btex}
+%%$\ldots$ {\tt etex} and {\tt verbatimtex} $\ldots$ {\tt etex} blocks
+%%are in troff\index{troff} instead of \TeX.
+Когда используется эта опция, MetaPost устанавливает внутреннюю переменную
+\ttindex{troffmode} в~1\index{prologues?\texttt{prologues}}.
+%%When using this option,
+%%MetaPost sets the internal variable
+%%\ttindex{troffmode} to~1\index{prologues?\texttt{prologues}}.
+
+\label{Dprologues}
+Установка \ttt{prologues} может быть полезна также и с \TeX, а не только
+для troff.
+%%Setting \ttt{prologues} can be useful with \TeX, too, not just troff.
+Далее приводятся некоторые разъяснения:
+%%Here is some explanation:
+
+\begin{itemize}
+\item Когда \ttt{prologues} равно 0, что устанавливается по-умолчанию,
+выходные файлы MetaPost не содержат используемых шрифтов.
+%%\item When \ttt{prologues} is 0, which is the default, the MetaPost
+%%output files do not have embedded fonts.
+Шрифты в результате-выводе будут вероятно Courier\index{Courier} или
+Times-Roman\index{Times-Roman}.
+%%Fonts in the resulting
+%%output will probably render as Courier\index{Courier} or %%Times-Roman\index{Times-Roman}.
+
+\item Когда \ttt{prologues} равно 1, вывод MetaPost объявляется
+``структурированным PostScript''\index{PostScript!структурный} (EPSF\index{EPSF}),
+но это не вполне верно.
+%%\item When \ttt{prologues} is 1, the MetaPost output claims to be
+%%``structured PostScript''\index{PostScript!structured} (EPSF\index{EPSF}),
+%%but it is not completely conformant.
+Этот вариант поддерживается для обратной совместимости со старыми
+troff-документами, но его использование как устаревшего не рекомендуется.
+%%This variant is kept for backward
+%%compatibility with old (troff) documents, but its use is deprecated.
+Из исторических соображений, MetaPost устанавливает \ttt{prologues} в~1,
+когда опция {\tt -troff} приводится в командной строке.
+%%For historical reasons, MetaPost sets \ttt{prologues} to~1 when the {\tt
+%%-troff} option is given on the command line.
+
+\item Когда \ttt{prologues} равно 2, вывод MetaPost --- это EPSF, в котором
+предполагается, что текст набран PostScript\index{PostScript!шрифты}-шрифтами,
+предоставляемыми ``средой'', такой как просмотрщик документа или встроенное
+приложение, использующие этот вывод.
+%%\item When \ttt{prologues} is 2, the MetaPost output is EPSF and assumes
+%%that the text comes from PostScript\index{PostScript!fonts} fonts
+%%provided by the ``environment'', such as the document viewer or
+%%embedded application using the output.
+MetaPost будет пытаться установить кодировку шрифта правильно, основываясь
+на командах \ttt{fontmapfile} и \ttt{fontmapline}.
+%%MetaPost will attempt to
+%%set up the font encodings correctly, based on \ttt{fontmapfile} and
+%%\ttt{fontmapline} commands.
+
+\item Когда \ttt{prologues} равно 3, вывод MetaPost будет EPSF, содержащий
+шрифты PostScript (или подмножества шрифтов), используемые на основе команд
+\ttt{fontmapfile} и \ttt{fontmapline}.
+%%\item When \ttt{prologues} is 3, the MetaPost output will be EPSF but
+%%will contain the PostScript font(s) (or a subset) used based on the
+%%\ttt{fontmapfile} and \ttt{fontmapline} commands.
+Это значение полезно для генерации самодостаточной PostScript-графики.
+%%This value is useful
+%%for generating stand-alone PostScript graphics.
+\end{itemize}
+
+Стоит отметить, что стандартное значение \ttt{prologues:=0} достаточно для
+графики, включаемой в документы \TeX.
+%%It is worth noting that the default value \ttt{prologues:=0} is sufficient
+%%for graphics included in \TeX-based documents.
+Переменная \ttt{prologues} также не нужна при обработке MetaPost-файлов
+через утилиту \ttindex{mptopdf} (из дистрибутива \ConTeXt), потому что
+PDF-файлы естественно самодостаточны.
+%%Also, the \ttt{prologues} variable is irrelevant
+%%when processing MetaPost files through the \ttindex{mptopdf} utility
+%%(part of the \ConTeXt\ distribution), because PDF files are, by nature,
+%%stand-alone.
+Более того, значение \ttt{prologues} не имеет эффекта на шрифты \MF\ в
+ваших MetaPost-файлах, т.~е. MetaPost никогда не встраивает такие шрифты
+в свой вывод.
+%%Moreover, the value of \ttt{prologues} has no effect on
+%%\MF\ fonts in your MetaPost files, i.\,e., MetaPost never embeds such
+%%fonts.
+Только драйверы вывода, например, \ttt{dvips} или pdf\LaTeX, могут встроить
+такие шрифты.
+%%Only output drivers, e.\,g., \ttt{dvips} or pdf\LaTeX\ will
+%%handle those.
+
+Детали того, как включать рисунки PostScript в документ, сделанный в
+\TeX\ или troff, системо-зависимы.
+%%The details on how to include PostScript figures in a paper
+%%done in \TeX\ or troff are system-dependent.
+Они могут обычно быть найдены в страницах руководства (man pages) или
+в другой сетевой документации, но посмотрите сначала
+в раздел~\ref{Dteximport} этого руководства для кратких инструкций,
+которые во многих случаях окажутся достаточными.
+%%They can generally be found
+%%in manual pages and other on-line documentation, but have a look at
+%%section~\ref{Dteximport} of this manual for some brief instructions that
+%%in many cases should work.
+Руководство для широко используемой программы Dvips находится в файле
+\ttt{dvips.texi}, включенном в большинство стандартных дистрибутивов и
+доступном в сети в \url{http://tug.org/texinfohtml/dvips.html} и в других
+местах, а также в других форматах.
+%%The manual for the
+%%widely-used Dvips processor is in a file \ttt{dvips.texi}, included in
+%%most distributions, and is available online at
+%%\url{http://tug.org/texinfohtml/dvips.html}, among many other places and
+%%formats.
+
+\label{Dmakempx}
+В системах, основанных на Web2C, препроцессор называется
+\ttindex{makempx} --- он вызывает программу \ttindex{mpto};
+документация по Web2C описывает их более подробно.
+%%On Web2C-based systems, the preprocessor is named \ttindex{makempx},
+%%which calls another utility \ttindex{mpto}; the Web2C documentation
+%%describes them in more detail.
+Однако, упомянем здесь одно свойство:
+если переменная среды \ttindex{MPTEXPRE} содержит имя существующего
+файла, то {\tt makempx} будет помещать его в начало при выводе.
+%%We'll mention one feature here, though:
+%%if the environment variable \ttindex{MPTEXPRE} is set to the name of an
+%%existing file, {\tt makempx} will prepend it to the output.
+Вы можете это использовать, например, для включения преамбул \LaTeX.
+%%You can use
+%%this to include \LaTeX\ preambles, for instance.
+Макрос \ttt{TEX}, описанный на стр.~\pageref{dTEX}, обеспечивает другой
+способ такого включения.
+%%The \ttt{TEX}
+%%macro described on p.\ \pageref{dTEX} provides another way to handle this.
+
+\subsection{Файлы-карты шрифтов}
+%%\subsection{Font map files}
+\label{Sfontmapfile}\label{Sfontmapline}
+
+Если \ttt{prologues} установлено в~2, то любые используемые в выводе
+шрифты автоматически перекодируются согласно таблице, указанной в
+отдельной записи шрифтового файла-карты и включаемой в файл вывода.
+%%If \ttt{prologues} is set to~2, any used fonts in the output file are
+%%automatically re-encoded, and the encoding vector file specified in
+%%the fontmap entry will be embedded in the output file.
+Если \ttt{prologues} установлено в~3, то MetaPost будет также пытаться
+включить используемые PostScript\index{PostScript!шрифты} шрифты или их
+подмножества.
+%%If \ttt{prologues} is set to~3, MetaPost will also attempt to include
+%%(a subset of) the used PostScript\index{PostScript!fonts} fonts.
+Чтобы это работало, нужно получение информации из шрифтового
+файла-карты.
+%For this to work, it needs to acquire font map information.
+
+Код, основанный на шрифтовой библиотеке, используется pdf\TeX.
+%%The code is based on the font library used by pdf\TeX.
+Следуя за pdf\TeX, обнаруживаем два новых связанных с темой примитива:
+\ttindex{fontmapfile} и \ttindex{fontmapline}.
+%%Following in
+%%the footsteps of pdf\TeX, there are two new associated primitives:
+%%\ttindex{fontmapfile} and \ttindex{fontmapline}.
+Далее следует простой пример, указывающий файл-карту для шрифтов
+Latin Modern в кодировке YandY (\LaTeX\ LY1):
+%%Here is a simple
+%%example, specifying the map file for Latin Modern fonts in YandY
+%%(\LaTeX\ LY1) encoding:
+\begin{center}\begin{tabular}{l}
+\verb|prologues:=2;|\\
+\verb|fontmapfile "texnansi-lm.map";|\\
+\verb|beginfig(1);|\\
+\verb| draw "Hell|{\tt\'o, vil\'a}\verb|g" infont "texnansi-lmr10";|\\
+%%\verb| draw "HellС, vilАg" infont "texnansi-lmr10";|\\
+\verb|endfig;|
+\end{tabular}\end{center}
+
+Используя \ttt{fontmapline}, можно указать информацию о шрифте
+внутри рисунка:
+%%Using \ttt{fontmapline}, you can specify font mapping information
+%%inside the figure:
+\begin{center}\begin{tabular}{l}
+\verb|prologues:=2;|\\
+\verb|fontmapline "pplbo8r URWPalladioL-Bold "&ditto&|\\
+\verb| ".167 SlantFont"&ditto&" <8r.enc <uplb8a.pfb";|\\
+\verb|beginfig(1);|\\
+\verb| draw "Hello, world" infont "pplbo8r";|\\
+\verb|endfig;|
+\end{tabular}\end{center}
+Это будет попытка перекодировать PostScript-шрифт
+URWPalladioL-Bold\index{URWPalladioL-Bold}\index{Palatino},
+чей tfm-файл --- это pplbo8r.tfm.
+%%This will attempt to reencode the PostScript font
+%%URWPalladioL-Bold\index{URWPalladioL-Bold}\index{Palatino}
+%%whose tfm file is pplbo8r.tfm.
+Кодировка определяется в файле 8r.enc и будет включатся в файл вывода.
+%%The encoding is found in the file
+%%8r.enc, and will be included into the output file.
+
+Если этот же пример запускать с \ttt{prologues:=3}, то MetaPost будет
+включать подмножество шрифта, что расположено в uplb8a.pfb, в вывод.
+%%If the same example was run with \ttt{prologues:=3}, MetaPost would
+%%include a subset of the font that resides in uplb8a.pfb into the
+%%output.
+В этом случае подмножество шрифта перестраивается так, что оно будет
+верно закодировано на внутреннем уровне, поэтому 8r.enc не будет
+включаться.
+%%In this case, the subset of the font is reorganized so that it
+%%has the correct encoding internally, 8r.enc will not be embedded also.
+
+Аргумент к обеим командам имеет символ опционального флага в самом
+начале.
+%%The argument to both commands has an optional flag character at the very
+%%beginning.
+Этот опциональный флаг имеет то же самое значение как и в pdf\TeX:
+%%This optional flag has the same meaning as in pdf\TeX:
+$$\begin{tabular}{|c|l|} \hline
+\multicolumn1{|c|}{Опция}& \multicolumn1{c|}{Значение}\\ \hline
+%%\multicolumn1{|c|}{Option}& \multicolumn1{c|}{Meaning}\\ \hline
+ + & расширить список шрифта, игнорируя повторения \\
+%% + & extend the font list, but ignore duplicates \\
+ = & расширить список шрифта, замещая повторения \\
+%% = & extend the font list, replacing duplicates \\
+ $-$ & удалить все подходящие шрифты из списка шрифта \\
+%% $-$ & remove all matching fonts from the font list \\
+\hline
+\end{tabular}
+$$
+Без опций текущий список будет полностью замещен.
+%%Without any option, the current list will be completely replaced.
+
+Если \ttt{prologues} установлен в два или три и команды
+\ttt{fontmapfile} отсутствуют, то MetaPost будет пытаться
+найти типовой файл-карту, начиная с {\tt mpost.map}.
+%%If \ttt{prologues} is set to two or three, yet there are no
+%%\ttt{fontmapfile} statements, MetaPost will attempt to locate a
+%%default map file, with a preference to read {\tt mpost.map}.
+Если это не приведет к успеху, то он будет также пробовать {\tt troff.map}
+или {\tt pdftex.map}, в зависимости от присутствия установки режима troff.
+%%If that
+%%fails, it will also attempt either {\tt troff.map} or {\tt
+%%pdftex.map}, depending on whether or not troff mode is enabled.
+Если \ttt{prologues} установлено в~1, то MetaPost пытается читать файл с именем
+{\tt psfonts.map}, игнорируя любую команду {\tt fontmapfile}.
+%%If
+%%\ttt{prologues} is set to~1, MetaPost attempts to read a file called
+%%{\tt psfonts.map}, regardless of any {\tt fontmapfile}
+%%statement.
+Повторим, это только для обратной совместимости.
+%%Again, this is for backward compatibility only.
+
+\subsection{Оператор \texttt{infont}}
+%%\subsection{The \texttt{infont} operator}
+\label{Sinfont}
+
+Как с \TeX, так и с troff всю реальную работу по добавлению текста к
+картинке делает примитивный оператор MetaPost с именем
+{\tt infont}\index{infont?\texttt{infont}}.
+%%Regardless of whether you use \TeX\ or troff, all the real work of
+%%adding text to pictures is done by a MetaPost primitive operator called
+%%{\tt infont}\index{infont?\texttt{infont}}.
+Он --- \tdescr{первичный бинарный
+оператор}\index{первичный binop?\tdescr{первичный бинарный
+оператор}}, берущий левым аргументом \tdescr{строковую вторичность}
+и правым --- \tdescr{строковую первичность}.
+%%It is a \tdescr{primary
+%%binop}\index{primary binop?\tdescr{primary binop}} that takes a
+%%\tdescr{string secondary} as its left argument and a \tdescr{string
+%%primary} as its right argument.
+Левый аргумент --- это текст, а правый --- имя шрифта.
+%%The left argument is text, and the right argument is a font name.
+Результат операции --- это \tdescr{рисунок-вторичность}, который можно
+трансформировать многими способами.
+%%The result of the operation is a
+%%\tdescr{picture secondary} that can then be transformed in various ways.
+Одна из возможностей --- это увеличение в заданное число раз
+через синтаксис\index{scaled?\texttt{scaled}}
+$$ \descr{рисунок-вторичность}\, \hbox{\tt scaled}\, \descr{числовая первичность} $$
+%%One possibility is enlargement by a given factor via the
+%%syntax\index{scaled?\texttt{scaled}}
+%%$$ \descr{picture secondary}\, \hbox{\tt scaled}\, \descr{numeric primary} $$
+Таким образом, {\tt label(\qq text\qq,z0)} эквивалентно
+$$ \hbox{\tt label({\qq}текст{\qq} infont defaultfont scaled defaultscale, z0)} $$
+%%Thus {\tt label("text",z0)} is equivalent to
+%%$$ \hbox{\tt label("text" infont defaultfont scaled defaultscale, z0)} $$
+
+Если использовать строковую константу для левого аргумента {\tt infont} окажется
+неудобным, то можно использовать\index{char?\texttt{char}}\label{Dchar}
+$$ {\tt char}\, \descr{числовая первичность} $$
+для выбора символа по его числовой позиции в шрифте.
+%%If it is not convenient to use a string constant for the left argument of
+%%{\tt infont}, you can use\index{char?\texttt{char}}\label{Dchar}
+%%$$ {\tt char}\, \descr{numeric primary} $$
+%%to select a character based on its numeric position in the font.
+Таким образом,
+$$ \hbox{\tt char(n+64) infont \qq{ptmr8r}\qq} $$
+--- это картинка, содержащая символ {\tt n+64} шрифта \ttt{ptmr8r},
+который обычно используется \TeX\ для ссылки на Times-Roman.
+%%Thus
+%%$$ \hbox{\tt char(n+64) infont \qq{ptmr8r}\qq} $$
+%%is a picture containing character {\tt n+64} of the font \ttt{ptmr8r},
+%%which is a typical \TeX\ way to refer to Times-Roman.
+См. стр.\ \pageref{fontname} для дальнейшего обсуждения.
+%%See p.\ \pageref{fontname} for further discussion.
+
+Сам MetaPost не перекодирует свой ввод, т.~е. когда вы
+используете строку {\tt infont} для меток (вместо {\tt btex} \ldots\
+{\tt etex}), строка должна быть задана в кодировке шрифта.
+%%Bare MetaPost does not do any kind of input reencoding, so when
+%%you use {\tt infont} string for labels (instead of {\tt btex} \ldots\
+%%{\tt etex}), the string has to be specified in the font encoding.
+
+\subsection{Измерение текста}
+%%\subsection{Measuring Text}
+\label{meas}
+
+MetaPost делает доступными физические размеры \index{размер}
+картинок, генерируемых оператором {\tt infont}.
+%%MetaPost makes readily available the physical dimensions\index{size} of
+%%pictures generated by the {\tt infont} operator.
+Унарные операторы {\tt
+llcorner}\index{llcorner?\texttt{llcorner}}\label{Dcornop}, {\tt
+lrcorner}\index{lrcorner?\texttt{lrcorner}}, {\tt
+urcorner}\index{urcorner?\texttt{urcorner}}, {\tt
+ulcorner}\index{ulcorner?\texttt{ulcorner}} и {\tt
+center}\index{center?\texttt{center}}\label{Dcenter} с аргументом
+\tdescr{рисунок-первичность} возвращают углы своей ``охватывающей рамки'',
+как показано на рис.~\ref{bbox}.
+%%There are unary
+%%operators {\tt
+%%llcorner}\index{llcorner?\texttt{llcorner}}\label{Dcornop}, {\tt
+%%lrcorner}\index{lrcorner?\texttt{lrcorner}}, {\tt
+%%urcorner}\index{urcorner?\texttt{urcorner}}, {\tt
+%%ulcorner}\index{ulcorner?\texttt{ulcorner}}, and {\tt
+%%center}\index{center}\label{Dcenter} that take a \tdescr{picture
+%%primary} and return the corners of its ``bounding box'' as illustrated
+%%in Figure~\ref{bbox}.
+Оператор {\tt center} также допускает операнды
+\tdescr{путь-первичность} и \tdescr{перо-первичность}.
+%%The {\tt center} operator also accepts
+%%\tdescr{path primary} and \tdescr{pen primary} operands.
+MetaPost версии 0.30 и новее допускает для {\tt llcorner}, {\tt lrcorner}, $\ldots$
+все три типа аргументов.
+%%In MetaPost
+%%Version 0.30 and higher, {\tt llcorner}, {\tt lrcorner}, etc. accept
+%%all three argument types as well.
+
+Ограничения на тип аргумента для corner-операторов не очень важны,
+потому что их главное назначение позволить командам {\tt label} и {\tt
+dotlabel} центрировать свой текст правильно.
+%%The argument type restrictions on the corner operators are not very
+%%important because their main purpose is to allow {\tt label} and {\tt
+%%dotlabel} statements to center their text properly.
+Заранее определенный макрос\index{bbox?\texttt{bbox}}\label{Dbbox}
+$$ {\tt bbox}\, \descr{рисунок-первичность} $$
+находит прямоугольный путь, представляющий охватывающую рамку для данного
+рисунка.
+%%The predefined
+%%macro\index{bbox?\texttt{bbox}}\label{Dbbox}
+%%$$ {\tt bbox}\, \descr{picture primary} $$
+%%finds a rectangular path that represents the bounding box of a given picture.
+Если {\tt p} --- это картинка, то {\tt bbox p} эквивалентно
+$$\begin{verbatim}
+(llcorner p-{}-lrcorner p-{}-urcorner p-{}-ulcorner p-{}-cycle),
+\end{verbatim}
+$$
+за исключением того, что первое допускает небольшой промежуток вокруг {\tt p}
+как указано внутренней переменной \index{внутренние
+переменные}\index{переменные!внутренние} {\tt
+bboxmargin}\index{bboxmargin?\texttt{bboxmargin}}\label{Dbbmargin}.
+%%If {\tt p} is a picture, {\tt bbox p} is equivalent to
+%%$$\begin{verbatim}
+%%(llcorner p--lrcorner p--urcorner p--ulcorner p--cycle)}
+%%\end{verbatim}
+%%$$
+%%except that it allows for a small amount of extra space around {\tt p}
+%%as specified by the internal variable\index{internal
+%%variables}\index{variables!internal} {\tt
+%%bboxmargin}\index{bboxmargin?\texttt{bboxmargin}}\label{Dbbmargin}.
+
+\begin{figure}[htp]
+$$ \includegraphics{manfig-ru-20} $$
+\caption{Охватывающая рамка и ее угловые точки.}
+%%\caption{A bounding box and its corner points.}
+\label{bbox}
+\end{figure}
+
+Заметьте, что MetaPost вычисляет охватывающую рамку рисунка {\tt
+btex}\index{btex?\texttt{btex}} \ldots\ {\tt
+etex}\index{etex?\texttt{etex}} тем же способом, что и \TeX\index{TeX?\TeX}.
+%%Note that MetaPost computes the bounding box of a {\tt
+%%btex}\index{btex?\texttt{btex}} \ldots\ {\tt
+%%etex}\index{etex?\texttt{etex}} picture just the way
+%%\TeX\index{TeX?\TeX} does.
+Это вполне естественно, но вовлекает в рассмотрение факта того, что
+\TeX\ имеет свойства типа {\tt\string\strut}\index{strut?{\tt\string\strut}} и
+{\tt\string\rlap}\index{rlap?{\tt\string\rlap}}, что позволяют пользователям \TeX\
+лгать о размерах рамки.
+%%This is quite natural, but it has certain
+%%implications in view of the fact that \TeX\ has features like
+%%{\tt\string\strut}\index{strut?{\tt\string\strut}} and
+%%{\tt\string\rlap}\index{rlap?{\tt\string\rlap}} that allow \TeX\ users
+%%to lie about the dimensions of a box.
+
+Когда команды \TeX, лгущие о размерах рамки, транслируются в низкоуровневый
+код Meta\-Post, команда {\tt
+setbounds}\index{setbounds?\texttt{setbounds}}\label{Dsetbnd}
+лжет:\index{переменная-картинка?\tdescr{переменная-картинка}}
+$$ {\tt setbounds}\, \descr{переменная-картинка}\, {\tt to}\, \descr{выражение-путь}
+$$
+делает \tdescr{переменную-картинку} такой, как если бы ее охватывающая
+рамка была такой же как заданный путь.
+%%When \TeX\ commands that lie about the dimensions of a box are
+%%translated in to low-level MetaPost code, a {\tt
+%%setbounds}\index{setbounds?\texttt{setbounds}}\label{Dsetbnd} statement
+%%does the lying:\index{picture variable?\tdescr{picture variable}}
+%%$$ {\tt setbounds}\, \descr{picture variable}\, {\tt to}\, \descr{path expression}
+%%$$
+%%makes the \tdescr{picture variable} behave as if its bounding box were
+%%the same as the given path.
+Этот путь должен быть циклическим, т.~е. замкнутым.
+%%The path has to be a cycle, i.e., it must
+%%be a closed path.
+Для получения настоящей охватывающей рамки такой картинки присвойте
+положительное значение внутренней переменной\index{внутренние
+переменные}\index{переменные!внутренние} {\tt
+truecorners}\index{truecorners?\texttt{truecorners}}\label{Dtruecorn}:\footnote{Свойства
+{\tt setbounds} и {\tt truecorners} присутствуют только в MetaPost версии 0.30
+и новее.}, т.~е.
+$$ \hbox{\verb|show urcorner btex $\bullet$\rlap{ A} etex|} $$
+производит ``\verb|>> (4.9813,6.8078)|'', а
+$$ \hbox{\verb|truecorners:=1; show urcorner btex $\bullet$\rlap{ A} etex|} $$
+производит ``\verb|>> (15.7742,6.8078)|''.
+%%To get the true bounding box of such a
+%%picture, assign a positive value to the internal variable\index{internal
+%%variables}\index{variables!internal} {\tt
+%%truecorners}\index{truecorners?\texttt{truecorners}}\label{Dtruecorn}:\footnote{The
+%%{\tt setbounds} and {\tt truecorners} features are only found in
+%%MetaPost version 0.30 and higher.} i.e.,
+%%$$ \hbox{\verb|show urcorner btex $\bullet$\rlap{ A} etex|} $$
+%%produces ``\verb|>> (4.9813,6.8078)|'' while
+%%$$ \hbox{\verb|truecorners:=1; show urcorner btex $\bullet$\rlap{ A} etex|} $$
+%%produces ``\verb|>> (15.7742,6.8078)|.''
+
+\section{Продвинутая графика}
+%%\section{Advanced Graphics}
+\label{adv.gr}
+
+Все примеры предыдущих разделов были простым рисованием линий с добавлением
+меток.
+%%All the examples in the previous sections have been simple line drawings
+%%with labels added.
+Этот раздел описывает затенение и средства для генерации не столь простых
+линий.
+%%This section describes shading and tools for
+%%generating not-so-simple line drawings.
+Затенение делается командой {\tt fill}\index{fill?\texttt{fill}}\label{Dfill}.
+%%Shading is done with the {\tt
+%%fill}\index{fill?\texttt{fill}}\label{Dfill} statement.
+В своей простейшей форме команда {\tt fill} требует \tdescr{выражение-путь},
+задающее границу региона для заполнения.
+%%In its simplest
+%%form, the {\tt fill} statement requires a \tdescr{path expression} that
+%%gives the boundary of the region to be filled.
+В синтаксисе
+$$ {\tt fill}\, \descr{выражение-путь} $$
+аргумент должен быть циклическим путем, т.~е. путем, который описывается
+замкнутой кривой через {\tt ..cycle} или {\tt -{}-cycle}.
+%%In the syntax
+%%$$ {\tt fill}\, \descr{path expression} $$
+%%the argument should be a cyclic path, i.e., a path that describes a
+%%closed curve via the {\tt ..cycle} or {\tt --cycle} notation.
+Например, команда {\tt fill} на рис.~\ref{fig20} строит замкнутый
+путь продолжением приблизительно полукругового пути~{\tt p}.
+%%For
+%%example, the {\tt fill} statement in Figure~\ref{fig20} builds a closed
+%%path by extending the roughly semicircular path~{\tt p}.
+Этот путь имеет ориентацию против часовой стрелки, но это не имеет значение,
+потому что команда {\tt fill} использует правило ``ненулевого вертящегося
+числа''\index{вертящееся число} (non-zero winding number)
+PostScript\index{PostScript}~\cite{ad:red2}.
+%%This path has
+%%a counter-clockwise orientation, but that does not matter because the
+%%{\tt fill} statement uses PostScript's\index{PostScript} non-zero
+%%winding\index{winding number} number rule~\cite{ad:red2}.
+
+\begin{figure}[htp]
+$$ \begin{verbatim}
+beginfig(21);
+path p;
+p = (-1cm,0)..(0,-1cm)..(1cm,0);
+fill p{up}..(0,0){-1,-2}..{up}cycle;
+draw p..(0,1cm)..cycle;
+endfig;
+\end{verbatim}
+\qquad \mathcenter{\includegraphics{manfig-ru-21}}
+$$
+\caption{MetaPost код и соответствующий вывод.}
+%%\caption{MetaPost code and the corresponding output.}
+\label{fig20}
+\end{figure}
+
+Общая команда\index{withcolor?\texttt{withcolor}}\label{Dwithcolor} {\tt fill}
+$$ {\tt fill}\, \descr{выражение-путь}\,
+ {\tt withcolor}\, \descr{выражение-цвет}
+$$
+указывает уровень серого или (если у вас есть цветной принтер) некоторый
+цвет радуги.
+%%The general {\tt fill} statement\index{withcolor?\texttt{withcolor}}\label{Dwithcolor}
+%%$$ {\tt fill}\, \descr{path expression}\,
+%% {\tt withcolor}\, \descr{color expression}
+%%$$
+%%specifies a shade of gray or (if you have a color printer) some
+%%rainbow color.
+$\descr{Выражение-цвет}$ может иметь пять возможных значений,
+переводимых к четырем возможным цветовым моделям:
+%%The $\descr{color expression}$ can have five possible
+%%values, mapping to four possible color models:
+
+$$
+\begin{tabular}{ll}
+Действительный ввод & Переводимое значение\\\hline
+%%Actual input & Remapped meaning\\\hline
+{\tt withcolor} $\descr{rgb-цвет} c$ & withrgbcolor\index{withrgbcolor?\texttt{withrgbcolor}}\label{Dwithrgbcolor} $c$\\
+%%{\tt withcolor} $\descr{rgbcolor} c$ & %%withrgbcolor\index{withrgbcolor?\texttt{withrgbcolor}}\label{Dwithrgbcolor} $c$\\
+{\tt withcolor} $\descr{cmyk-цвет} c$ & withcmykcolor\index{withrgbcolor?\texttt{withcmykcolor}}\label{Dwithcmykcolor} $c$\\
+%%{\tt withcolor} $\descr{cmykcolor} c$ & %%withcmykcolor\index{withrgbcolor?\texttt{withcmykcolor}}\label{Dwithcmykcolor} $c$\\
+{\tt withcolor} $\descr{число} c$ & withgreyscale\index{withrgbcolor?\texttt{withgreyscale}}\label{Dwithgreyscale} $c$\\
+%%{\tt withcolor} $\descr{numeric} c$ & %%withgreyscale\index{withrgbcolor?\texttt{withgreyscale}}\label{Dwithgreyscale} $c$\\
+{\tt withcolor} $\descr{ложь}$ & withoutcolor\index{withrgbcolor?\texttt{withoutcolor}}\label{Dwithoutcolor} \\
+%%{\tt withcolor} $\descr{false}$ & %%withoutcolor\index{withrgbcolor?\texttt{withoutcolor}}\label{Dwithoutcolor} \\
+{\tt withcolor} $\descr{истина}$ & $\descr{текущая типовая модель цвета}$\\
+%%{\tt withcolor} $\descr{true}$ & $\descr{current default color model}$\\
+\end{tabular}
+$$
+
+Для указанных моделей цвета есть также
+$$ {\tt fill}\, \descr{выражение-путь}\,
+ {\tt withrgbcolor}\, \descr{выражение-rgb-цвет}
+$$
+$$ {\tt fill}\, \descr{выражение-путь}\,
+ {\tt withcmykcolor}\, \descr{выражение-cmyk-цвет}
+$$
+$$ {\tt fill}\, \descr{выражение-путь}\,
+ {\tt withgreyscale}\, \descr{число}
+$$
+$$ {\tt fill}\, \descr{выражение-путь}\,
+ {\tt withoutcolor}
+$$
+%%For the specific color models, there are also:
+%%$$ {\tt fill}\, \descr{path expression}\,
+%% {\tt withrgbcolor}\, \descr{rgbcolor expression}
+%%$$
+%%$$ {\tt fill}\, \descr{path expression}\,
+%% {\tt withcmykcolor}\, \descr{cmykcolor expression}
+%%$$
+%%$$ {\tt fill}\, \descr{path expression}\,
+%% {\tt withgreyscale}\, \descr{numeric}
+%%$$
+%%$$ {\tt fill}\, \descr{path expression}\,
+%% {\tt withoutcolor}
+%%$$
+
+Объект-изображение не может иметь более одной цветовой модели, последнее
+указание \ttt{withcolor}, \ttt{withrgbcolor}, \ttt{withcmykcolor},
+\ttt{withgreyscale} или \ttt{withoutcolor} устанавливает модель цвета
+для любого отдельного объекта.
+%%An image object cannot have more then one color model, the last
+%%\ttt{withcolor}, \ttt{withrgbcolor}, \ttt{withcmykcolor},
+%%\ttt{withgreyscale} or \ttt{withoutcolor} specification sets the color
+%%model for any particular object.
+
+Модель \ttt{withoutcolor} требует небольших разъяснений: выбор этой
+модели означает, что MetaPost не будет писать команду выбора цвета
+в выходной файл PostScript для этого объекта.
+%%The model \ttt{withoutcolor} needs a bit more explanation: selecting
+%%this model means that MetaPost will not write a color selection
+%%statement to the PostScript output file for this object.
+
+`Текущая типовая' модель цвета может быть установлена использованием
+внутренней переменной \ttindex{defaultcolormodel}.
+%%The `current default' color model can be set up using the internal
+%%variable \ttindex{defaultcolormodel}.
+Таблица~\ref{dfltcmod} перечисляет ее допустимые значения.
+\begin{table}
+\centering
+\begin{tabular}{|c|l|}
+\hline
+Значение & Модель цвета\\\hline
+1 & нет модели\\
+3 & оттенки серого\\
+5 & rgb (по-умолчанию)\\
+7 & cmyk\\
+\hline
+\end{tabular}
+\caption{Поддерживаемые модели цвета.}
+\label{dfltcmod}
+\end{table}
+%%\begin{table}
+%%\centering
+%%\begin{tabular}{|с|l|}
+%%\hline
+%%Value & Color model\\\hline
+%%1 & no model\\
+%%3 & greyscale\\
+%%5 & rgb (default)\\
+%%7 & cmyk\\
+%%\hline
+%%\end{tabular}
+%%\caption{Supported color models.}
+%%\label{dfltcmod}
+%%\end{table}
+
+Рис.~\ref{fig21} иллюстрирует несколько применений команды {\tt fill} для
+заполнения областей оттенками серого.
+%%Figure~\ref{fig21} illustrates several applications of the fill command
+%%to fill areas with shades of gray.
+Пути включают пересечения кругов {\tt a} и {\tt b} и путь {\tt ab},
+охватывающий область внутри обоих кругов.
+%%The paths involved are intersecting
+%%circles {\tt a} and {\tt b} and a path {\tt ab} that bounds the region
+%%inside both circles.
+Круги {\tt a} и {\tt b} происходят от предопределенного пути {\tt
+fullcircle}\index{fullcircle?\texttt{fullcircle}}\label{Dfcirc},
+приблизительно соответствующего кругу с единичным диаметром и
+с центром в начале координат.
+%%Circles {\tt a} and {\tt b} are derived from a
+%%predefined path {\tt
+%%fullcircle}\index{fullcircle?\texttt{fullcircle}}\label{Dfcirc} that
+%%approximates a circle of unit diameter centered on the origin.
+Есть также предопределенный путь {\tt
+halfcircle}\index{halfcircle?\texttt{halfcircle}}\label{Dhcirc} ---
+половина {\tt fullcircle} над осью $x$.
+%%There is also a predefined path {\tt
+%%halfcircle}\index{halfcircle?\texttt{halfcircle}}\label{Dhcirc} that is
+%%the part of {\tt fullcircle} above the $x$ axis.
+Путь~{\tt ab} затем инициализируется, используя предопределенный макрос
+{\tt buildcycle}, который будет обсуждаться вскоре.
+%%Path~{\tt ab} is then
+%%initialized using a predefined macro {\tt buildcycle} that will be
+%%discussed shortly.
+
+\begin{figure}[htp]
+$$ \begin{verbatim}
+beginfig(22);
+path a, b, aa, ab;
+a = fullcircle scaled 2cm;
+b = a shifted (0,1cm);
+aa = halfcircle scaled 2cm;
+ab = buildcycle(aa, b);
+picture pa, pb;
+pa = thelabel(btex $A$ etex, (0,-.5cm));
+pb = thelabel(btex $B$ etex, (0,1.5cm));
+fill a withcolor .7white;
+fill b withcolor .7white;
+fill ab withcolor .4white;
+unfill bbox pa;
+draw pa;
+unfill bbox pb;
+draw pb;
+label.lft(btex $U$ etex, (-1cm,.5cm));
+draw bbox currentpicture;
+endfig;
+\end{verbatim}
+\qquad \mathcenter{\includegraphics{manfig-ru-22}}
+$$
+\caption{MetaPost код и соответствующий вывод.}
+%%\caption{MetaPost code and the corresponding output.}
+\index{fullcircle?\texttt{fullcircle}}\index{halfcircle?\texttt{halfcircle}}\index{buildcycle?\texttt{buildcycle}}
+\label{fig21}
+\end{figure}
+
+Заполнение круга {\tt a} светлым серым цветом {\tt .7white} и затем такое
+же заполнение круга {\tt b} дважды заполняет область, где круги пересекаются.
+%%Filling circle {\tt a} with the light gray color {\tt .7white} and then
+%%doing the same with circle {\tt b} doubly fills the region where the
+%%disks overlap.
+Есть правило, что каждая команда {\tt fill} присваивает данный цвет
+всем точкам покрываемого региона, уничтожая все, что там было, включая
+линии, текст и заполненные области.
+%%The rule is that each {\tt fill} statement assigns the
+%%given color to all points in the region covered, wiping out whatever was
+%%there previously including lines and text as well as filled regions.
+Таким образом, важно задавать команды {\tt fill} в правильном порядке.
+%%Thus it is important to give {\tt fill} commands in the right order.
+В примере выше перекрываемая область получает одинаковый цвет дважды,
+оставаясь светлосерой после первых двух команд {\tt fill}.
+%%In the above example, the overlap region gets the same color twice, leaving
+%%it light gray after the first two {\tt fill} statements.
+Третья команда {\tt fill} присваивает более темный цвет {\tt .4white}
+перекрываемой области.
+%%The third fill
+%%statement assigns the darker color {\tt .4white} to the overlap region.
+
+После этого круги и их пересечение получают свои окончательные цвета, но
+в них нет вырезок для меток.
+%%At this point the circles and the overlap region have their final colors
+%%but there are no cutouts for the labels.
+Вырезки получаются командами {\tt
+unfill}\index{unfill?\texttt{unfill}}\label{Dunfill}, которые
+быстро уничтожают\index{стирание} области, охватывающии {\tt bbox
+pa}\index{bbox?\texttt{bbox}} и {\tt bbox pb}.
+%%The cutouts are achieved by
+%%the {\tt unfill}\index{unfill?\texttt{unfill}}\label{Dunfill} statements
+%%that effectively erase\index{erasing} the regions bounded by {\tt bbox
+%%pa}\index{bbox?\texttt{bbox}} and {\tt bbox pb}.
+Более точно, {\tt unfill} --- это сокращение заполнения с {\tt withcolor
+background}, где {\tt background} обычно равен {\tt white}, что подходит
+при печати на белой бумаге.
+%%More precisely, {\tt
+%%unfill} is shorthand for filling {\tt withcolor background}, where {\tt
+%%background} is normally equal to {\tt white} as is appropriate for
+%%printing on white paper.
+Если необходимо, то вы можете присвоить новый цвет {\tt
+background}\index{background?\texttt{background}}\label{Dbground}.
+%%If necessary, you can assign a new color value to {\tt
+%%background}\index{background?\texttt{background}}\label{Dbground}.
+
+Метки должны быть помещены в картинки {\tt pa} и {\tt pb} для возможности
+измерения их охватывающих рамок до их рисования.
+%%The labels need to be stored in pictures {\tt pa} and {\tt pb} to allow
+%%for measuring their bounding box before actually drawing them.
+Макрос {\tt thelabel}\index{thelabel?\texttt{thelabel}} создает
+такие картинки и сдвигает их в позиции, где они готовы для рисования.
+%%The macro {\tt thelabel}\index{thelabel?\texttt{thelabel}} creates such
+%%pictures and shifts them into position so that they are ready to draw.
+Использование итоговых картинок в команде {\tt draw} в
+форме\index{draw?\texttt{draw}}
+$$ {\tt draw}\, \descr{выражение-рисунок} $$
+добавляет их к текущей картинке {\tt
+currentpicture}\index{currentpicture?\texttt{currentpicture}}
+так, что они перезаписывают часть того, что уже
+нарисовано.
+%%Using the resulting pictures in {\tt draw} statements of the
+%%form\index{draw?\texttt{draw}}
+%%$$ {\tt draw}\, \descr{picture expression} $$
+%%adds them to {\tt currentpicture}\index{currentpicture?\texttt{currentpicture}}
+%%so that they overwrite a portion of what has
+%%already been drawn.
+На рис.~\ref{fig21} перезаписываются сами белые прямоугольники,
+созданные {\tt unfill}.
+%%In Figure~\ref{fig21} just the white rectangles produced by
+%%{\tt unfill} get overwritten.
+
+\subsection{Построение циклов}
+%%\subsection{Building Cycles}
+\label{buildcy}
+
+Команда {\tt buildcycle}\index{buildcycle?\texttt{buildcycle}}
+конструирует пути для использования с макросами {\tt fill} или {\tt unfill}.
+%%The {\tt buildcycle}\index{buildcycle?\texttt{buildcycle}} command
+%%constructs paths for use with the {\tt fill} or {\tt unfill} macros.
+Когда задаются два или более путей, таких как {\tt aa} и {\tt b},
+макрос {\tt buildcycle} пытается соединить их части вместе, формируя
+циклический путь.
+%%When given two or more paths such as {\tt aa} and {\tt b}, the {\tt
+%%buildcycle} macro tries to piece them together so as to form a cyclic
+%%path.
+В рассмотренном случае путь {\tt aa} является полукругом, начинающимся
+справа от пересечения с путем {\tt b}, затем проходящим через
+{\tt b} и заканчивающимся снаружи круга слева, как показано на
+рис.~\ref{fig22}a.
+%%In this case path {\tt aa} is a semicircle that starts just to
+%%the right of the intersection with path {\tt b}, then passes through
+%%{\tt b} and ends just outside the circle on the left as shown in
+%%Figure~\ref{fig22}a.
+
+Рис.~\ref{fig22}b показывает как {\tt buildcycle} формирует замкнутый цикл
+из кусков путей {\tt aa} и {\tt b}.
+%%Figure~\ref{fig22}b shows how {\tt buildcycle} forms a closed cycle from
+%%the pieces of paths {\tt aa} and {\tt b}.
+Макрос {\tt buildcycle} находит два пересечения\index{пересечения},
+помеченные 1 и 2 на рис.~\ref{fig22}b.
+%%The {\tt buildcycle} macro
+%%detects the two intersections\index{intersections} labeled 1 and 2 in
+%%Figure~\ref{fig22}b.
+Затем он конструирует циклический путь, показанный выделенным на
+рисунке, двигаясь вдоль пути {\tt aa} от пересечения~1 к пересечению~2
+и затем против часовой стрелки по пути {\tt b} обратно к пересечению~1.
+%%Then it constructs the cyclic path shown in bold
+%%in the figure by going forward along path {\tt aa} from intersection~1
+%%to intersection~2 and then forward around the counter-clockwise path
+%%{\tt b} back to intersection~1.
+Кажется очевидным, что {\tt buildcycle(a,b)} будет производить такой же
+результат, но основания для этого несколько путанные.
+%%It turns out that {\tt buildcycle(a,b)}
+%%would have produced the same result, but the reasoning behind this is a
+%%little confusing.
+
+\begin{figure}[htp]
+$$ {\includegraphics{manfig-ru-123} \atop (a)}
+ \qquad {\includegraphics{manfig-ru-223} \atop (b)}
+$$
+\caption[Демонстрация построения цикла]
+ {(a)~Полукруговой путь~{\tt aa}
+ с пунктирной линией, отмечающей путь {\tt b}; (b)~пути~{\tt aa} и {\tt b}
+ с частями, выделяемыми {\tt buildcycle} и показанными жирными линиями.}
+%%\caption[A demonstration of cycle building]
+%% {(a)~The semicircular path~{\tt aa}
+%% with a dashed line marking path {\tt b}; (b)~paths~{\tt aa} and {\tt b}
+%% with the portions selected by {\tt buildcycle} shown by heavy lines.}
+\label{fig22}
+\end{figure}
+
+Проще всего использовать макрос {\tt buildcycle} в ситуациях, подобных
+рис.~\ref{fig23}, где есть более двух аргументов-путей и каждая пара
+последовательных путей имеет уникальное пересечение.
+%%It is a easier to use the {\tt buildcycle} macro in situations like
+%%Figure~\ref{fig23} where there are more than two path arguments and each
+%%pair of consecutive paths has a unique intersection.
+Например, прямая~{\tt q0.5} и кривая~{\tt p2} пересекаются только
+в точке~$P$; кривая {\tt p2} и прямая ~{\tt q1.5} --- только в точке~$Q$.
+%%For instance, the
+%%line~{\tt q0.5} and the curve~{\tt p2} intersect only at point~$P$; and
+%%the curve {\tt p2} and the line~{\tt q1.5} intersect only at point~$Q$.
+Фактически каждая из точек $P$, $Q$, $R$, $S$ является уникальным
+пересечением и результат\index{buildcycle?\texttt{buildcycle}} команды
+$$ \hbox{\tt buildcycle(q0.5, p2, q1.5, p4)} $$
+берет {\tt q0.5} от $S$ до~$P$, затем {\tt p2} от $P$ до~$Q$, затем
+{\tt q1.5} от $Q$ до~$R$ и, наконец, {\tt p4} от $R$ обратно до~$S$.
+%%In fact, each of the points $P$, $Q$, $R$, $S$ is a unique intersection,
+%%and the result of\index{buildcycle?\texttt{buildcycle}}
+%%$$ \hbox{\tt buildcycle(q0.5, p2, q1.5, p4)} $$
+%%takes {\tt q0.5} from $S$ to~$P$, then {\tt p2} from $P$ to~$Q$, then
+%%{\tt q1.5} from $Q$ to~$R$, and finally {\tt p4} from $R$ back to~$S$.
+Исследование кода MetaPost для рис.~\ref{fig23} открывает, что
+вы должны идти назад вдоль {\tt p2} на переходе от $P$ до~$Q$.
+%%An examination of the MetaPost code for Figure~\ref{fig23} reveals that
+%%you have to go backwards along {\tt p2} in order to get from $P$ to~$Q$.
+Все работает вполне совершенно до тех пор, пока точки
+пересечения\index{пересечение} определяются уникально, но может обусловить
+неожиданные результаты, когда пары путей пересекаются более одного раза.
+%%This works perfectly well as long as the
+%%intersection\index{intersection} points are uniquely defined but it can
+%%cause unexpected results when pairs of paths intersect more than once.
+
+\begin{figure}[htp]
+$$ \begin{verbatim}
+beginfig(24);
+h=2in; w=2.7in;
+path p[], q[], pp;
+for i=2 upto 4: ii:=i**2;
+ p[i] = (w/ii,h){1,-ii}...(w/i,h/i)...(w,h/ii){ii,-1};
+endfor
+q0.5 = (0,0)--(w,0.5h);
+q1.5 = (0,0)--(w/1.5,h);
+pp = buildcycle(q0.5, p2, q1.5, p4);
+fill pp withcolor .7white;
+z0=center pp;
+picture lab; lab=thelabel(btex $f>0$ etex, z0);
+unfill bbox lab; draw lab;
+draw q0.5; draw p2; draw q1.5; draw p4;
+dotlabel.top(btex $P$ etex, p2 intersectionpoint q0.5);
+dotlabel.rt(btex $Q$ etex, p2 intersectionpoint q1.5);
+dotlabel.lft(btex $R$ etex, p4 intersectionpoint q1.5);
+dotlabel.bot(btex $S$ etex, p4 intersectionpoint q0.5);
+endfig;
+\end{verbatim}
+\atop \mathcenter{\includegraphics{manfig-ru-24}}
+$$
+\caption{MetaPost-код и соответствующий вывод.}
+%%\caption{MetaPost code and the corresponding output.}
+\label{fig23}
+\end{figure}
+
+Общее правило для макроса {\tt buildcycle}:
+$$ \hbox{\tt buildcycle(}p_1\hbox{\tt,}\, p_2\hbox{\tt,}\,
+ p_3\hbox{\tt,}\, \ldots \hbox{\tt,} p_k \hbox{\tt )}
+$$
+выбирает пересечение между каждым $p_i$ и $p_{i+1}$ так, чтобы это
+было как можно дальше на $p_i$ и как можно ближе на
+$p_{i+1}$\footnote{Первым находится пересечение между $p_k$ и $p_1$,
+затем $p_1$ и $p_2$, $\ldots$ (прим. перев.)}.
+%%The general rule for the {\tt buildcycle} macro is that
+%%$$ \hbox{\tt buildcycle(}p_1\hbox{\tt,}\, p_2\hbox{\tt,}\,
+%% p_3\hbox{\tt,}\, \ldots \hbox{\tt,} p_k \hbox{\tt )}
+%%$$
+%%chooses the intersection between each $p_i$ and $p_{i+1}$ to be as late
+%%as possible on $p_i$ and as early as possible on $p_{i+1}$.
+Нет простого правила для разрешения конфликтов между этими двумя целями,
+так что вам следует избегать случаев, когда одна точка пересечения случается
+дальше на $p_i$ и другая точка пересечения\index{пересечение} случается
+ближе на $p_{i+1}$.
+%%There is no
+%%simple rule for resolving conflicts between these two goals, so you
+%%should avoid cases where one intersection point occurs later on $p_i$
+%%and another intersection\index{intersection} point occurs earlier on
+%%$p_{i+1}$.
+
+Установка на самые дальние пересечения для $p_i$ и самые ближние для
+$p_{i+1}$ ведет к устранения неясности предпочтением идущих впереди
+подпутей.
+%%The preference for intersections as late as possible on $p_i$ and as
+%%early as possible on $p_{i+1}$ leads to ambiguity resolution in favor of
+%%forward-going subpaths.
+Для циклических путей, как путь~{\tt b} на
+рис.~\ref{fig22}, ``близко'' и ``далеко'' относительны по отношению
+к начальной/конечной точке, которая расположена там, куда вы попадаете
+обратно, сказав ``{\tt ..cycle}''.
+%%For cyclic paths such as path~{\tt b} in
+%%Figure~\ref{fig22} ``early'' and ``late'' are relative to a start/finish
+%%point which is where you get back to when you say ``{\tt ..cycle}''.
+Для пути~{\tt b} эта точка устанавливается на самую правую точку на круге.
+%%For the path~{\tt b}, this turns out to be the rightmost point on the
+%%circle.
+
+Более прямой путь для работы с путевыми пересечениями в использовании
+\tdescr{вторичного бинарного
+оператора}\index{вторичный binop?\tdescr{вторичный бинарный оператор}}
+{\tt
+intersection\-point}\index{intersectionpoint?\texttt{intersectionpoint}}\label{Disecpt},
+находящего точки $P$, $Q$, $R$ и~$S$ на рис.~\ref{fig23}.
+%%A more direct way to deal with path intersections is via the
+%%\tdescr{secondary binop}\index{secondary binop?\tdescr{secondary binop}}
+%%{\tt
+%%intersection\-point}\index{intersectionpoint?\texttt{intersectionpoint}}\label{Disecpt}
+%%that finds the points $P$, $Q$, $R$, and~$S$ in Figure~\ref{fig23}.
+Этот макрос находит точку, где два данных пути пересекаются.
+%%This macro finds a point where two given paths intersect.
+Если существует более одной точки пересечения, то он выбирает одну; если
+точек пересечения нет, то макрос генерирует сообщение об ошибке.
+%%If there is
+%%more than one intersection point, it just chooses one; if there is no
+%%intersection, the macro generates an error message.
+
+\subsection{Параметрическая работа с путями}
+%%\subsection{Dealing with Paths Parametrically}
+
+Макрос {\tt
+intersectionpoint}\index{intersectionpoint?\texttt{intersectionpoint}}
+основан на примитивной операции с именем {\tt
+intersectiontimes}\index{intersectiontimes?\texttt{intersectiontimes}}\label{Disectt}.
+%%The {\tt
+%%intersectionpoint}\index{intersectionpoint?\texttt{intersectionpoint}}
+%%macro is based on a primitive operation called {\tt
+%%intersectiontimes}\index{intersectiontimes?\texttt{intersectiontimes}}\label{Disectt}.
+Этот \tdescr{вторичный бинарный оператор} --- один из нескольких операторов,
+работающих с путями параметрически.
+%%This \tdescr{secondary binop} is one of several operations that deal
+%%with paths parametrically.
+Он находит пересечение между двумя путями, заданием параметра ``время'' на
+каждом из путей.
+%%It locates an intersection between two paths
+%%by giving the ``time'' parameter on each path.
+Это ссылка на схему параметризации из раздела~\ref{curves}, определяющего
+пути как кусочные кубические кривые $\bigl(X(t),Y(t)\bigr)$, где диапазон $t$
+от нуля до числа отрезков кривой.
+%%This refers to the
+%%parameterization scheme from Section~\ref{curves} that described paths
+%%as piecewise cubic curves $\bigl(X(t),Y(t)\bigr)$ where $t$ ranges from
+%%zero to the number of curve segments.
+Другими словами, путь задается, как проходящий через последовательность
+точек, где $t=0$ в первой точке, $t=1$ в следующей, $t=2$ в следующей и т.~д.
+%%In other words, when a path is
+%%specified as passing through a sequence of points, where $t=0$ at the
+%%first point, then $t=1$ at the next, and $t=2$ at the next, etc.
+Результатом
+$$ \hbox{\tt a intersectiontimes b} $$
+будет $(-1,-1)$, если пересечения нет; в противном случае, вы получите
+пару $(t_a,t_b)$, где $t_a$ --- это время на пути {\tt a}, когда он
+пересекает путь~{\tt b}, и $t_b$ --- это соответствующее время на
+пути~{\tt b}.
+%%The result of
+%%$$ \hbox{\tt a intersectiontimes b} $$
+%%is $(-1,-1)$ if there is no intersection; otherwise you get
+%%a pair $(t_a,t_b)$, where $t_a$ is a time on path {\tt a} when it intersects
+%%path~{\tt b}, and $t_b$ is the corresponding time on path~{\tt b}.
+Например, предположим, что путь~{\tt a} обозначен тонкой линией на
+рис.~\ref{fig24} и путь~{\tt b} обозначен более толстой линией.
+%%For example, suppose path~{\tt a} is denoted by the thin line in
+%%Figure~\ref{fig24} and path~{\tt b} is denoted by the thicker line.
+Если метки показывают значения времени на путях, то пара значений времени,
+вычисленная в
+$$ \hbox{\tt a intersectiontimes b} $$
+должна быть одной из
+$$ (0.25,1.77),\ (0.75,1.40) {\rm или}\ (2.58,0.24) $$
+и какая из трех будет выбрана зависит от интерпретатора MetaPost.
+%%If
+%%the labels indicate time values on the paths, the pair of time values
+%%computed by
+%%$$ \hbox{\tt a intersectiontimes b} $$
+%%must be one of
+%%$$ (0.25,1.77),\ (0.75,1.40), {\rm or}\ (2.58,0.24), $$
+%%depending on which of the three intersection points is chosen by the
+%%MetaPost interpreter.
+Точное правило выбора из многих точек пересечения несколько сложноватое, но
+в данном примере вы получите $(0.25,1.77)$.
+%%The exact rules for choosing among multiple
+%%intersection points are a little complicated, but it turns out that you
+%%get the time values $(0.25,1.77)$ in this example.
+Меньшие значения времени предпочтительнее больших, так что $(t_a,t_b)$
+предпочтительнее, чем $(t'_a,t'_b)$ пока $t_a<t'_a$ и $t_b<t'_b$.
+%%Smaller time values
+%%are preferred over larger ones so that $(t_a,t_b)$ is preferred to
+%%$(t'_a,t'_b)$ whenever $t_a<t'_a$ and $t_b<t'_b$.
+Когда нет простого способа минимизировать обе компоненты $t_a$ и $t_b$,
+$t_a$ получает больший приоритет, но правила становятся более сложными,
+когда между $t_a$ и $t'_a$\index{пересечение} нет целых чисел.
+%%When no single
+%%alternative minimizes both the $t_a$ and $t_b$ components the $t_a$
+%%component tends to get priority, but the rules get more complicated when
+%%there are no integers between $t_a$ and $t'_a$\index{intersection}.
+(Больше деталей см. в {\sl The \MF book} \cite[Chapter 14]{kn:c}).
+%%(For more details, see {\sl The \MF book} \cite[Chapter 14]{kn:c}).
+
+\begin{figure}[htp]
+$$ \includegraphics{manfig-ru-25} $$
+\caption{Два пересекающихся пути с отметками значений времени на каждом.}
+%%\caption{Two intersecting paths with time values marked on each path.}
+\label{fig24}
+\end{figure}
+
+Оператор {\tt intersectiontimes} более гибкий, чем {\tt
+intersectionpoint}, потому что существует много всего, что можно сделать
+со значениями времени на пути.
+%%The {\tt intersectiontimes} operator is more flexible than {\tt
+%%intersectionpoint} because there are a number of things that can be done
+%%with time values on a path.
+Одно из самых важных --- это задать вопрос: ``Где проходит путь {\tt p} во
+время {\tt t}?''
+%%One of the most important is just to ask
+%%``where is path {\tt p} at time {\tt t}?''
+Конструкция\index{point
+of?\texttt{point of}}\label{Dpntof}
+$$ {\tt point}\, \descr{числовое выражение}\, {\tt of}\, \descr{путь-первичность} $$
+отвечает на этот вопрос.
+%%The construction\index{point
+%%of?\texttt{point of}}\label{Dpntof}
+%%$$ {\tt point}\, \descr{numeric expression}\, {\tt of}\, \descr{path primary} $$
+%%answers this question.
+Если \tdescr{числовое выражение} меньше нуля или больше
+значения времени, присвоенного последней точке на пути, то
+конструкция {\tt point of} обычно возвращает последнюю точку пути.
+%%If the \tdescr{numeric expression} is less than
+%%zero or greater than the time value assigned to the last point on the
+%%path, the {\tt point of} construction normally yields an endpoint of the
+%%path.
+Поэтому принято использовать предопределенную константу {\tt
+infinity}\index{infinity?\texttt{infinity}}\label{Dinf} (равную
+4095.99998) как \tdescr{числовое выражение} в конструкции {\tt point of},
+когда имеем дело с концом пути.
+%%Hence, it is common to use the predefined constant {\tt
+%%infinity}\index{infinity?\texttt{infinity}}\label{Dinf} (equal to
+%%4095.99998) as the \tdescr{numeric expression} in a {\tt point of}
+%%construction when dealing with the end of a path.
+
+Такое ``бесконечное'' значение времени не работает для циклического пути,
+т.~к. значения времени, выходящие за нормальный диапазон, могут в этом
+случае обрабатываться модульной арифметикой, т.~е. для циклического пути~{\tt p}
+через точки $z_0$, $z_1$, $z_2$, \ldots, $z_{n-1}$ с обычным
+диапазоном параметров $0\leqslant t<n$,
+$$ \hbox{\tt point t of p} $$
+может быть вычислено для любого~$t$ предварительным взятием $t$ по модулю~$n$.
+%%Such ``infinite'' time values do not work for a cyclic path, since time
+%%values outside of the normal range can be handled by modular arithmetic
+%%in that case; i.e., a cyclic path~{\tt p} through points $z_0$, $z_1$,
+%%$z_2$, \ldots, $z_{n-1}$ has the normal parameter range $0\le t<n$, but
+%%$$ \hbox{\tt point t of p} $$
+%%can be computed for any~$t$ by first reducing $t$ modulo~$n$.
+Если модуль $n$ недоступен, то\index{length?\texttt{length}}\label{Dlength}
+$$ {\tt length}\, \descr{путь-первичность} $$
+дает целое значение верхнего предела нормального диапазона параметра-времени
+для заданного пути.
+%%If the
+%%modulus~$n$ is not readily
+%%available,\index{length?\texttt{length}}\label{Dlength}
+%%$$ {\tt length}\, \descr{path primary} $$
+%%gives the integer value of the upper limit of the normal time parameter
+%%range for the specified path.
+
+MetaPost использует такие же соответствия между значениями времени
+и точками на пути при вычислении оператора {\tt
+subpath}\index{subpath?\texttt{subpath}}\label{Dsubpth}.
+%%MetaPost uses the same correspondence between time values and points on
+%%a path to evaluate the {\tt
+%%subpath}\index{subpath?\texttt{subpath}}\label{Dsubpth} operator.
+Синтаксис этого оператора
+$$ {\tt subpath}\, \descr{выражение-пара}\, {\tt of}\, \descr{путь-первичность} $$
+%%The syntax for this operator is
+%%$$ {\tt subpath}\, \descr{pair expression}\, {\tt of}\, \descr{path primary} $$
+Если значение \tdescr{выражения-пары} будет $(t_1,t_2)$ и
+\tdescr{путь-первичность} --- это $p$, то результат будет путем, что
+следует как и $p$ от {\tt point $t_1$ of $p$} до {\tt point $t_2$ of $p$}.
+%%If the value of the \tdescr{pair expression} is $(t_1,t_2)$ and the
+%%\tdescr{path primary} is $p$, the result is a path that follows $p$ from
+%%{\tt point $t_1$ of $p$} to {\tt point $t_2$ of $p$}.
+Если $t_2<t_1$, то подпуть идет обратно вдоль~$p$.
+%%If $t_2<t_1$, the subpath runs backwards along~$p$.
+
+Важный оператор, основанный на операторе {\tt subpath}, --- это
+\tdescr{третичный бинарный оператор}\index{третичный binop?\tdescr{третичный бинарный оператор}}
+{\tt cutbefore}\index{cutbefore?\texttt{cutbefore}}\label{Dcutb}.
+%%An important operation based on the {\tt subpath} operator is the
+%%\tdescr{tertiary binop}\index{tertiary binop?\tdescr{tertiary binop}}
+%%{\tt cutbefore}\index{cutbefore?\texttt{cutbefore}}\label{Dcutb}.
+Для пересекающихся путей $p_1$ и $p_2$,
+$$ p_1\ {\tt cutbefore}\ p_2 $$
+эквивалентно
+$$ \hbox{\tt subpath (xpart($p_1$ intersectiontimes $p_2$), length $p_1$) of $p_1$}
+$$
+с тем исключением, что он также устанавливает переменную-путь {\tt
+cuttings}\index{cuttings?\texttt{cuttings}}\label{Dcuttings} в часть
+$p_1$, что отбрасывается.
+%%For intersecting paths $p_1$ and $p_2$,
+%%$$ p_1\ {\tt cutbefore}\ p_2 $$
+%%is equivalent to
+%%$$ \hbox{\tt subpath (xpart($p_1$ intersectiontimes $p_2$), length $p_1$) of $p_1$}
+%%$$
+%%except that it also sets the path variable {\tt
+%%cuttings}\index{cuttings?\texttt{cuttings}}\label{Dcuttings} to the
+%%portion of $p_1$ that gets cut off.
+Другими словами, {\tt cutbefore} возвращает свой первый аргумент без
+части до пересечения.
+%%In other words, {\tt cutbefore}
+%%returns its first argument with the part before the intersection cut
+%%off.
+При множественных пересечениях он пытается отбросить наименьшую часть.
+%%With multiple intersections, it tries to cut off as little as
+%%possible.
+Если пути не пересекаются, то {\tt cutbefore} возвращает свой первый
+аргумент.
+%%If the paths do not intersect, {\tt cutbefore} returns its
+%%first argument.
+
+Есть также аналогичный \tdescr{третичный бинарный оператор}\index{третичный
+binop?\tdescr{третичный бинарный оператор}}, называемый {\tt
+cutafter}\index{cutafter?\texttt{cutafter}}\label{Dcuta}, который работает
+применением {\tt cutbefore} с инвертированным временем вдоль своего первого
+аргумента.
+%%There is also an analogous \tdescr{tertiary binop}\index{tertiary
+%%binop?\tdescr{tertiary binop}} called {\tt
+%%cutafter}\index{cutafter?\texttt{cutafter}}\label{Dcuta} that works by
+%%applying {\tt cutbefore} with time reversed along its first argument.
+Таким образом,
+$$ p_1\ {\tt cutafter}\ p_2 $$
+пытается отрезать часть $p_1$ после последнего пересечения с $p_2$.
+%%Thus
+%%$$ p_1\ {\tt cutafter}\ p_2 $$
+%%tries to cut off the part of $p_1$ after its last intersection with $p_2$.
+
+Другой оператор\index{direction of?\texttt{direction of}}\label{Ddirof}
+$$ {\tt direction}\, \descr{числовое выражение}\, {\tt of}\, \descr{путь-первичность}
+$$
+находит вектор в направлении \tdescr{пути-первичности}.
+%%Another operator\index{direction of?\texttt{direction of}}\label{Ddirof}
+%%$$ {\tt direction}\, \descr{numeric expression}\, {\tt of}\, \descr{path primary}
+%%$$
+%%finds a vector in the direction of the \tdescr{path primary}.
+Он определяется для любого времени, подобно конструкции {\tt point of}.
+%%This is
+%%defined for any time value analogously to the {\tt point of}
+%%construction.
+Вектор-результат имеет правильное направление и несколько произвольной размер.
+%%The resulting direction vector has the correct
+%%orientation and a somewhat arbitrary magnitude.
+Соединение конструкций {\tt point of} и {\tt direction of} дает уравнение для
+линии тангенса, как показано на рис.~\ref{fig25}.
+%%Combining {\tt point
+%%of} and {\tt direction of} constructions yields the equation for a
+%%tangent line as illustrated in Figure~\ref{fig25}.
+
+\begin{figure}[htp]
+$$ \begin{verbatim}
+beginfig(26);
+numeric scf, #, t[];
+3.2scf = 2.4in;
+path fun;
+# = .1; % Keep the function single-valued
+fun = ((0,-1#)..(1,.5#){right}..(1.9,.2#){right}..{curl .1}(3.2,2#))
+ yscaled(1/#) scaled scf;
+x1 = 2.5scf;
+for i=1 upto 2:
+ (t[i],whatever) =
+ fun intersectiontimes ((x[i],-infinity)--(x[i],infinity));
+ z[i] = point t[i] of fun;
+ z[i]-(x[i+1],0) = whatever*direction t[i] of fun;
+ draw (x[i],0)--z[i]--(x[i+1],0);
+ fill fullcircle scaled 3bp shifted z[i];
+endfor
+label.bot(btex $x_1$ etex, (x1,0));
+label.bot(btex $x_2$ etex, (x2,0));
+label.bot(btex $x_3$ etex, (x3,0));
+draw (0,0)--(3.2scf,0);
+pickup pencircle scaled 1pt;
+draw fun;
+endfig;
+\end{verbatim}
+\atop \includegraphics{manfig-ru-26}
+$$
+\caption{Код MetaPost и рисунок-результат}
+%%\caption{MetaPost code and the resulting figure}
+\label{fig25}
+\end{figure}
+
+Если вы знаете уклон и вы хотите найти точку на кривой с тангенсом, равным
+этому уклону, то нужен оператор {\tt directiontime}\index{directiontime
+of?\texttt{directiontime of}}\label{Ddtimof} --- обратный к
+{\tt direction of}.
+%%If you know a slope and you want to find a point on a curve where the
+%%tangent line has that slope, the {\tt directiontime}\index{directiontime
+%%of?\texttt{directiontime of}}\label{Ddtimof} operator inverts the {\tt
+%%direction of} operation.
+C данными вектором-уклоном и путем
+$$ {\tt directiontime}\, \descr{выражение-пара}\, {\tt of}\,
+ \descr{путь-первичность}
+$$
+возвращает числовое значение, что дает первое время~$t$, когда путь имеет
+заданное направление.
+%%Given a direction vector and a path,
+%%$$ {\tt directiontime}\, \descr{pair expression}\, {\tt of}\,
+%% \descr{path primary}
+%%$$
+%%returns a numeric value that gives the first time~$t$ when the path has
+%%the indicated direction.
+(Если такого времени нет, то результат будет $-1$.)
+%%(If there is no such time, the result is
+%%$-1$).
+Например, если {\tt a} --- это путь, нарисованный тонкой кривой на
+рис.~\ref{fig24}, то {\tt directiontime (1,1) of a} возвращает 0.2084.
+%%For example, if {\tt a} is the path drawn as a thin curve in
+%%Figure~\ref{fig24}, {\tt directiontime (1,1) of a} returns 0.2084.
+
+Есть еще предопределенный макрос \index{directionpoint
+of?\texttt{directionpoint of}}\label{Ddpntof}
+$$ {\tt directionpoint}\, \descr{выражение-пара}\, {\tt of}\,
+ \descr{путь-первичность},
+$$
+который находит первую точку на пути, где есть данное направление.
+%%There is also an predefined macro \index{directionpoint
+%%of?\texttt{directionpoint of}}\label{Ddpntof}
+%%$$ {\tt directionpoint}\, \descr{pair expression}\, {\tt of}\,
+%% \descr{path primary}
+%%$$
+%%that finds the first point on a path where a given direction is achieved.
+Макрос {\tt directionpoint} производит сообщение об ошибке, если искомое
+направление отсутствует на пути.
+%%The
+%%{\tt directionpoint} macro produces an error message if the direction does not
+%%occur on the path.
+
+Операторы {\tt
+arclength}\index{arclength?\texttt{arclength}}\label{Darclng} и {\tt
+arctime of}\index{arctime of?\texttt{arctime of}}\label{Darctim} относятся
+к ``времени'' на пути более знакомым образом, используя понятие длины
+дуги.\index{длина дуги}\footnote{Операторы {\tt arclength} и {\tt arctime}
+доступны только в MetaPost версии 0.50 и новее.}
+%%Operators {\tt
+%%arclength}\index{arclength?\texttt{arclength}}\label{Darclng} and {\tt
+%%arctime of}\index{arctime of?\texttt{arctime of}}\label{Darctim} relate
+%%the ``time'' on a path to the more familiar concept of arc
+%%length.\index{arc length}\footnote{The {\tt arclength} and {\tt arctime}
+%%operators are only found in MetaPost version 0.50 and higher.}
+Выражение
+$$ \hbox{{\tt arclength} \tdescr{путь-первичность}} $$
+выдает длину дуги пути.
+%%The expression
+%%$$ \hbox{{\tt arclength} \tdescr{path primary}} $$
+%%gives the arc length of a path.
+Если {\tt p} --- это путь и {\tt a} --- число между 0 и {\tt arclength p}, то
+$$ \hbox{\tt arctime a of p} $$
+дает время~{\tt t}, такое что
+$$ \hbox{\tt arclength subpath (0,t) of p} = {\tt a}. $$
+%%If {\tt p} is a path and {\tt a} is a number
+%%between 0 and {\tt arclength p},
+%%$$ \hbox{\tt arctime a of p} $$
+%%gives the time~{\tt t} such that
+%%$$ \hbox{\tt arclength subpath (0,t) of p} = {\tt a}. $$
+
+\subsection{Аффинные трансформации}
+%%\subsection{Affine Transformations}
+\label{transsec}
+\index{тип-трансформация}
+%%\index{transform type}
+
+Заметьте, что путь {\tt fun} на рис.~\ref{fig25} сначала конструируется как
+$$ \hbox{\verb|(0,-.1)..(1,.05){right}..(1.9,.02){right}..{curl .1}(3.2,.2)|} $$
+и затем используются операторы {\tt yscaled}\index{yscaled?\texttt{yscaled}}
+и {\tt scaled}\index{scaled?\texttt{scaled}} для настройки формы и размера
+пути.
+%%Note how path {\tt fun} in Figure~\ref{fig25} is first constructed as
+%%$$ \hbox{\verb|(0,-.1)..(1,.05){right}..(1.9,.02){right}..{curl .1}(3.2,.2)|} $$
+%%and then the {\tt yscaled}\index{yscaled?\texttt{yscaled}} and {\tt
+%%scaled}\index{scaled?\texttt{scaled}} operators are used to adjust the
+%%shape and size of the path.
+Как подсказывает название, выражение с ``{\tt yscaled 10}'' умножает
+координаты $y$ на десять так, что каждая точка $(x,y)$ исходного пути
+будет соответствовать точке $(x,10y)$ на трансформированном пути.
+%%As the name suggests, an expression
+%%involving ``{\tt yscaled 10}'' multiplies $y$ coordinates by ten so that
+%%every point $(x,y)$ on the original path corresponds to a point
+%%$(x,10y)$ on the transformed path.
+
+Вместе с {\tt scaled} и {\tt yscaled} существует семь операторов
+трансформации с аргументом числом или парой :\index{shifted?\texttt{shifted}}%
+\index{rotated?\texttt{rotated}}\index{slanted?\texttt{slanted}}\index{scaled?\texttt{scaled}}\index{xscaled?\texttt{xscaled}}%
+\index{yscaled?\texttt{yscaled}}\index{zscaled?\texttt{zscaled}}\label{Dtranop}
+%%Including {\tt scaled} and {\tt yscaled}, there are seven transformation
+%%operators that take a numeric or pair
+%%argument:\index{shifted?\texttt{shifted}}%
+%%\index{rotated?\texttt{rotated}}\index{slanted?\texttt{slanted}}\index{scaled?\texttt{%%scaled}}\index{xscaled?\texttt{xscaled}}%
+%%\index{yscaled?\texttt{yscaled}}\index{zscaled?\texttt{zscaled}}\label{Dtranop}
+\begin{eqnarray*}
+ (x,y){\tt\ shifted\ }(a,b) &=& (x+a,\, y+b); \\
+ (x,y){\tt\ rotated\ }\theta &=& (x\cos\theta-y\sin\theta,\,
+ x\sin\theta+y\cos\theta); \\
+ (x,y){\tt\ slanted\ }a &=& (x+ay,\, y); \\
+ (x,y){\tt\ scaled\ }a &=& (ax,\, ay); \\
+ (x,y){\tt\ xscaled\ }a &=& (ax,\, y); \\
+ (x,y){\tt\ yscaled\ }a &=& (x,\, ay); \\
+ (x,y){\tt\ zscaled\ }(a,b) &=& (ax-by,\, bx+ay).
+\end{eqnarray*}
+Большинство этих операторов объясняют сами себя, за исключением
+{\tt zscaled}, о котором можно думать как о произведении комплексных чисел.
+%%Most of these operations are self-explanatory except for {\tt zscaled}
+%%which can be thought of as multiplication of complex numbers.
+Эффект {\tt zscaled} $(a,b)$ --- это поворот и масштабирование так, что
+$(1,0)$ переходит в $(a,b)$.
+%%The
+%%effect of {\tt zscaled} $(a,b)$ is to rotate and scale so as to map
+%%$(1,0)$ into $(a,b)$.
+Эффект от {\tt rotated}~$\theta$ во вращении на $\theta$ градусов против
+часовой стрелки.
+%%The effect of {\tt rotated}~$\theta$ is rotate
+%%$\theta$ degrees counter-clockwise.
+
+Любая комбинация сдвигов, вращений, наклонов и т.~п. --- это аффинная
+трансформация, совокупный эффект которой в трансформации любой пары
+$(x,y)$ в
+$$ (t_x+t_{xx}x+t_{xy}y,\, t_y+t_{yx}x+t_{yy}y), $$
+для некоторой шестерки $(t_x,t_y,t_{xx},t_{xy},t_{yx},t_{yy})$.
+%%Any combination of shifting, rotating, slanting, etc.\ is an affine
+%%transformation, the net effect of which is to transform any pair $(x,y)$
+%%into
+%%$$ (t_x+t_{xx}x+t_{xy}y,\, t_y+t_{yx}x+t_{yy}y), $$
+%%for some sextuple $(t_x,t_y,t_{xx},t_{xy},t_{yx},t_{yy})$.
+Последняя информация может быть сохранена в переменной типа трансформация,
+так что {\tt
+transformed T}\index{transformed?\texttt{transformed}}\label{Dtrfrmd}
+может быть эквивалентно
+$$ \hbox{\tt xscaled -1 rotated 90 shifted (1,1)}, $$
+если {\tt T} --- это переменная-трансформация.
+%%This
+%%information can be stored in a variable of type transform so that {\tt
+%%transformed T}\index{transformed?\texttt{transformed}}\label{Dtrfrmd}
+%%might be equivalent to
+%%$$ \hbox{\tt xscaled -1 rotated 90 shifted (1,1)} $$
+%%if {\tt T} is an appropriate transform variable.
+Трансформация~{\tt T} могла быть инициализирована выражением типа
+трансформация, например,
+%%The transform~{\tt T} could then be initialized with an
+%%expression of type transform as follows:
+$$ \begin{verbatim}
+transform T;
+T = identity xscaled -1 rotated 90 shifted (1,1);
+\end{verbatim}
+$$
+Этот пример показывает, что выражения-трансформации могут строиться
+применением трансформационных операторов к другим трансформациям.
+%%As this example indicates, transform expressions can be built up by
+%%applying transformation operators to other transforms.
+Стандартная трансформация {\tt
+identity}\index{identity?\texttt{identity}}\label{Dident} --- это полезная
+отправная точка для этого процесса.
+%%The predefined transformation {\tt
+%%identity}\index{identity?\texttt{identity}}\label{Dident} is a useful
+%%starting point for this process.
+Все можно проиллюстрировать переводом уравнения выше на естественный язык:
+``{\tt T} следует быть трансформацией, такой же как {\tt identity}, затем
+масштабированной по координатам $x$ в $-1$ раз, вращенной на
+$90^\circ$ и сдвинутой на $(1,1)$.''
+%%This can be illustrated by
+%%paraphrasing the above equation for {\tt T} into English: ``{\tt T}
+%%should be the transform obtained by doing whatever {\tt identity}
+%%does.
+%%Then scaling $x$~coordinates by $-1$, rotating $45^\circ$, and
+%%shifting by $(1,1)$.''
+Это работает, потому что {\tt identity} --- тождественная трансформация,
+которая ничего не делает, т.~е. {\tt transformed identity} --- это пустой
+оператор.
+%%This works because {\tt identity} is the
+%%identity transformation which does nothing; i.e., {\tt transformed
+%%identity} is a no-op.
+
+Синтаксис для выражений-трансформаций и операторов трансформации дается на
+рис.~\ref{sytrans}.
+%%The syntax for transform expressions and transformation operators is given in
+%%Figure~\ref{sytrans}.
+Он включает две дополнительные возможности для
+\tdescr{трансформации}:\index{reflectedabout?\texttt{reflectedabout}}
+$$ \hbox{\tt reflectedabout(}p, q\hbox{\tt )} $$
+отражает относительно прямой, определяемой точками $p$ и $q$
+и\index{rotatedaround?\texttt{rotatedaround}}
+$$ \hbox{\tt rotatedaround(}p,\theta\hbox{\tt )} $$
+вращает на $\theta$ градусов против часовой стрелки вокруг точки $p$.
+%%It includes two more options for
+%%\tdescr{transformer}:\index{reflectedabout?\texttt{reflectedabout}}
+%%$$ \hbox{\tt reflectedabout(}p, q\hbox{\tt )} $$
+%%reflects about the line defined by points $p$ and $q$;
+%%and\index{rotatedaround?\texttt{rotatedaround}}
+%%$$ \hbox{\tt rotatedaround(}p,\theta\hbox{\tt )} $$
+%%rotates $\theta$ degrees counter-clockwise around point $p$.
+Например, уравнением для инициализации трансформации~{\tt T} может быть
+$$ \hbox{\tt T = identity reflectedabout((2,0), (0,2))}. $$
+%%For example,
+%%the equation for initializing transform~{\tt T} could have been
+%%$$ \hbox{\tt T = identity reflectedabout((2,0), (0,2))}. $$
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{вторичная пара} \rightarrow
+ \descr{вторичная пара} \descr{трансформация}$\\
+%%$\tt \descr{pair secondary} \rightarrow
+%% \descr{pair secondary} \descr{transformer}$\\
+$\tt \descr{путь-вторичность} \rightarrow
+ \descr{путь-вторичность} \descr{трансформация}$\\
+%%$\tt \descr{path secondary} \rightarrow
+%% \descr{path secondary} \descr{transformer}$\\
+$\tt \descr{рисунок-вторичность} \rightarrow
+ \descr{рисунок-вторичность} \descr{трансформация}$\\
+%%$\tt \descr{picture secondary} \rightarrow
+%% \descr{picture secondary} \descr{transformer}$\\
+$\tt \descr{перо-вторичность} \rightarrow
+ \descr{перо-вторичность} \descr{трансформация}$\\
+%%$\tt \descr{pen secondary} \rightarrow
+%% \descr{pen secondary} \descr{transformer}$\\
+$\tt \descr{трансформация-вторичность} \rightarrow
+ \descr{трансформация-вторичность} \descr{трансформация}$\\[6pt]
+%%$\tt \descr{transform secondary} \rightarrow
+%% \descr{transform secondary} \descr{transformer}$\\[6pt]
+$\tt \descr{трансформация} \rightarrow rotated \descr{числовая первичность}$\\
+%%$\tt \descr{transformer} \rightarrow rotated \descr{numeric primary}$\\
+$\tt \qquad \;|\; scaled \descr{числовая первичность}$\\
+%%$\tt \qquad \;|\; scaled \descr{numeric primary}$\\
+$\tt \qquad \;|\; shifted \descr{первичная пара}$\\
+%%$\tt \qquad \;|\; shifted \descr{pair primary}$\\
+$\tt \qquad \;|\; slanted \descr{числовая первичность}$\\
+%%$\tt \qquad \;|\; slanted \descr{numeric primary}$\\
+$\tt \qquad \;|\; transformed \descr{трансформация-первичность}$\\
+%%$\tt \qquad \;|\; transformed \descr{transform primary}$\\
+$\tt \qquad \;|\; xscaled \descr{числовая первичность}$\\
+%%$\tt \qquad \;|\; xscaled \descr{numeric primary}$\\
+$\tt \qquad \;|\; yscaled \descr{числовая первичность}$\\
+%%$\tt \qquad \;|\; yscaled \descr{numeric primary}$\\
+$\tt \qquad \;|\; zscaled \descr{первичная пара}$\\
+%%$\tt \qquad \;|\; zscaled \descr{pair primary}$\\
+$\tt \qquad \;|\; reflectedabout\hbox{\tt (}\descr{выражение-пара}
+ \hbox{\tt ,}\descr{выражение-пара}\hbox{\tt )}$\\
+%%$\tt \qquad \;|\; reflectedabout\hbox{\tt (}\descr{pair expression}
+%% \hbox{\tt ,}\descr{pair expression}\hbox{\tt )}$\\
+$\tt \qquad \;|\; rotatedaround\hbox{\tt (}\descr{выражение-пара}
+ \hbox{\tt ,}\descr{числовое выражение}\hbox{\tt )}$
+%%$\tt \qquad \;|\; rotatedaround\hbox{\tt (}\descr{pair expression}
+%% \hbox{\tt ,}\descr{numeric expression}\hbox{\tt )}$
+\end{ctabbing}
+\caption{Синтаксис для трансформаций и родственных операторов}
+%%\caption{The syntax for transforms and related operators}
+\label{sytrans}
+\end{figure}
+
+Есть еще унарный оператор с одним аргументом {\tt
+inverse}\index{inverse?\texttt{inverse}}\label{Dinv}, находящий
+обратную трансформацию, отменяющую эффект
+трансформации-аргумента.
+%%There is also a unary operator {\tt
+%%inverse}\index{inverse?\texttt{inverse}}\label{Dinv} that takes a
+%%transform and finds another transform that undoes the effect of the
+%%first transform.
+Таким образом, если
+$$ p = q{\tt\ transformed\ }T, $$
+то
+$$ q = p{\tt\ transformed\ inverse\ }T. $$
+%%Thus if
+%%$$ p = q{\tt\ transformed\ }T $$
+%%then
+%%$$ q = p{\tt\ transformed\ inverse\ }T. $$
+
+Нельзя брать {\tt inverse} для неизвестной
+трансформации\index{трансформация!неизвестная}, но мы уже видели, что
+можно
+$$ \hbox{\tt T = } \descr{выражение-трансформация}, $$
+когда {\tt T} еще не имеет значения.
+%%It is not legal to take the {\tt inverse} of an
+%%unknown transform\index{transformation!unknown} but we
+%%have already seen that you can say
+%%$$ \hbox{\tt T = } \descr{transform expression} $$
+%%when {\tt T} has not been given a value yet.
+Также возможно применять неизвестную трансформацию к известной паре или
+трансформации и использовать результат в линейном уравнении.
+%%It is also possible to
+%%apply an unknown transform to a known pair or transform and use the
+%%result in a linear equation.
+Три таких уравнения достаточны для определения трансформации.
+%%Three such equations are sufficient to determine a transform.
+Таким образом, уравнения
+%%Thus the equations
+$$ \begin{verbatim}
+(0,1) transformed T' = (3,4);
+(1,1) transformed T' = (7,1);
+(1,0) transformed T' = (4,-3);
+\end{verbatim}
+$$
+позволяют MetaPost определить, что трансформация {\tt T'} --- это
+комбинация вращения и масштабирования с
+%%allow MetaPost to determine that the transform {\tt T'} is a combination of
+%%rotation and scaling with
+$$\openup\jot
+ \tabskip=0pt plus 1fil
+ \halign to\displaywidth{\tabskip=0pt
+ \hfil$\displaystyle{#}$& $\displaystyle{{}#}$\hfil \qquad&
+ \hfil$\displaystyle{#}$& $\displaystyle{{}#}$\hfil
+ \tabskip=0pt plus 1fil\cr
+\noalign{\vskip-\jot}
+ t_{xx}&=4,& t_{yx}&=-3,\cr
+ t_{yx}&=3,& t_{yy}&=4,\cr
+ t_x&=0,& t_y&=0.\cr}
+$$
+
+Уравнения с неизвестными трансформациями рассматриваются как линейные
+уравнения с шестью параметрами, определяющими трансформацию.
+%%Equations involving an unknown transform are treated as linear equations
+%%in the six parameters that define the transform.
+Эти шесть параметров могут также именоваться напрямую
+как\index{xpart?\texttt{xpart}}\index{ypart?\texttt{ypart}}\index{xxpart?\texttt{xxpart}}%
+\index{xypart?\texttt{xypart}}\index{yxpart?\texttt{yxpart}}\index{yypart?\texttt{yypart}}\label{Dtrprt}
+$$ {\tt xpart\ T},\ {\tt ypart\ T},\ {\tt xxpart\ T},\ {\tt xypart\ T},\
+ {\tt yxpart\ T},\ {\tt yypart\ T},
+$$
+где {\tt T} --- это трансформация.
+%%These six parameters can also be referred to directly
+%%as\index{xpart?\texttt{xpart}}\index{ypart?\texttt{ypart}}\index{xxpart?\texttt{xxpart%%}}%
+%%\index{xypart?\texttt{xypart}}\index{yxpart?\texttt{yxpart}}\index{yypart?\texttt{yypa%%rt}}\label{Dtrprt}
+%%$$ {\tt xpart\ T},\ {\tt ypart\ T},\ {\tt xxpart\ T},\ {\tt xypart\ T},\
+%% {\tt yxpart\ T},\ {\tt yypart\ T},
+%%$$
+%%where {\tt T} is a transform.
+Например, рис.~\ref{fig27} использует уравнения
+$$ \hbox{\tt xxpart T=yypart T; yxpart T=-xypart T} $$
+для указания, что {\tt T} сохраняет форму, т.~е. является комбинацией
+вращения, сдвига и сохраняющего форму масштабирования.
+%%For instance, Figure~\ref{fig27} uses the
+%%equations
+%%$$ \hbox{\tt xxpart T=yypart T; yxpart T=-xypart T} $$
+%%to specify that {\tt T} is shape preserving; i.e., it is a combination of
+%%rotating, shifting, and uniform scaling.
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+beginfig(28);
+path p[];
+p1 = fullcircle scaled .6in;
+z1=(.75in,0)=-z3;
+z2=directionpoint left of p1=-z4;
+p2 = z1..z2..{curl1}z3..z4..{curl 1}cycle;
+fill p2 withcolor .4[white,black];
+unfill p1;
+draw p1;
+transform T;
+z1 transformed T = z2;
+z3 transformed T = z4;
+xxpart T=yypart T; yxpart T=-xypart T;
+picture pic;
+pic = currentpicture;
+for i=1 upto 2:
+ pic:=pic transformed T;
+ draw pic;
+endfor
+dotlabels.top(1,2,3); dotlabels.bot(4);
+endfig;
+\end{verbatim}
+\quad \mathcenter{\includegraphics{manfig-ru-28}}
+$$
+\caption{Код MetaPost и ``фрактальная'' картинка-результат}
+%%\caption{MetaPost code and the resulting ``fractal'' figure}
+\label{fig27}
+\end{figure}
+
+\subsection{Пунктирные линии}
+%%\subsection{Dashed Lines}
+
+Язык MetaPost предоставляет много способов изменять линии помимо простого
+изменения их толщины.
+%%The MetaPost language provides many ways of changing the appearance of a
+%%line besides just changing its width.
+Один такой способ в использовании пунктирных линий, как сделано на
+рисунках \ref{fig4} и~\ref{fig22}.
+%%One way is to use dashed lines as
+%%was done in Figures \ref{fig4} and~\ref{fig22}.
+Синтаксис для этого\index{dashed?\texttt{dashed}}\label{Ddashed} ---
+$$ {\tt draw}\, \descr{выражение-путь}\, {\tt dashed}\, \descr{образец пунктира}, $$
+где \tdescr{образец пунктира}\index{образец пунктира?\tdescr{образец пунктира}}
+--- это в действительности специальный тип \tdescr{выражения-картинки}.
+%%The syntax for this
+%%is\index{dashed?\texttt{dashed}}
+%%$$ {\tt draw}\, \descr{path expression}\, {\tt dashed}\, \descr{dash pattern} $$
+%%where a \tdescr{dash pattern}\index{dash pattern?\tdescr{dash pattern}}
+%%is really a special type of \tdescr{picture expression}.
+Есть предопределенный \tdescr{образец пунктира}, называемый {\tt
+evenly}\index{evenly?\texttt{evenly}}\label{Devenly}, делающий
+тире длиной 3 PostScript пункта, разделенные промежутками такого же
+размера.
+%%There is a predefined \tdescr{dash pattern} called {\tt
+%%evenly}\index{evenly?\texttt{evenly}}\label{Devenly} that makes dashes 3
+%%PostScript points long separated by gaps of the same size.
+Другой предопределенный образец, {\tt
+withdots}\index{withdots?\texttt{withdots}}\label{Dwdots}, производит
+точечную линию с точкой на каждые 5 PostScript пунктов.\footnote{{\tt
+withdots} есть только в MetaPost версии 0.50 и новее.}
+%%Another predefined dash pattern {\tt
+%%withdots}\index{withdots?\texttt{withdots}}\label{Dwdots} produces
+%%dotted lines with dots 5 PostScript points apart.\footnote{{\tt
+%%withdots} is only found in MetaPost version 0.50 and higher.}
+Для более разряженных точек и разряженных и удлиненных тире
+\tdescr{образец пунктира} может быть масштабирован\index{scaled?\texttt{scaled}}
+как показано на рис.~\ref{fig28}.
+%%For dots
+%%further apart or longer dashes further apart, the \tdescr{dash pattern}
+%%can be scaled\index{scaled?\texttt{scaled}} as shown in
+%%Figure~\ref{fig28}.
+
+\begin{figure}[htp]
+$$ \includegraphics{manfig-ru-29} $$
+\caption[Пунктирные линии и соответствующие образцы пунктира]
+ {Пунктирные линии, помеченные \tdescr{образцом пунктира}, используемым
+ для их создания.}
+%%\caption[Dashed lines and the corresponding dash patters]
+%% {Dashed lines each labeled with the \tdescr{dash pattern} used to create
+%% it.}
+\label{fig28}
+\end{figure}
+
+Другой способ изменить образец линии в изменении его фазы горизонтальным
+сдвигом.
+%%Another way to change a dash pattern is to alter its phase by shifting
+%%it horizontally.
+Сдвиг вправо двигает образец вперед вдоль пути, а сдвиг вправо --- назад.
+%%Shifting to the right makes the dashes move forward
+%%along the path and shifting to the left moves them backward.
+Рис.~\ref{fig29} иллюстрирует этот эффект.
+%%Figure~\ref{fig29} illustrates this effect.
+Образец пунктира можно представлять как бесконечно повторяющийся образец,
+распределенный вдоль горизонтальной линии, где участок линии справа от
+оси $y$ размещается на пути, где нужны
+разрывы\index{образец пунктира?\tdescr{образец пунктира}}.
+%%The dash pattern can be
+%%thought of as an infinitely repeating pattern strung out along a
+%%horizontal line where the portion of the line to the right of the
+%%$y$~axis is laid out along the path to be dashed\index{dash
+%%pattern?\tdescr{dash pattern}}.
+
+\begin{figure}[htp]
+$$ \includegraphics{manfig-ru-30} $$
+\caption[Пунктирные линии и соответствующие образцы пунктира]
+ {Пунктирные линии и команды MetaPost для их рисования, где {\tt e4}
+ ссылается на образец пунктира {\tt evenly scaled 4}.}
+%%\caption[Dashed lines and the corresponding dash patters]
+%% {Dashed lines and the MetaPost statements for drawing them where {\tt e4}
+%% refers to the dash pattern {\tt evenly scaled 4}.}
+\label{fig29}
+\end{figure}
+
+Когда вы сдвигаете образец пунктира, так что ось $y$ пересекает середину,
+первое тире урезается.
+%%When you shift a dash pattern so that the $y$~axis crosses the middle of
+%%a dash, the first dash gets truncated.
+Таким образом, линия с образцами пунктира {\tt e4} начинается с тире длиной
+12bp, за которым идет разрыв 12bp, за которым --- другое 12bp тире и т.~д.;
+{\tt e4 shifted (-6bp,0)} производит 6bp тире, 12 bp промежуток, затем 12bp
+тире и т.~д.
+%%Thus the line with dash pattern
+%%{\tt e4} starts with a dash of length 12bp followed by a 12bp gap and
+%%another 12bp dash, etc., while {\tt e4 shifted (-6bp,0)} produces a 6bp
+%%dash, a 12 bp gap, then a 12bp dash, etc.
+Этот образец пунктира может быть указан более прямо через функцию
+{\tt dashpattern}\index{dash
+pattern?\texttt{dashpattern}}\label{Ddshpat}:
+$$ \hbox{\tt dashpattern(on 6bp off 12bp on 6bp)} $$
+%%This dash pattern could be
+%%specified more directly via the {\tt dashpattern}\index{dash
+%%pattern?\texttt{dash pattern}}\label{Ddshpat} function:
+%%$$ \hbox{\tt dashpattern(on 6bp off 12bp on 6bp)} $$
+Пример означает ``нарисуй первые 6bp линии, затем пропусти следующие 12bp,
+затем рисуй 6bp и повторяй''.
+%%This means ``draw the first 6bp of the line, then skip the next 12bp, then draw
+%%another 6bp and repeat.''
+Если эта линия с разрывами имеет длину более 30bp, то последние 6bp первой копии
+образца линии будут соединяться с первыми 6bp следующей копии для формирования
+тире длиной 12bp.
+%%If the line to be dashed is more than 30bp long, the
+%%last 6bp of the first copy of the dash pattern will merge with the first 6bp of
+%%the next copy to form a dash 12bp long.
+Общий синтаксис для функции {\tt dashpattern} показан на рис.~\ref{sydash}.
+%%The general syntax for the
+%%{\tt dashpattern} function is shown in Figure~\ref{sydash}.
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{образец пунктира} \rightarrow dashpattern
+ \hbox{\tt (}\descr{список есть/нет}\hbox{\tt )}$\\
+%%$\tt \descr{dash pattern} \rightarrow dashpattern
+%% \hbox{\tt (}\descr{on/off list}\hbox{\tt )}$\\
+$\tt \descr{список есть/нет} \rightarrow
+ \descr{список есть/нет}\descr{пункт есть/нет} \;|\; \descr{пункт есть/нет}$\\
+%%$\tt \descr{on/off list} \rightarrow
+%% \descr{on/off list}\descr{on/off clause} \;|\; \descr{on/off clause}$\\
+$\tt \descr{пункт есть/нет} \rightarrow on \descr{числовая третичность}
+ \;|\; off \descr{числовая третичность}$
+%%$\tt \descr{on/off clause} \rightarrow on \descr{numeric tertiary}
+%% \;|\; off \descr{numeric tertiary}$
+\end{ctabbing}
+\caption{Синтаксис функции {\tt dashpattern}}
+%%\caption{The syntax for the {\tt dashpattern} function}
+\label{sydash}
+\end{figure}
+
+Из-за того, что образец пунктира в действительности является особым типом
+рисунка, функция {\tt dashpattern} возвращает рисунок.
+%%Since a dash pattern is really just a special kind of picture, the {\tt
+%%dashpattern} function returns a picture.
+Нет необходимости знать структуру такого рисунка, поэтому случайный
+читатель будет вероятно хотеть перейти к разделу~\ref{oopt}.
+%%It is not really necessary to
+%%know the structure of such a picture, so the casual reader will probably
+%%want to skip on to Section~\ref{oopt}.
+Для тех, кто хочет знать, маленький эксперимент показывает, что если
+{\tt d} --- это
+$$ \hbox{\tt dashpattern(on 6bp off 12bp on 6bp)}, $$
+то {\tt llcorner d} --- это $(0,24)$ и {\tt urcorner d} --- $(24,24)$.
+%%For those who want to know, a
+%%little experimentation shows that if {\tt d} is
+%%$$ \hbox{\tt dashpattern(on 6bp off 12bp on 6bp)}, $$
+%%then {\tt llcorner d} is $(0,24)$ and {\tt urcorner d} is $(24,24)$.
+Прямое изображение {\tt d} без использования его как образца
+произведет два тонких горизонтальных отрезка прямой, подобные таким:
+%%Drawing {\tt d} directly without using it as a dash pattern produces two
+%%thin horizontal line segments like this:
+$$ \includegraphics{manfig-ru-31} $$
+Линии в этом примере описывались, как имеющие толщину ноль, но это не имеет
+значения, потому что толщина линии игнорируется, когда рисунок используется
+как образец линии.
+%%The lines in this example are specified as having width zero, but this
+%%does not matter because the line width is ignored when a picture is used
+%%as a dash pattern.
+
+Общее правило интерпретации рисунка {\tt d}, как образца линии, в том,
+что отрезки в {\tt d} проектируются на ось $x$ и итоговый образец
+повторяется бесконечно в обоих направлениях помещением вплотную копий
+образца.
+%%The general rule for interpreting a picture {\tt d} as a dash pattern is
+%%that the line segments in {\tt d} are projected onto the $x$-axis and
+%%the resulting pattern is replicated to infinity in both directions by
+%%placing copies of the pattern end-to-end.
+Настоящие длины получаются, начиная с $x=0$, движением в положительном
+направлении $x$.
+%%The actual dash lengths are
+%%obtained by starting at $x=0$ and scanning in the positive $x$
+%%direction.
+
+Чтобы сделать идею ``повторять бесконечно'' более точной, установим
+$P({\tt d})$ проекцией {\tt d} на ось $x$ и пусть
+${\rm shift}(P({\tt d}),x)$ --- это результат сдвига {\tt d} на~$x$.
+%%To make the idea of ``replicating to infinity'' more precise, let $P({\tt d})$
+%%be the projection of {\tt d} onto the $x$~axis, and let
+%%${\rm shift}(P({\tt d}),x)$ be the result of shifting {\tt d} by~$x$.
+Образец, получающийся в результате бесконечного повторения, --- это
+$$ \bigcup_{\hbox{\scriptsize целые}\ n} {\rm shift}(P(d),\, n\cdot\ell(d)), $$
+где $\ell(d)$ измеряет длину $P(d)$.
+%%The pattern resulting from infinite replication is
+%%$$ \bigcup_{{\rm integers}\ n} {\rm shift}(P(d),\, n\cdot\ell(d)), $$
+%%where $\ell(d)$ measures the length of $P(d)$.
+Наиболее ограничивающее определение этой длины равно
+$d_{\rm max}-d_{\rm min}$, где $[d_{\rm min},d_{\rm max}]$
+--- это диапазон координат $x$ в $P(d)$.
+%%The most restrictive possible
+%%definition of this length is $d_{\rm max}-d_{\rm min}$,
+%%where $[d_{\rm min},d_{\rm max}]$
+%%is the range of $x$~coordinates in $P(d)$.
+Фактически MetaPost использует
+$$ \max(\left|y_0({\tt d})\right|,\, d_{\rm max}-d_{\rm min}), $$
+где $y_0({\tt d})$ --- это координата $y$ содержимого {\tt d}.
+%%In fact, MetaPost uses
+%%$$ \max(\left|y_0({\tt d})\right|,\, d_{\rm max}-d_{\rm min}), $$
+%%where $y_0({\tt d})$ is the $y$ coordinate of the contents of {\tt d}.
+Содержимое {\tt d} должно находиться на горизонтальной линии, но если
+это не так, то интерпретатор MetaPost просто возьмет координату $y$ внутри
+{\tt d}\index{образец пунктира?\tdescr{образец пунктира}}.
+%%The contents of {\tt d} should lie on a horizontal line, but if they do
+%%not, the MetaPost interpreter just picks a $y$~coordinate that occurs in
+%%{\tt d}\index{dash pattern?\tdescr{dash pattern}}.
+
+Картинка с образцом пунктира не должна содержать текста или заполненных
+областей, но она может содержать линии, которые пунктирные.
+%%A picture used as a dashed pattern must contain no text or filled
+%%regions, but it can contain lines that are themselves dashed.
+Это дает маленькие и большие разрывы как показано на
+рис.~\ref{fig32}.\index{образец пунктира?\tdescr{образец пунктира}!рекурсивный}
+%%This can give small dashes inside of larger dashes as shown in
+%%Figure~\ref{fig32}.\index{dash pattern?\tdescr{dash pattern}!recursive}
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+beginfig(32);
+draw dashpattern(on 15bp off 15bp) dashed evenly;
+picture p;
+p=currentpicture;
+currentpicture:=nullpicture;
+draw fullcircle scaled 1cm xscaled 3 dashed p;
+endfig;
+\end{verbatim}
+\quad \mathcenter{\includegraphics{manfig-ru-32}}
+$$
+\caption{Код MetaPost для образца пунктира и соответствующий вывод}
+%%\caption{MetaPost code for dashed patterns and the corresponding output}
+\label{fig32}
+\end{figure}
+
+\label{dashed-pens}
+Образцы пунктира также предназначены для использования с {\tt
+pencircle} или с отсутствием пера; {\tt pensquare} и других сложных
+перьев следует избегать.
+%%Also, dashed patterns are intended to be used either with {\tt
+%%pencircle} or no pen at all; {\tt pensquare} and other complex pens
+%%should be avoided.
+Последнее обусловлено тем, что вывод использует примитив PostScript
+{\tt setdash}, который не очень хорошо взаимодействует с заполненными
+путями, созданными многоугольными перьями.
+%%This is because the output uses the PostScript
+%%primitive {\tt setdash}, which does not interact well with the filled
+%%paths created by polygonal pens.
+См. раздел~\ref{sec.pens}, стр.~\pageref{sec.pens}.
+%%See Section~\ref{sec.pens}, p.\ \pageref{sec.pens}.
+
+%\newpage
+
+\subsection{Включение PostScript}
+%%\subsection{Local specials}
+
+Если вы хотите добавить код PostScript к своим объектам, то
+вы можете использовать
+$$
+{\tt withprescript} \descr{строковое выражение}%
+\index{withprescript?\texttt{withprescript}}\label{Dwithpre}
+$$
+$$
+{\tt withpostcript} \descr{строковое выражение}%
+\index{withpostscript?\texttt{withpostscript}}\label{Dwithpost}
+$$
+%%If you want to attach a special bit of PostScript code, you can use
+%%$$
+%%{\tt withprescript} \descr{string expression}
+%%$$\index{withprescript?\texttt{withprescript}}\label{Dwithpre}%
+%%and
+%%$$
+%%{\tt withpostcript} \descr{string expression}
+%%$$\index{withpostscript?\texttt{withpostscript}}\label{Dwithpost}%
+Строки-результаты будут записаны в файл вывода соответственно перед или
+после текущего объекта, начинаясь с новой строки каждая.
+%%The strings will be written to the output file before and after the
+%%current object, each beginning on their own line.
+Опции {\tt withprescript} или {\tt withpostscript} можно указывать
+многократно.
+%%You can specify
+%%multiple {\tt withprescript} or {\tt withpostscript} options if you
+%%like.
+
+Когда вы указываете более одной опции {\tt withprescript} или {\tt
+withpostscript}, будьте внимательны с фактом того, что эти скрипты используют
+вложенность: пункты {\tt withprescript} записываются в PostScript-файл
+как в стек, а пункты {\tt withpostscript} записываются как в очередь.
+%%When you specify more than one {\tt withprescript} or more than one {\tt
+%% withpostscript} option, be wary of the fact that the scripts use a
+%%form of nesting: the {\tt withprescript} items are written to the
+%%PostScript file in last in, first out order; whereas the {\tt
+%% withpostscript} items are written in first in, first out order.
+
+\subsection{Другие опции}
+%%\subsection{Other Options}
+\label{oopt}
+
+Вы могли заметить, что пунктирные линии, производимые
+{\tt dashed evenly}\index{evenly?\texttt{evenly}}, содержат
+больше черного, чем белого.
+%%You might have noticed that the dashed lines produced by {\tt dashed
+%%evenly}\index{evenly?\texttt{evenly}} appear to have more black than
+%%white.
+Это из-за эффекта параметра {\tt
+linecap}\index{linecap?\texttt{linecap}}\label{Dlinecap}, который
+управляет появлением концов линий и концов отрезков-тире.
+%%This is an effect of the {\tt
+%%linecap}\index{linecap?\texttt{linecap}}\label{Dlinecap} parameter that
+%%controls the appearance of the ends of lines as well as the ends of
+%%dashes.
+Есть также и другие способы влиять на появление того, что рисуется
+MetaPost.
+%%There are also a number of other ways to affect the appearance
+%%of things drawn with MetaPost.
+
+Параметр {\tt linecap} имеет три различных установки --- точно такие же,
+как и в PostScript.
+%%The {\tt linecap} parameter has three different settings just as in
+%%PostScript.
+Plain MetaPost дает этой внутренней переменной\index{внутренние
+переменные}\index{переменные!внутренние} типовое значение {\tt
+rounded}\index{rounded?\texttt{rounded}}, что означает рисовать
+отрезки с закругленными концами, подобно отрезку от
+{\tt z0} до {\tt z3} на рис.~\ref{fig33}.
+%%Plain MetaPost gives this internal variable\index{internal
+%%variables}\index{variables!internal} the default value {\tt
+%%rounded}\index{rounded?\texttt{rounded}} which causes line segments to
+%%be drawn with rounded ends like the segment from {\tt z0} to {\tt z3} in
+%%Figure~\ref{fig33}.
+Установка ${\tt linecap}\mathrel{\hbox{\tt:=}}{\tt
+butt}$\index{butt?\texttt{butt}}\label{Dbutt} обрезает концы так, что
+тире, производимые {\tt dashed
+evenly}\index{evenly?\texttt{evenly}}, имеют длину 3bp, а не 3bp плюс
+толщина линии.
+%%Setting ${\tt linecap}\mathrel{\hbox{\tt:=}}{\tt
+%%butt}$\index{butt?\texttt{butt}}\label{Dbutt} cuts the ends off flush so
+%%that dashes produced by {\tt dashed
+%%evenly}\index{evenly?\texttt{evenly}} have length 3bp, not 3bp plus the
+%%line width.
+Вы также можете получить концы-квадраты, выходящие за пределы указанных
+точек-концов, установкой ${\tt linecap}\mathrel{\hbox{\tt:=}}{\tt
+squared}$\index{squared?\texttt{squared}}\label{Dsqred}, как это сделано
+на линии от {\tt z2} до {\tt z5} в рис.~\ref{fig33}.
+%%You can also get squared-off ends that extend past the
+%%specified endpoints by setting ${\tt linecap}\mathrel{\hbox{\tt:=}}{\tt
+%%squared}$\index{squared?\texttt{squared}}\label{Dsqred} as was done in
+%%the line from {\tt z2} to {\tt z5} in Figure~\ref{fig33}.
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+beginfig(33);
+for i=0 upto 2:
+ z[i]=(0,40i); z[i+3]-z[i]=(100,30);
+endfor
+pickup pencircle scaled 18;
+draw z0..z3 withcolor .8white;
+linecap:=butt;
+draw z1..z4 withcolor .8white;
+linecap:=squared;
+draw z2..z5 withcolor .8white;
+dotlabels.top(0,1,2,3,4,5);
+endfig; linecap:=rounded;
+\end{verbatim}
+\qquad
+\mathcenter{\includegraphics{manfig-ru-33}}
+$$
+\caption{Код MetaPost и соответствующий вывод}
+%%\caption{MetaPost code and the corresponding output}
+\label{fig33}
+\end{figure}
+
+Другой параметр, заимствованный из PostScript, влияет на способ, которым
+команда {\tt draw} рисует углы\index{углы} на изображаемом пути.
+%%Another parameter borrowed from PostScript affects the way a {\tt draw}
+%%statement treats sharp corners\index{corners} in the path to be drawn.
+Параметр {\tt linejoin}\index{linejoin?\texttt{linejoin}}\label{Dlinejoin}
+может быть {\tt
+rounded}\index{rounded?\texttt{rounded}}\label{Drnded}, {\tt
+beveled}\index{beveled?\texttt{beveled}}\label{Dbvled} или {\tt
+mitered}\index{mitered?\texttt{mitered}}\label{Dmitred}, как показано
+на рис.~\ref{fig34}.
+%%The {\tt linejoin}\index{linejoin?\texttt{linejoin}}\label{Dlinejoin}
+%%parameter can be {\tt
+%%rounded}\index{rounded?\texttt{rounded}}\label{Drnded}, {\tt
+%%beveled}\index{beveled?\texttt{beveled}}\label{Dbvled}, or {\tt
+%%mitered}\index{mitered?\texttt{mitered}}\label{Dmitred} as shown in
+%%Figure~\ref{fig34}.
+Стандартное значение для plain MetaPost --- это {\tt
+rounded}, оно дает эффект рисования круглым пером.
+%%The default value for plain MetaPost is {\tt
+%%rounded} which gives the effect of drawing with a circular brush.
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+beginfig(34);
+for i=0 upto 2:
+ z[i]=(0,50i); z[i+3]-z[i]=(60,40);
+ z[i+6]-z[i]=(120,0);
+endfor
+pickup pencircle scaled 24;
+draw z0--z3--z6 withcolor .8white;
+linejoin:=mitered;
+draw z1..z4--z7 withcolor .8white;
+linejoin:=beveled;
+draw z2..z5--z8 withcolor .8white;
+dotlabels.bot(0,1,2,3,4,5,6,7,8);
+endfig; linejoin:=rounded;
+\end{verbatim}
+\qquad
+\mathcenter{\includegraphics{manfig-ru-34}}
+$$
+\caption{Код MetaPost и соответствующий вывод}
+%%\caption{MetaPost code and the corresponding output}
+\label{fig34}
+\end{figure}
+
+Когда {\tt linejoin} равен {\tt mitered}, углы изображаются с длинным
+острием, как показано на рис.~\ref{fig35}.
+%%When {\tt linejoin} is {\tt mitered}, sharp corners generate long
+%%pointed features as shown in Figure~\ref{fig35}.
+Из-за того, что это может быть нежелательным, есть внутренняя
+переменная\index{внутренние
+переменные}\index{переменные!внутренние} с именем {\tt
+miterlimit}\index{miterlimit?\texttt{miterlimit}}\label{Dmiterlim},
+которая управляет переходом от остроконечного соединения к срезанному
+соединению.
+%%Since this might be
+%%undesirable, there is an internal variable\index{internal
+%%variables}\index{variables!internal} called {\tt
+%%miterlimit}\index{miterlimit?\texttt{miterlimit}}\label{Dmiterlim} that
+%%controls how extreme the situation can get before the mitered join is
+%%replaced by a beveled join.
+Для Plain MetaPost {\tt miterlimit} имеет стандартное значение 10.0 и
+соединение линий обращается к срезанному тогда, когда отношение
+длины острия к толщине линии достигает этого значения.
+%%For Plain MetaPost, {\tt miterlimit} has a
+%%default value of 10.0 and line joins revert to beveled when the ratio of
+%%miter length to line width reaches this value.
+
+\begin{figure}[htp]
+$$ \includegraphics{manfig-ru-35} $$
+\caption{Длина острия и толщина линии, чье отношение ограничивается
+ {\tt miterlimit}.}
+%%\caption{The miter length and line width whose ratio is limited by
+%% {\tt miterlimit}.}
+\label{fig35}
+\end{figure}
+
+Параметры {\tt linecap}, {\tt linejoin} и {\tt miterlimit} очень
+важны, потому что они влияют и на другие рисуемые объекты.
+%%The {\tt linecap}, {\tt linejoin}, and {\tt miterlimit} parameters are
+%%especially important because they also affect things that get drawn
+%%behind the scenes.
+Например, Plain MetaPost имеет команду для рисования
+стрелок\index{стрелки} и концы стрелок получаются слегка скругленными
+при {\tt linejoin} равном {\tt rounded}.
+%%For instance, Plain MetaPost has statements for
+%%drawing arrows\index{arrows}, and the arrowheads are slightly rounded
+%%when {\tt linejoin} is {\tt rounded}.
+Эффект зависит от толщины линии и почти незаметен при стандартной толщине
+линии в 5bp, как показано на рис.~\ref{fig36}.
+%%The effect depends on the line
+%%width and is quite subtle at the default line width of 0.5bp as shown in
+%%Figure~\ref{fig36}.
+
+\begin{figure}[htp]
+$$\includegraphics{manfig-ru-36}$$
+\caption{Три способа рисовать стрелки.}
+%%\caption{Three ways of drawing arrows.}
+\label{fig36}
+\end{figure}
+
+Нарисованные стрелки, подобные тем, что на рис.~\ref{fig36}, --- это просто
+результат, когда вместо {\tt draw} \tdescr{выражение-путь}
+пишут\index{drawarrow?\texttt{drawarrow}}\label{Ddrwarr}
+$$ {\tt drawarrow}\, \descr{выражение-путь}. $$
+%%Drawing arrows like the ones in Figure~\ref{fig36} is simply a matter of
+%%saying\index{drawarrow?\texttt{drawarrow}}\label{Ddrwarr}
+%%$$ {\tt drawarrow}\, \descr{path expression} $$
+%%instead of {\tt draw} \tdescr{path expression}.
+Последнее рисует путь с наконечником стрелы в последней точке пути.
+%%This draws the given
+%%path with an arrowhead at the last point on the path.
+Если вы хотите наконечник стрелы в начале пути, то просто используйте
+унарный оператор {\tt
+reverse}\index{reverse?\texttt{reverse}}\label{Drevrse}, который из
+пути-аргумента делает обратный путь относительно времени, т.~е. для
+пути {\tt p} с {\tt length p}${}=n$,
+$$ {\tt point\ } t {\tt\ of\ reverse\ p}
+ \quad \hbox{\rm и} \quad
+ {\tt point\ } n-t {\tt\ of\ p}
+$$ --- синонимы.
+%%If you want the
+%%arrowhead at the beginning of the path, just use the unary operator {\tt
+%%reverse}\index{reverse?\texttt{reverse}}\label{Drevrse} to take the
+%%original path and make a new one with its time sense reversed; i.e., for
+%%a path~{\tt p} with {\tt length p}${}=n$,
+%%$$ {\tt point\ } t {\tt\ of\ reverse\ p}
+%% \quad {\rm and} \quad
+%% {\tt point\ } n-t {\tt\ of\ p}
+%%$$ are synonymous.
+
+Как показано на рис.~\ref{fig36}, команда, начинающаяся с
+\index{drawdblarrow?\texttt{drawdblarrow}}%
+\index{стрелки!двухконечные}\label{Ddrwdar}
+$$ {\tt drawdblarrow}\, \descr{выражение-путь}, $$
+рисует наконечники стрелок в обоих концах пути.
+%%As shown in Figure~\ref{fig36}, a statement
+%%beginning\index{drawdblarrow?\texttt{drawdblarrow}}%
+%%\index{arrows!double-headed}\label{Ddrwdar}
+%%$$ {\tt drawdblarrow}\, \descr{path expression} $$
+%%draws a double-headed arrow.
+Размер наконечника гарантируется большим, чем толщина линии, но
+возможно понадобится дополнительная настройка для очень толстых линий.
+%%The size of the arrowhead is guaranteed to
+%%be larger than the line width, but it might need adjusting if the line
+%%width is very great.
+Это делается присвоением нового значения внутренней
+переменной\index{внутренние переменные}\index{переменные!внутренние}
+{\tt ahlength}\index{ahlength?\texttt{ahlength}}\label{Dahlength},
+которая определяет длину наконечника, как показано на рис.~\ref{fig37}.
+%%This is done by assigning a new value to the
+%%internal variable\index{internal variables}\index{variables!internal}
+%%{\tt ahlength}\index{ahlength?\texttt{ahlength}}\label{Dahlength} that
+%%determines arrowhead length as shown in Figure~\ref{fig37}.
+Увеличение {\tt ahlength} более стандартного значения 4 PostScript-пункта
+до 1.5 сантиметров производит большой наконечник на рис.~\ref{fig37}.
+%%Increasing
+%%{\tt ahlength} from the default value of 4 PostScript points to 1.5
+%%centimeters produces the large arrowhead in Figure~\ref{fig37}.
+Есть еще параметр {\tt
+ahangle}\index{ahangle?\texttt{ahangle}}\label{Dahangle},
+контролирующий угол на верхушке наконечника стрелки.
+%%There
+%%is also an {\tt ahangle}\index{ahangle?\texttt{ahangle}}\label{Dahangle}
+%%parameter that controls the angle at the tip of the arrowhead.
+Типовое значение этого угла --- 45 градусов, что показано на рисунке.
+%%The default value of this angle is 45 degrees as shown in the figure.
+
+\begin{figure}[htp]
+$$ \includegraphics{manfig-ru-37} $$
+\caption[Большой наконечник стрелки с отмеченными ключевыми параметрами.]
+ {Большой наконечник стрелки с отмеченными ключевыми параметрами и
+ с выделенными белыми линиями путями для его рисования.}
+%%\caption[A large arrowhead with key parameters labeled.]
+%% {A large arrowhead with key parameters labeled and paths used to
+%% draw it marked with white lines.}
+\label{fig37}
+\end{figure}
+
+Наконечник создается заполнением треугольной области, выделенной белым
+на рис.~\ref{fig37}, и затем прорисовкой вокруг нее текущим пером.
+%%The arrowhead is created by filling the triangular region that is
+%%outlined in white in Figure~\ref{fig37} and then drawing around it with
+%%the currently picked up pen.
+Эта комбинация из заполнения и рисования может быть объединена в
+одну команду {\tt
+filldraw}\index{filldraw?\texttt{filldraw}}\label{Dfildrw}:
+$$ {\tt filldraw}\, \descr{выражение-путь}\,
+ \descr{опциональные {\tt dashed}, {\tt withcolor} и {\tt withpen} пункты};
+$$
+%%This combination of filling and drawing
+%%can be combined into a single {\tt filldraw}
+%%statement\index{filldraw?\texttt{filldraw}}\label{Dfildrw}:
+%%$$ {\tt filldraw}\, \descr{path expression}\,
+%% \descr{optional {\tt dashed} and {\tt withcolor} and {\tt withpen} clauses};
+%%$$
+\tdescr{Выражение-путь} должно быть замкнутым циклом, подобным
+треугольному пути на рис.~\ref{fig37}.
+%%The \tdescr{path expression} should be a closed cycle like the
+%%triangular path in Figure~\ref{fig37}.
+Этот путь не следует смешивать с аргументом-путем к {\tt drawarrow},
+который изображен белой линией на рисунке.
+%%This path should not be confused
+%%with the path argument to {\tt drawarrow} which is indicated by a white
+%%line in the figure.
+
+Белые линии, подобные тем, что на рисунке, могут создаваться командой
+{\tt undraw}\index{undraw?\texttt{undraw}}\label{Dundraw}.
+%%White lines like the ones in the figure can be created by an {\tt
+%%undraw}\index{undraw?\texttt{undraw}}\label{Dundraw} statement.
+Это стирающая\index{стирание} версия {\tt draw}, которая использует {\tt
+withcolor background}\index{background?\texttt{background}} так же, как и
+команда {\tt unfill}.
+%%This is
+%%an erasing\index{erasing} version of {\tt draw} that draws {\tt
+%%withcolor background}\index{background?\texttt{background}} just as the
+%%{\tt unfill} statement does.
+Есть еще команда {\tt
+unfilldraw}\index{unfilldraw?\texttt{unfilldraw}}\label{Dunfdrw}
+как раз для случая, который следует из ее названия.
+%%There is also an {\tt
+%%unfilldraw}\index{unfilldraw?\texttt{unfilldraw}}\label{Dunfdrw}
+%%statement just in case someone finds a use for it.
+
+Команды {\tt filldraw}, {\tt undraw}, {\tt unfilldraw} и все команды
+для рисования стрелок подобны командам {\tt fill} и {\tt draw}
+в том, что они могут иметь опции {\tt dashed}\index{dashed?\texttt{dashed}},
+{\tt withpen}\index{withpen?\texttt{withpen}} и {\tt
+withcolor}\index{withcolor?\texttt{withcolor}}.
+%%The {\tt filldraw}, {\tt undraw} and {\tt unfilldraw} statements and all
+%%the arrow drawing statements are like the {\tt fill} and {\tt draw}
+%%statements in that they take {\tt dashed}\index{dashed?\texttt{dashed}},
+%%{\tt withpen}\index{withpen?\texttt{withpen}}, and {\tt
+%%withcolor}\index{withcolor?\texttt{withcolor}} options.
+Когда у вас имеется много команд рисования, то удобно иметь возможность
+применить опцию, такую как {\tt withcolor 0.8white}, ко всем ним без
+повторения ее всякий раз, как на рисунках \ref{fig33} и~\ref{fig34}.
+%%When you have a
+%%lot of drawing statements it is nice to be able to apply an option such
+%%as {\tt withcolor 0.8white} to all of them without having to type this
+%%repeatedly as was done in Figures \ref{fig33} and~\ref{fig34}.
+Команда для этой цели называется\index{drawoptions?\texttt{drawoptions}}\label{Ddropts}
+$$ \hbox{\tt drawoptions(} \descr{текст} \hbox{\tt )}, $$
+где аргумент \tdescr{текст} дает последовательность опций {\tt dashed},
+{\tt withcolor} и {\tt withpen}, которые применяют автоматически ко
+всем рисующим командам.
+%%The statement for this purpose
+%%is\index{drawoptions?\texttt{drawoptions}}\label{Ddropts}
+%%$$ \hbox{\tt drawoptions(} \descr{text} \hbox{\tt )} $$
+%%where the \tdescr{text} argument gives a sequence of {\tt dashed}, {\tt
+%%withcolor}, and {\tt withpen} options to be applied automatically to all
+%%drawing statements.
+Если вы укажите
+$$ \hbox{\tt drawoptions(withcolor .5[black,white])} $$
+и затем захотите нарисовать черную линию, то вам придется
+переустановить {\tt drawoptions} указанием
+$$ {\tt draw}\, \descr{выражение-путь}\, {\tt withcolor\ black}. $$
+%%If you specify
+%%$$ \hbox{\tt drawoptions(withcolor .5[black,white])} $$
+%%and then want to draw a black line, you can override the {\tt drawoptions}
+%%by specifying
+%%$$ {\tt draw}\, \descr{path expression}\, {\tt withcolor\ black} $$
+Для отключения всех последствий {\tt drawoptions} просто используйте
+пустой список-аргумент:
+$$ \hbox{\tt drawoptions()}. $$
+%%To turn off {\tt drawoptions} all together, just give an empty list:
+%%$$ \hbox{\tt drawoptions()} $$
+(Это делается автоматически макросом {\tt
+beginfig}\index{beginfig?\texttt{beginfig}}.)
+%%(This is done automatically by the {\tt
+%%beginfig}\index{beginfig?\texttt{beginfig}} macro).
+
+Из-за того, что неверные опции игнорируются, не будет вреда от
+команды, подобной
+$$ \hbox{\tt drawoptions(dashed evenly)}, $$
+за которой идет последовательность команд {\tt draw} и {\tt fill}.
+%%Since irrelevant options are ignored, there is no harm in giving a statement
+%%like
+%%$$ \hbox{\tt drawoptions(dashed evenly)} $$
+%%followed by a sequence of {\tt draw} and {\tt fill} commands.
+Не имеет смысла использовать образец линии при заливке, поэтому
+{\tt dashed evenly} игнорируется для команд {\tt fill}.
+%%It does
+%%not make sense to use a dash pattern when filling so the {\tt dashed
+%%evenly} gets ignored for {\tt fill} statements.
+Очевидно, что
+$$ \hbox{\tt drawoptions(withpen } \descr{выражение-перо} \hbox{\tt )} $$
+влияет на команды {\tt fill} и {\tt draw}.
+%%It turns out that
+%%$$ \hbox{\tt drawoptions(withpen } \descr{pen expression} \hbox{\tt )} $$
+%%does affect {\tt fill} statements as well as {\tt draw} statements.
+Фактически существует специальная переменная-перо с именем
+{\tt currentpen}\index{currentpen?\texttt{currentpen}} такая, что
+{\tt fill} \ldots\ {\tt withpen currentpen} эквивалентно
+команде {\tt filldraw}.
+%%In fact there is a special pen variable called
+%%{\tt currentpen}\index{currentpen?\texttt{currentpen}} such that
+%%{\tt fill} \ldots\ {\tt withpen currentpen} is equivalent to a {\tt filldraw}
+%%statement.
+
+Так что же точно значит сказать, что опции рисования влияют на
+команды тогда, когда это имеет смысл?
+%%Precisely what does it mean to say that drawing options affect those
+%%statements where they make sense?
+Опция {\tt dashed} \tdescr{образец пунктира} влияет только на команды
+$$ {\tt draw}\, \descr{выражение-путь}, $$
+а появление текста в аргументе типа \tdescr{выражение-картинка} для
+команды
+$$ {\tt draw}\, \descr{выражение-картинка} $$
+меняется только опцией {\tt withcolor} \tdescr{выражение-цвет}.
+%%The {\tt dashed} \tdescr{dash
+%%pattern} option only affects
+%%$$ {\tt draw}\, \descr{path expression} $$
+%%statements, and text appearing in the \tdescr{picture expression} argument to
+%%$$ {\tt draw}\, \descr{picture expression} $$
+%%statement is only affected by the {\tt withcolor} \tdescr{color
+%%expression} option.
+Во всех других комбинациях команд и опций рисования есть некоторый
+эффект.
+%%For all other combinations of drawing statements
+%%and options, there is some effect.
+Опция, примененная к команде {\tt draw} \tdescr{выражение-картинка},
+будет, вообще говоря, влиять на некоторые части рисунка, но не все.
+%%An option applied to a {\tt draw}
+%%\tdescr{picture expression} statement will in general affect some parts
+%%of the picture but not others.
+Например, опции {\tt dashed} или {\tt withpen} будут влиять на все линии,
+но не на метки.
+%%For instance, a {\tt dashed} or {\tt
+%%withpen} option will affect all the lines in the picture but none of the
+%%labels.
+
+\subsection{Перья}
+%%\subsection{Pens}
+\label{sec.pens}
+
+Предыдущие разделы дали множество примеров типа {\tt pickup}
+\tdescr{выражение-перо} и {\tt withpen} \tdescr{выражение-перо}, но
+не было примеров, отличных от
+$$ {\tt pencircle\ scaled}\, \descr{числовая первичность}, $$
+что создавали линии указанной толщины.
+%%Previous sections have given numerous examples of {\tt pickup}
+%%\tdescr{pen expression} and {\tt withpen} \tdescr{pen expression}, but
+%%there have not been any examples of pen expressions other than
+%%$$ {\tt pencircle\ scaled}\, \descr{numeric primary} $$
+%%which produces lines of a specified width.
+Для каллиграфических эффектов, таких как на рис.~\ref{fig38}, вы
+можете применять любые трансформационные операторы, обсуждаемые в
+разделе~\ref{transsec}.
+%%For calligraphic effects
+%%such in Figure~\ref{fig38}, you can apply any of the transformation
+%%operators discussed in Section~\ref{transsec}.
+Отправной точкой для таких трансформаций служит {\tt
+pencircle}\index{pencircle?\texttt{pencircle}}\label{Dpncirc} ---
+круг диаметром один PostScript пункт.
+%%The starting point for
+%%such transformations is {\tt
+%%pencircle}\index{pencircle?\texttt{pencircle}}\label{Dpncirc}, a circle
+%%one PostScript point in diameter.
+Поэтому аффинные трансформации производят круговую или
+эллиптическую\index{перья!эллиптические} форму пера.
+%%Thus affine transformations produce a
+%%circular or elliptical\index{pens!elliptical} pen shape.
+Толщина линии, рисуемой пером, зависит от того, насколько перпендикулярна
+линия большей оси эллипса.
+%%The width of
+%%lines drawn with the pen depends on how nearly perpendicular the line is
+%%to the long axis of the ellipse.
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+beginfig(38);
+pickup pencircle scaled .2in yscaled .08 rotated 30;
+x0=x3=x4;
+z1-z0 = .45in*dir 30;
+z2-z3 = whatever*(z1-z0);
+z6-z5 = whatever*(z1-z0);
+z1-z6 = 1.2*(z3-z0);
+rt x3 = lft x2;
+x5 = .55[x4,x6];
+y4 = y6;
+lft x3 = bot y5 = 0;
+top y2 = .9in;
+draw z0--z1--z2--z3--z4--z5--z6 withcolor .7white;
+dotlabels.top(0,1,2,3,4,5,6);
+endfig;
+\end{verbatim}
+\quad \mathcenter{\includegraphics{manfig-ru-38}}
+$$
+\caption{Код MetaPost и ``каллиграфический'' рисунок-результат.}
+%%\caption{MetaPost code and the resulting ``calligraphic'' figure.}
+\label{fig38}\index{lft?\texttt{lft}}\index{bot?\texttt{bot}}\index{top?\texttt{top}}
+\end{figure}
+
+Рис.~\ref{fig38} демонстрирует операторы {\tt
+lft}\index{lft?\texttt{lft}}\label{Dlft}, {\tt
+rt}\index{rt?\texttt{rt}}\label{Drt}, {\tt
+top}\index{top?\texttt{top}}\label{Dtop} и {\tt
+bot}\index{bot?\texttt{bot}}\label{Dbot}, отвечающие на вопрос:
+``Если текущее перо поместить в заданную аргументом позицию, то где
+будут находиться левый, правый, верхний или нижний край?''
+%%Figure~\ref{fig38} demonstrates operators {\tt
+%%lft}\index{lft?\texttt{lft}}\label{Dlft}, {\tt
+%%rt}\index{rt?\texttt{rt}}\label{Drt}, {\tt
+%%top}\index{top?\texttt{top}}\label{Dtop}, and {\tt
+%%bot}\index{bot?\texttt{bot}}\label{Dbot} that answer the question, ``If
+%%the current pen is placed at the position given by the argument, where
+%%will its left, right, top, or bottom edge be?''
+На этом рисунке текущее перо является эллипсом, заданным командой
+{\tt pickup}, и его охватывающая рамка равна 0.1734 дюйма ширины и
+0.101 дюйма высоты, поэтому {\tt rt
+x3} равно ${\tt x3}+{\tt 0.0867in}$ и {\tt bot y5} равно ${\tt y5}-{\tt
+0.0505in}$.
+%%In this case the
+%%current pen is the ellipse given in the {\tt pickup} statement and its
+%%bounding box is 0.1734 inches wide and 0.1010 inches high, so {\tt rt
+%%x3} is ${\tt x3}+{\tt 0.0867in}$ and {\tt bot y5} is ${\tt y5}-{\tt
+%%0.0505in}$.
+Операторы {\tt lft}, {\tt rt}, {\tt top} и {\tt bot} могут также иметь
+аргумент типа пара --- в этом случае они вычисляют координаты $x$
+и~$y$ наиболее левой, правой, верхней или нижней точки формы пера.
+%%The {\tt lft}, {\tt rt}, {\tt top}, and {\tt bot} operators
+%%also accept arguments of type pair in which case they compute the $x$
+%%and~$y$ coordinates of the leftmost, rightmost, topmost, or bottommost
+%%point on the pen shape.
+Например,
+$$ {\tt rt}(x,y) = (x,y)+({\tt 0.0867in}, {\tt 0.0496in}) $$
+для пера на рис.~\ref{fig38}.
+%%For example,
+%%$$ {\tt rt}(x,y) = (x,y)+({\tt 0.0867in}, {\tt 0.0496in}) $$
+%%for the pen in Figure~\ref{fig38}.
+Заметьте, что {\tt
+beginfig}\index{beginfig?\texttt{beginfig}} сбрасывает текущее перо к
+стандартному значению
+$$ \hbox{\tt pencircle scaled 0.5bp} $$
+в начале каждой фигуры.
+%%Note that {\tt
+%%beginfig}\index{beginfig?\texttt{beginfig}} resets the current pen to a
+%%default value of
+%%$$ \hbox{\tt pencircle scaled 0.5bp} $$
+%%at the beginning of each figure.
+Это значение может быть также выбрано в любое время командой {\tt pickup
+defaultpen}\index{defaultpen?\texttt{defaultpen}}\label{Ddefaultpen}.
+%%This value can be reselected at any
+%%time by giving the command {\tt pickup
+%%defaultpen}\index{defaultpen?\texttt{defaultpen}}\label{Ddefaultpen}.
+
+Здесь мог бы быть конец истории о перьях, но
+для совместимости с \MF\index{metafont?\MF}, MetaPost также допускает
+многоугольные формы\index{перья!многоугольные} перьев.
+%%This would be the end of the story on pens, except that for
+%%compatibility with \MF\index{metafont?\MF}, MetaPost also allows pen
+%%shapes to be polygonal\index{pens!polygonal}.
+Есть стандартное перо с именем
+{\tt pensquare}\index{pensquare?\texttt{pensquare}}\label{Dpnsqr},
+которое можно трансформировать в перо в форме параллелограмма.
+%%There is a predefined pen
+%%called {\tt pensquare}\index{pensquare?\texttt{pensquare}}\label{Dpnsqr}
+%%that can be transformed to yield pens shaped like parallelograms.
+Фактически есть даже оператор, называемый {\tt
+makepen}\index{makepen?\texttt{makepen}}\label{Dmkpen}, берущий
+путь в форме выпуклого многоугольника и делающий перо такой же формы
+и размера.
+%%In fact, there is even an operator called {\tt
+%%makepen}\index{makepen?\texttt{makepen}}\label{Dmkpen} that takes a
+%%convex-polygon-shaped path and makes a pen that shape and size.
+Если путь не строго выпуклый или многоугольный, то оператор
+{\tt makepen} будет спрямлять края и/или сбрасывать некоторые вершины.
+%%If the
+%%path is not exactly convex or polygonal, the {\tt makepen} operator will
+%%straighten the edges and/or drop some of the vertices.
+В частности, {\tt pensquare} эквивалентно
+$$ \hbox{\tt makepen((-.5,-.5)-{}-(.5,-.5)-{}-(.5,.5)-{}-(-.5,.5)-{}-cycle)} $$
+%%In particular, {\tt pensquare} is equivalent to
+%%$$ \hbox{\tt makepen((-.5,-.5)--(.5,-.5)--(.5,.5)--(-.5,.5)--cycle)} $$
+Команды {\tt pensquare} и {\tt makepen} не должны использоваться с
+образцами пунктира.
+%%{\tt pensquare} and {\tt makepen} should not be used with dash
+%%patterns.
+См. конец раздела~\ref{sec.pens}, стр. \pageref{dashed-pens}.
+%%See the end of Section~\ref{sec.pens}, p.\ \pageref{dashed-pens}.
+
+Обратным к {\tt makepen} является оператор {\tt
+makepath}\index{makepath?\texttt{makepath}}\label{Dmkpath}, который
+берет \tdescr{перо-первичность} и возвращает соответствующий путь.
+%%The inverse of {\tt makepen} is the {\tt
+%%makepath}\index{makepath?\texttt{makepath}}\label{Dmkpath} operator that
+%%takes a \tdescr{pen primary} and returns the corresponding path.
+Поэтому {\tt makepath pencircle} производит круговой путь, идентичный {\tt
+fullcircle}\index{fullcircle?\texttt{fullcircle}}.
+%%Thus
+%%{\tt makepath pencircle} produces a circular path identical to {\tt
+%%fullcircle}\index{fullcircle?\texttt{fullcircle}}.
+Это также работает для многоугольного пера, так что
+$$ {\tt makepath\ makepen}\, \descr{выражение-путь} $$
+будет брать любой циклический путь и обращать его в выпуклый
+многоугольник\index{выпуклые многоугольники}.
+%%This also works for
+%%a polygonal pen so that
+%%$$ {\tt makepath\ makepen}\, \descr{path expression} $$
+%%will take any cyclic path and turn it into a convex polygon\index{convex %%polygons}.
+
+\subsection{Вырезка и низкоуровневые команды рисования}
+%%\subsection{Clipping and Low-Level Drawing Commands}
+
+Команды рисования, такие как {\tt draw}, {\tt fill}, {\tt filldraw} и
+{\tt unfill}, --- это части макропакета Plain\index{макросы Plain},
+определенные через более примитивные команды.
+%%Drawing statements such as {\tt draw}, {\tt fill}, {\tt filldraw}, and
+%%{\tt unfill} are part of the Plain macro\index{Plain macros} package and
+%%are defined in terms of more primitive statements.
+Основная разница между командами рисования, рассмотренными в
+предыдущих разделах, и более примитивными в том, что все примитивные
+команды рисования требуют указания переменной-картинки для хранения
+результатов.
+%%The main difference
+%%between the drawing statements discussed in previous sections and the
+%%more primitive versions is that the primitive drawing statements all
+%%require you to specify a picture variable to hold the results.
+Для команд {\tt fill}, {\tt draw} и родственных им, результаты всегда
+направляются в переменную-картинку с именем {\tt
+currentpicture}\index{currentpicture?\texttt{currentpicture}}\label{Dcurpic}.
+%%For {\tt
+%%fill}, {\tt draw}, and related statements, the results always go to a
+%%picture variable called {\tt
+%%currentpicture}\index{currentpicture?\texttt{currentpicture}}\label{Dcurpic}.
+Синтаксис для примитивных команд рисования, позволяющий указывать
+переменную-картинку, показан на рис.~\ref{sydraw}.
+%%The syntax for the primitive drawing statements that allow you to
+%%specify a picture variable is shown in Figure~\ref{sydraw}.
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{команда addto} \rightarrow$\\
+%%$\tt \descr{addto command} \rightarrow$\\
+$\tt \qquad addto \descr{переменная-картинка} also
+ \descr{выражение-картинка} \descr{список опций}$\\
+%%$\tt \qquad addto \descr{picture variable} also
+%% \descr{picture expression} \descr{option list}$\\
+$\tt \qquad \;|\; addto \descr{переменная-картинка}
+ contour \descr{выражение-путь} \descr{список опций}$\\
+%%$\tt \qquad \;|\; addto \descr{picture variable}
+%% contour \descr{path expression} \descr{option list}$\\
+$\tt \qquad \;|\; addto \descr{переменная-картинка}
+ doublepath \descr{выражение-путь} \descr{список опций}$\\
+%%$\tt \qquad \;|\; addto \descr{picture variable}
+%% doublepath \descr{path expression} \descr{option list}$\\
+$\tt \descr{список опций} \rightarrow \descr{пусто} \;|\;
+ \descr{опция рисования} \descr{список опций}$\\
+%%$\tt \descr{option list} \rightarrow \descr{empty} \;|\;
+%% \descr{drawing option} \descr{option list}$\\
+$\tt \descr{опция рисования} \rightarrow withcolor \descr{выражение-цвет}$\\
+%%$\tt \descr{drawing option} \rightarrow withcolor \descr{color expression}$\\
+$\tt \qquad \;|\; withrgbcolor \descr{выражение-rgb-цвет} \;|\;
+ withcmykcolor \descr{выражение-cmyk-цвет}$\\
+%%$\tt \qquad \;|\; withrgbcolor \descr{rgbcolor expression} \;|\;
+%% withcmykcolor \descr{cmykcolor expression}$\\
+$\tt \qquad \;|\; withgreyscale \descr{числовое выражение} \;|\;
+ withoutcolor$\\
+%%$\tt \qquad \;|\; withgreyscale \descr{numeric expression} \;|\;
+%% withoutcolor$\\
+$\tt \qquad \;|\; withprescript \descr{строковое выражение} \;|\;
+ withpostscript \descr{строковое выражение}$\\
+%%$\tt \qquad \;|\; withprescript \descr{string expression} \;|\;
+%% withpostscript \descr{string expression}$\\
+$\tt \qquad \;|\; withpen \descr{выражение-перо} \;|\;
+ dashed \descr{выражение-картинка}$
+%%$\tt \qquad \;|\; withpen \descr{pen expression} \;|\;
+%% dashed \descr{picture expression}$
+\end{ctabbing}
+\caption{Синтаксис для примитивных команд рисования}
+%%\caption{The syntax for primitive drawing statements}
+\label{sydraw}
+\index{список опций?\tdescr{список опций}}\index{addto also?\texttt{addto also}}\index{addto contour?\texttt{addto contour}}%
+\index{addto doublepath?\texttt{addto doublepath}}\index{withcolor?\texttt{withcolor}}\index{withpen?\texttt{withpen}}%
+\index{dashed?\texttt{dashed}}\index{опции рисования?\tdescr{опции рисования}}
+\end{figure}
+
+Синтаксис для примитивных команд рисования совместим с
+\MF\index{metafont?\MF}.
+%%The syntax for primitive drawing commands is compatible with
+%%\MF\index{metafont?\MF}.
+Таблица~\ref{draweqv} показывает, как примитивные
+команды рисования относятся к знакомым {\tt draw} и {\tt fill}.
+%%Table~\ref{draweqv} shows how the primitive
+%%drawing statements relate to the familiar {\tt draw} and {\tt fill}
+%%statements.
+Каждая команда в первой колонке таблицы может заканчиваться
+своим \tdescr{списком опций}, который эквивалентен добавлению
+\tdescr{списка опций} к соответствующей записи во второй колонке.
+%%Each of the statements in the first column of the table
+%%could be ended with an \tdescr{option list} of its own, which is
+%%equivalent to appending the \tdescr{option list} to the corresponding
+%%entry in the second column of the table.
+Например,
+$$ {\tt draw}\ p\ {\tt withpen\ pencircle} $$
+эквивалентно
+$$ {\tt addto\ currentpicture\ doublepath}\ p\
+ {\tt withpen\ currentpen\ withpen\ pencircle},
+$$
+где {\tt
+currentpen}\index{currentpen?\texttt{currentpen}}\label{Dcurpen} ---
+это специальная переменная, в которой всегда хранится текущее перо.
+%%For example,
+%%$$ {\tt draw%%}\ p\ {\tt withpen\ pencircle} $$
+%%is equivalent to
+%%$$ {\tt addto\ currentpicture\ doublepath}\ p\
+%% {\tt withpen\ currentpen\ withpen\ pencircle}
+%%$$
+%%where {\tt
+%%currentpen}\index{currentpen?\texttt{currentpen}}\label{Dcurpen} is a
+%%special pen variable that always holds the last pen picked up.
+Вторая опция {\tt withpen} без шума отменяет {\tt withpen
+currentpen} в раскрытии {\tt draw}.
+%%The second {\tt withpen} option silently overrides the {\tt withpen
+%%currentpen} from the expansion of {\tt draw}.
+
+\begin{table}[htp]
+$$\begin{tabular}{|l|l|} \hline
+\multicolumn1{|c|}{команда}& \multicolumn1{c|}{эквивалентный примитив}\\ \hline
+%%\multicolumn1{|c|}{statement}& \multicolumn1{c|}{equivalent primitives}\\ \hline
+{\tt draw} {\it pic}& {\tt addto currentpicture also} {\it pic}\\
+{\tt draw} $p$& {\tt addto currentpicture doublepath} $p$
+ {\tt withpen} $q$\\
+{\tt fill} $c$& {\tt addto currentpicture contour} $c$\\
+{\tt filldraw} $c$& {\tt addto currentpicture contour} $c$ {\tt withpen} $q$\\
+{\tt undraw} {\it pic}& {\tt addto currentpicture also} {\it pic}
+ {\tt withcolor} $b$\\
+{\tt undraw} $p$& {\tt addto currentpicture doublepath} $p$
+ {\tt withpen} $q$
+ {\tt withcolor} $b$\\
+{\tt unfill} $c$& {\tt addto currentpicture contour} $c$
+ {\tt withcolor} $b$\\
+{\tt unfilldraw} $c$& {\tt addto currentpicture contour} $c$ {\tt withpen} $q$
+ {\tt withcolor} $b$\\ \hline
+\end{tabular}
+$$
+\caption[Команды рисования и эквивалентные примитивные команды] {Обычные
+ команды рисования и эквивалентные версии примитивов, где $q$
+ значит {\tt currentpen}, $b$ --- {\tt background},
+ $p$ --- любой путь, $c$ --- циклический путь и {\it
+ pic} --- \tdescr{выражение-картинка}. Заметьте, что
+ непустое поле {\tt drawoptions} могло бы усложнить записи во
+ второй колонке.}
+%%\caption[Drawing statements and equivalent primitive commands] {Common
+%% drawing statements and equivalent primitive versions, where $q$
+%% stands for {\tt currentpen}, $b$ stands for {\tt background},
+%% $p$ stands for any path, $c$ stands for a cyclic path, and {\it
+%% pic} stands for a \tdescr{picture expression}. Note that
+%% nonempty {\tt drawoptions} would complicate the entries in the
+%% second column.}
+\label{draweqv}
+\index{drawoptions?\texttt{drawoptions}}
+\end{table}
+
+Есть еще две примитивные рисующие команды, недопускающие никаких опций
+рисования.
+%%There are two more primitive drawing commands that do not accept any
+%%drawing options.
+Первая --- это {\tt setbounds}, обсуждаемая в
+разделе~\ref{meas}; вторая --- это {\tt clip}\index{clip?\texttt{clip}}\label{Dclip}:
+$$ {\tt clip}\, \descr{переменная-картинка}\, {\tt to}\, \descr{выражение-путь} $$
+%%One is the {\tt setbounds} command that was discussed
+%%in Section~\ref{meas}; the other is the {\tt clip}
+%%command\index{clip?\texttt{clip}}\label{Dclip}:
+%%$$ {\tt clip}\, \descr{picture variable}\, {\tt to}\, \descr{path expression} $$
+По данному циклическому пути, команда {\tt clip} обрезает содержимое
+\tdescr{переменной-картинки} так, что удаляется все, что оказывается снаружи
+циклического пути.
+%%Given a cyclic path, this statement trims the contents of the
+%%\tdescr{picture variable} to eliminate everything outside of the cyclic path.
+Нет ``высокоуровневой'' версии этой команды, так что вы должны использовать
+$$ {\tt clip\ currentpicture\ to}\, \descr{выражение-путь}, $$
+если вы хотите обрезать {\tt
+currentpicture}\index{currentpicture?\texttt{currentpicture}}.
+%%There is no ``high level'' version of this statement, so you have to use
+%%$$ {\tt clip\ currentpicture\ to}\, \descr{path expression} $$
+%%if you want to clip {\tt
+%%currentpicture}\index{currentpicture?\texttt{currentpicture}}.
+Рис.~\ref{fig40} иллюстрирует обрезку.
+%%Figure~\ref{fig40} illustrates clipping.
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+beginfig(40);
+path p[];
+p1 = (0,0){curl 0}..(5pt,-3pt)..{curl 0}(10pt,0);
+p2 = p1..(p1 yscaled-1 shifted(10pt,0));
+p0 = p2;
+for i=1 upto 3: p0:=p0.. p2 shifted (i*20pt,0);
+ endfor
+for j=0 upto 8: draw p0 shifted (0,j*10pt);
+ endfor
+p3 = fullcircle shifted (.5,.5) scaled 72pt;
+clip currentpicture to p3;
+draw p3;
+endfig;
+\end{verbatim}
+\qquad
+\mathcenter{\includegraphics{manfig-ru-40}}
+$$
+\caption{Код MetaPost и вырезанная картинка-результат.}
+%%\caption{MetaPost code and the resulting ``clipped'' figure.}
+\label{fig40}
+\end{figure}
+
+Все примитивные операции рисования были бы бесполезны без последней
+операции с именем {\tt shipout}.
+%%All the primitive drawing operations would be useless without one last
+%%operation called {\tt shipout}.
+Команда \index{shipout?\texttt{shipout}}\label{Dship}
+$$ {\tt shipout}\, \descr{выражение-рисунок} $$
+пишет картинку, как файл PostScript\index{PostScript}, чье имя
+определяется значением {\tt filenametemplate}\index{filenametemplate?\texttt{filenametemplate}}
+(см. раздел~\ref{Dfilenametemplate}).
+%%The statement\index{shipout?\texttt{shipout}}\label{Dship}
+%%$$ {\tt shipout}\, \descr{picture expression} $$
+%%writes out a picture as a PostScript\index{PostScript} file whose
+%%file name is determined by
+%%{\tt filenametemplate}\index{filenametemplate?\texttt{filenametemplate}}
+%%(see section~\ref{Dfilenametemplate}).
+Обычно имя файла заканчивается на {\tt.}{\it nnn}, где {\tt nnn} --- это
+десятичное представление значения внутренней переменной\index{внутренние
+переменные}\index{переменные!внутренние} {\tt
+charcode}\index{charcode?\texttt{charcode}}\label{Dcharcode}.
+%%By default, the file name ends
+%%{\tt.}{\it nnn}, where {\tt nnn} is the decimal representation
+%%of the value of the internal variable\index{internal
+%%variables}\index{variables!internal} {\tt
+%%charcode}\index{charcode?\texttt{charcode}}\label{Dcharcode}.
+Имя ``{\tt charcode}'' используется для совместимости
+с \MF\index{metafont?\MF}.
+%%(The name
+%%``{\tt charcode}'' is for compatibility with \MF\index{metafont?\MF}.)
+Как правило, {\tt beginfig}\index{beginfig?\texttt{beginfig}} устанавливает
+{\tt charcode}, а {\tt endfig}\index{endfig?\texttt{endfig}} вызывает {\tt
+shipout}.
+%%Normally, {\tt beginfig}\index{beginfig?\texttt{beginfig}} sets {\tt
+%%charcode}, and {\tt endfig}\index{endfig?\texttt{endfig}} invokes {\tt
+%%shipout}.
+
+\subsection{Направление вывода в пере\-менную-картинку}
+%%\subsection{Directing Output to a Picture Variable}
+
+Иногда может быть желательно сохранить вывод рисующих операций и
+использовать его потом.
+%%Sometimes, it might be desirable to save the output of a drawing
+%%operation and re-use them later.
+Это может быть легко сделано примитивами MetaPost типа \ttt{addto}.
+%%This can easily be done with
+%%MetaPost primitives like \ttt{addto}.
+С другой стороны, из-за того, что высокоуровневые команды рисования,
+определенные в макропакете Plain, всегда пишут в \ttt{currentpicture}\index{currentpicture?\texttt{currentpicture}},
+сохранение их вывода требует временного сохранения \ttt{currentpicture},
+затем сброса ее в \ttt{nullpicture}\index{nullpicture?\texttt{nullpicture}},
+затем исполнения рисующих операций, затем записи значения \ttt{currentpicture}
+в новую переменную типа \ttt{picture} и, наконец, восстановления
+\ttt{currentpicture} в исходное состояние.
+%%On the other hand, since the
+%%higher-level drawing commands defined in the Plain macro package
+%%always write to the
+%%\ttt{currentpicture}\index{currentpicture?\texttt{currentpicture}},
+%%saving their output required to temporarily save \ttt{currentpicture},
+%%reset it to \ttt{nullpicture}\index{nullpicture?\texttt{nullpicture}},
+%%execute the drawing operations, save the \ttt{currentpicture} to a
+%%new \ttt{picture} variable and finally restore \ttt{currentpicture} to
+%%the saved state.
+В MetaPost версии~0.60 новый макрос
+$$ \hbox{\tt image( $\descr{команды рисования}$ )} $$%
+\index{image?\texttt{image}}\label{Dimage}%
+вводится для упрощения этого задания.
+%%In MetaPost version~0.60 a new macro
+%%$$ \hbox{\tt image( $\descr{drawing commands}$ )} $$%
+%%\index{image?\texttt{image}}\label{Dimage}%
+%%was introduced that eases this task.
+Он воспринимает как ввод последовательность произвольных операций
+рисования и возвращает переменную типа \ttt{picture}, содержащую
+соответствующий вывод, без влияния на {\tt currentpicture}.
+%%It takes as input a sequence of arbitrary
+%%drawing operations and returns a \ttt{picture} variable containing the
+%%corresponding output, without affecting {\tt currentpicture}.
+
+Например, в коде рис.~\ref{fig55} объект \ttt{wheel} определяется
+сохранением вывода двух операций \ttt{draw} (см. код).
+%%As an example, in the code of figure~\ref{fig55} an object \ttt{wheel} has
+%%been defined that saves the output of two \ttt{draw} operations as follows:
+\begin{figure}[b]
+$$ \includegraphics{manfig-ru-55} $$
+\caption{Копирование объектов оператором \ttt{image}.}
+%%\caption{Copying objects with the \ttt{image} operator.}
+\label{fig55}
+\end{figure}
+$$\begin{verbatim}
+picture wheel;
+wheel := image(
+ draw fullcircle scaled 2u xscaled .8 rotated 30;
+ draw fullcircle scaled .15u xscaled .8 rotated 30;
+);
+\end{verbatim}
+$$
+Объект \ttt{wheel} повторно используется в определении другого объекта \ttt{car}.
+%%This \ttt{wheel} object is re-used in the definition of another object \ttt{car}.
+Рис.~\ref{fig55} показывает три объекта \ttt{car}, нарисованные с двумя разными
+значениями наклона.
+%%Figure~\ref{fig55} shows three \ttt{car} objects drawn with two different slant
+%%values.
+
+\subsection{Работа с компонентами рисунка}
+%%\subsection{Inspecting the Components of a Picture}
+\label{piccomp}
+
+\mbox{}% Start paragraph here.
+\index{setbounds?\texttt{setbounds}|(}%
+\index{for within?\texttt{for within}|(}%
+%
+Рисунки MetaPost составляются из нарисованных линий, заполненных
+контуров, текстовых фрагментов, путей для вырезки\index{clip?\texttt{clip}} и
+путей {\tt setbounds}\index{setbounds?\texttt{setbounds}}.
+%%MetaPost pictures are composed of stroked lines, filled outlines, pieces
+%%of typeset text, clipping paths\index{clip?\texttt{clip}}, and
+%%{\tt setbounds}\index{setbounds?\texttt{setbounds}} paths.
+Путь {\tt setbounds} дает искусственную охватывающую рамку, нужную для
+вывода \TeX.
+%%(A {\tt setbounds}
+%%path gives an artificial bounding box as is needed for \TeX\ output.)
+Рисунок может иметь много компонент каждого типа.
+%%A picture can have many components of each type.
+Эти компоненты доступны через итерацию в форме
+$$ {\tt for}\ \descr{символьный знак}\ {\tt within}\
+ \descr{выражение-картинка}\hbox{\tt:}\ \descr{тело цикла}\ {\tt endfor}
+$$\index{for within?\texttt{for within}}\label{Dforwithin}%
+%%They can be accessed via an iteration of the form
+%%$$ {\tt for}\ \descr{symbolic token}\ {\tt within}\
+%% \descr{picture expression}\hbox{\tt:}\ \descr{loop text}\ {\tt endfor}
+%%$$\index{for within?\texttt{for within}}\label{Dforwithin}%
+\tdescr{Тело цикла} может быть чем-угодно, сбалансированным относительно
+{\tt for} и {\tt endfor}.
+%%The \tdescr{loop text} can be anything that is balanced with respect to
+%%{\tt for} and {\tt endfor}.
+\tdescr{Символьный знак} --- это переменная-картинка для цикла,
+сканирующая компоненты рисунка в порядке их рисования.
+%%The \tdescr{symbolic token} is a loop variable that
+%%scans the components of the picture in the order in which they were drawn.
+Компонента для пути вырезки или {\tt setbounds} включает все, к чему
+применяется путь.
+%%The
+%%component for a clipping or {\tt setbounds} path includes everything the path
+%%applies to.
+Поэтому, если одиночный путь вырезки или {\tt setbounds} применяется ко
+всему в \tdescr{выражении-картинке}, то вся картинка может рассматриваться
+как одна большая компонента.
+%%Thus if a single clipping or {\tt setbounds} path applies to
+%%everything in the \tdescr{picture expression}, the whole picture could be
+%%thought of as one big component.
+Для того, чтобы содержимое такой картинки было доступным, итерация
+{\tt for}\ldots{\tt within} игнорирует охватывающий путь вырезки или
+{\tt setbounds} в этом случае.
+%%In order to make the contents of such a picture
+%%accessible, the {\tt for}\ldots{\tt within} iteration ignores the enclosing
+%%clipping or {\tt setbounds} path in this case.
+Число компонент, находимых итерацией {\tt for}\ldots {\tt within}, возвращается
+$$ {\tt length}\ \descr{рисунок-первичность}\index{length?\texttt{length}}\label{DlengthPicture}$$
+%%The number of components
+%%that a {\tt for}\ldots {\tt within} iteration would find is returned by
+%%$$ {\tt length}\ \descr{picture primary}\index{length?\texttt{length}}\label{DlengthPicture}$$
+
+\index{for within?\texttt{for within}|)}
+\mbox{}% Start paragraph here.
+\index{stroked?\texttt{stroked}|(}%
+\index{filled?\texttt{filled}|(}%
+\index{textual?\texttt{textual}|(}%
+\index{clipped?\texttt{clipped}|(}%
+\index{bounded?\texttt{bounded}|(}%
+%
+Как только итерация {\tt for}\ldots{\tt within} находит компонент картинки,
+сразу возникает ряд операторов для его идентификации и получения
+относящейся к нему информации.
+%%Once the {\tt for}\ldots{\tt within} iteration has found a picture component,
+%%there are numerous operators for identifying it and extracting relevant
+%%information.
+Оператор
+$$ {\tt stroked}\ \descr{первичное выражение} $$\index{stroked?\texttt{stroked}}\label{Dstroked}%
+проверяет, является ли выражение известной картинкой, чей первый
+компонент --- это изображенная линия.
+%%The operator
+%%$$ {\tt stroked}\ \descr{primary expression} %%$$\index{stroked?\texttt{stroked}}\label{Dstroked}%
+%%tests whether the expression is a known picture whose first component is a
+%%stroked line.
+Аналогичным образом, операторы {\tt filled}\index{filled?\texttt{filled}}\label{Dfilled}
+и {\tt textual}\index{textual?\texttt{textual}}\label{Dtextual}
+возвращают {\tt true}, если первый компонент --- это
+соответственно заполненный контур или фрагмент текста.
+%%Similarly, the {\tt filled}\index{filled?\texttt{filled}}\label{Dfilled}
+%%and {\tt textual}\index{textual?\texttt{textual}}\label{Dtextual} operators
+%%return {\tt true} if the first component is a filled outline or a piece of
+%%typeset text.
+Операторы {\tt clipped}\index{clipped?\texttt{clipped}}\label{Dclipped}
+и {\tt bounded}\index{bounded?\texttt{bounded}}\label{Dbounded}
+проверяют, является ли аргумент картинкой, начинающейся с пути вырезки
+или {\tt setbounds}.
+%%The {\tt clipped}\index{clipped?\texttt{clipped}}\label{Dclipped}
+%%and {\tt bounded}\index{bounded?\texttt{bounded}}\label{Dbounded} operators
+%%test whether the argument is a known picture that starts with a clipping
+%%path or a {\tt setbounds} path.
+Они будут истинны, если первая компонента вырезана или ограничена (командой
+{\tt setbounds}) или если вся картинка заключена в путь вырезки
+или {\tt setbounds}.
+%%This is true if the first component is
+%%clipped or bounded or if the entire picture is enclosed in a clipping or
+%%{\tt setbounds} path.
+
+\mbox{}% Start paragraph here.
+\index{pathpart?\texttt{pathpart}|(}%
+\index{penpart?\texttt{penpart}|(}%
+\index{dashpart?\texttt{dashpart}|(}%
+%
+Есть еще ряд операторов извлечения частей, применяемых к первой
+компоненте рисунка.
+%%There are also numerous part extraction operators that test the first component
+%%of a picture.
+Если {\tt p} --- это картинка и {\tt stroked p} --- истинно, то
+{\tt pathpart p}\index{pathpart?\texttt{pathpart}}\label{Dpathpart} --- это
+путь, описывающий нарисованную линию,
+{\tt penpart p}\index{penpart?\texttt{penpart}}\label{Dpenpart} --- это
+использованное перо, {\tt dashpart p}\index{dashpart?\texttt{dashpart}}\label{Ddashpart} ---
+это образец пунктира.
+%%If {\tt p} is a picture and {\tt stroked p} is true,
+%%{\tt pathpart p}\index{pathpart?\texttt{pathpart}}\label{Dpathpart} is the
+%%path describing the line that got stroked,
+%%{\tt penpart p}\index{penpart?\texttt{penpart}}\label{Dpenpart} is the pen
+%%that was used, {\tt dashpart p}\index{dashpart?\texttt{dashpart}}\label{Ddashpart}
+%%is the dash pattern.
+Если линия без разрывов, то {\tt dashpart p} возвращает пустую картинку.
+%%If the line is not dashed, {\tt dashpart p} returns an empty picture.
+
+Такие же операторы для извлечения частей работают, когда {\tt filled p} ---
+истинно, за исключением того, что {\tt dashpart p} не имеет смыла в этом
+случае.
+%%The same part extraction operators work when {\tt filled p} is true, except
+%%that {\tt dashpart p} is not meaningful in that case.
+
+Для текстовых фрагментов, когда {\tt textual p} --- истинно,
+{\tt textpart p}\index{textpart?\texttt{textpart}}\label{Dtextpart}
+дает напечатанный текст,
+{\tt fontpart p}\index{fontpart?\texttt{fontpart}}\label{Dfontpart}
+--- используемый шрифт и {\tt xpart~p}\index{xpart?\texttt{xpart}}\index{ypart?\texttt{ypart}}\index{xxpart?\texttt{xxpart}}%
+\index{xypart?\texttt{xypart}}\index{yxpart?\texttt{yxpart}}\index{yypart?\texttt{yypart}},
+{\tt ypart~p}, {\tt xxpart~p}, {\tt xypart~p}, {\tt yxpart~p}, {\tt yypart~p}
+показывают, как текст сдвигался, вращался и масштабировался.
+%%For text components,
+%%{\tt textual p} is true,
+%%{\tt textpart p}\index{textpart?\texttt{textpart}}\label{Dtextpart}
+%%gives the text that got typeset,
+%%{\tt fontpart p}\index{fontpart?\texttt{fontpart}}\label{Dfontpart}
+%%gives the font that was used, and {\tt %%xpart~p}\index{xpart?\texttt{xpart}}\index{ypart?\texttt{ypart}}\index{xxpart?\tex%%ttt{xxpart}}%
+%%\index{xypart?\texttt{xypart}}\index{yxpart?\texttt{yxpart}}\index{yypart?\texttt{%%yypart}},
+%%{\tt ypart~p}, {\tt xxpart~p}, {\tt xypart~p}, {\tt yxpart~p}, {\tt yypart~p}
+%%tell how the text has been shifted, rotated, and scaled.
+
+Наконец, для компонент \ttt{stroked}, \ttt{filled} и \ttt{textual}
+можно получить цвет, сказав
+$$ {\tt colorpart}\
+\descr{компонента}\index{colorpart?\texttt{colorpart}}\label{Dcolorpart}
+$$
+%%Finally, for \ttt{stroked}, \ttt{filled} and \ttt{textual} components
+%%the color can be examined by saying
+%%$$ {\tt colorpart}\
+%%\descr{item}\index{colorpart?\texttt{colorpart}}\label{Dcolorpart}
+%%$$
+Это возвращает цвет компоненты в соответствующей модели цвета.
+%%This returns the color of a component in its respective color model.
+Модель цвета компоненты может быть идентифицирована оператором
+\ttt{colormodel}\index{colormodel?\texttt{colormodel}}\label{Dcolormodel}
+(см. таблицу~\ref{dfltcmod} на стр.~\pageref{dfltcmod}).
+%%The color model of a component can be identified by the
+%%\ttt{colormodel}\index{colormodel?\texttt{colormodel}}\label{Dcolormodel}
+%%operator (cf. Table~\ref{dfltcmod} on p.~\pageref{dfltcmod}).
+
+Для более детальных операций со цветом есть операторы для извлечения отдельных
+составляющих цвета из компоненты рисунка.
+%%For more fine grained color operations there are operators to extract
+%%single color components of an item.
+В зависимости от модели цвета цвет компоненты рисунка \ttt{p} --- это
+$$ \hbox{\tt (cyanpart p, magentapart p, yellowpart p, blackpart p)} $$%
+\index{cyanpart?\texttt{cyanpart}}\index{magentapart?\texttt{magentapart}}\index{yellowpart?\texttt{yellowpart}}\index{blackpart?\texttt{blackpart}}
+или
+$$ \hbox{\tt (redpart p, greenpart p, bluepart p)} $$%
+\index{redpart?\texttt{redpart}}\index{greenpart?\texttt{greenpart}}\index{bluepart?\texttt{bluepart}}
+или
+$$ \hbox{\tt (greypart p)} $$%
+\index{greypart?\texttt{greypart}}
+или
+$$ \hbox{\tt false}. $$
+%%Depending on the color model the color of a picture component \ttt{p} is
+%%$$ \hbox{\tt (cyanpart p, magentapart p, yellowpart p, blackpart p)} $$%
+%%\index{cyanpart?\texttt{cyanpart}}\index{magentapart?\texttt{magentapart}}\index{yellowpart?\texttt{yellowpart}}\index{blackpart?\texttt{blackpart}}
+%%or
+%%$$ \hbox{\tt (redpart p, greenpart p, bluepart p)} $$%
+%%\index{redpart?\texttt{redpart}}\index{greenpart?\texttt{greenpart}}\index{bluepart?\texttt{bluepart}}
+%%or
+%%$$ \hbox{\tt greypart p} $$%
+%%\index{greypart?\texttt{greypart}}
+%%or
+%%$$ \hbox{\tt false}. $$
+
+Заметьте, что операторы частей цвета {\tt redpart}, {\tt cyanpart} и т.~п.
+должны соответствовать модели цвета компонента рисунка в вопросе.
+%%Note, color part operators {\tt redpart}, {\tt cyanpart} etc. have to
+%%match the color model of the picture component in question.
+Применение несоответствующего оператора части цвета к компоненту картинки
+инициирует ошибку и возвращает часть цвета \ttindex{black} в запрошенной
+модели цвета.
+%%Applying a non-matching color part
+%%operator to a picture component triggers an error and returns
+%%a \ttindex{black} color part in the requested color model.
+Таким образом, для кода
+%%That is, for the code
+$$\begin{verbatim}
+picture pic;
+pic := image(fill unitsquare scaled 1cm withcolor (0.3, 0.6, 0.9););
+for item within pic:
+ show greypart item;
+ show cyanpart item;
+ show blackpart item;
+ show redpart item;
+endfor
+\end{verbatim}
+$$
+выводом будет (сообщения об ошибках опущены)
+%%the output is (omitting the error messages)
+$$\begin{verbatim}
+>> 0
+>> 0
+>> 1
+>> 0.3,
+\end{verbatim}
+$$
+потому что в модели оттенков серого черный --- это {\tt 0}, а в модели
+cmyk-цветов черный --- это {\tt (0,0,0,1)}.
+%%since in grey scale color model black is {\tt 0} and in CMYK color model
+%%black is {\tt (0, 0, 0, 1)}.
+Для подошедшей модели rgb-цвета был возвращен верный цветовой компонент.
+%%For the matching RGB color model the true
+%%color component is returned.
+
+Когда {\tt clipped p} или {\tt bounded p} --- истинно, то {\tt pathpart p}
+дает путь вырезки или {\tt setbounds}, а другие операторы извлечения частей
+не имеют смысла.
+%%When {\tt clipped p} or {\tt bounded p} is true, {\tt pathpart p} gives the
+%%clipping or {\tt setbounds} path and the other part extraction operators are
+%%not meaningful.
+Такие не имеющие смысла получения частей не генерируют ошибок.
+%%Such non-meaningful part extractions do not generate
+%%errors.
+Они вместо этого возвращают (компоненты) нулевые значения или черный цвет:
+пустой путь {\tt (0,0)} для {\tt pathpart},
+{\tt nullpen}\index{nullpen?\texttt{nullpen}}\label{Dnlpen} для {\tt penpart},
+пустой рисунок для {\tt dashpart},
+пустую строку для {\tt textpart} или {\tt fontpart},
+0 для {\tt colormodel}, {\tt greypart}, {\tt redpart}, {\tt greenpart},
+{\tt bluepart}, {\tt cyanpart}, {\tt magentapart}, {\tt yellowpart},
+один для {\tt blackpart} и черный в текущей типовой модели цвета для {\tt colorpart}.
+%%Instead, they return null values or black color (components):
+%%the trivial path {\tt (0,0)} for {\tt pathpart},
+%%{\tt nullpen}\index{nullpen?\texttt{nullpen}}\label{Dnlpen} for {\tt penpart},
+%%an empty picture for {\tt dashpart},
+%%the null string for {\tt textpart} or {\tt fontpart},
+%%zero for {\tt colormodel},
+%%{\tt greypart},
+%%{\tt redpart}, {\tt greenpart}, {\tt bluepart},
+%%{\tt cyanpart}, {\tt magentapart}, {\tt yellowpart},
+%%one for {\tt blackpart}, and
+%%black in the current default color model for {\tt colorpart}.
+
+Подведем итог дискуссии о несоответствующих операторах выделения частей.
+%%To summarize the discussion of mismatching part operators:
+\begin{enumerate}
+\item Вопрос о бессмысленных частях компоненты рисунка, таких как {\tt
+ redpart} для пути вырезки, {\tt textpart} для изображения пером
+ или {\tt pathpart} для текста, спокойно принимается и
+ ответом на него будет либо нулевое значение, либо черный цвет
+ (компонент).
+%%\item Asking for non-meaningful parts of an item---such as the {\tt
+%% redpart} of a clipping path, the {\tt textpart} of a stroked item,
+%% or the {\tt pathpart} of a textual item---is silently accepted and
+%% returns a null value or a black color (component).
+\item Применение оператора цветовой части в неправильной модели цвета к
+ цветному компоненту возвращает черный компонент. Более того, это иниициирует
+ ошибку.
+%%\item Applying a color part operator of the wrong color model to a
+%% coloured item returns a black color component. Additionally, this
+%% triggers an error.
+\end{enumerate}
+
+\index{setbounds?\texttt{setbounds}|)}
+\index{stroked?\texttt{stroked}|)}
+\index{filled?\texttt{filled}|)}
+\index{textual?\texttt{textual}|)}
+\index{clipped?\texttt{clipped}|)}
+\index{bounded?\texttt{bounded}|)}
+\index{pathpart?\texttt{pathpart}|)}
+\index{penpart?\texttt{penpart}|)}
+\index{dashpart?\texttt{dashpart}|)}
+\index{colormodel?\texttt{colormodel}|)}
+\index{colorpart?\texttt{colorpart}|)}
+\index{redpart?\texttt{redpart}|)}
+\index{greenpart?\texttt{greenpart}|)}
+\index{bluepart?\texttt{bluepart}|)}
+\index{cyanpart?\texttt{cyanpart}|)}
+\index{magentapart?\texttt{magentapart}|)}
+\index{yellowpart?\texttt{yellowpart}|)}
+\index{blackpart?\texttt{blackpart}|)}
+\index{greypart?\texttt{greypart}|)}
+
+\section{Макросы}
+%%\section{Macros}
+\label{macros}
+
+Уже упоминалось, что MetaPost имеет множество автоматически
+включаемых макросов, называемое макропакет Plain\index{макросы Plain}, и
+некоторые команды, рассмотренные в предшествующих разделах, определены
+как макросы и не являются встроенными в MetaPost.
+%%As alluded to earlier, MetaPost has a set of automatically included
+%%macros called the Plain macro package\index{Plain macros}, and some of
+%%the commands discussed in previous sections are defined as macros
+%%instead of being built into MetaPost.
+Цель этого раздела объяснить, как писать такие макросы.
+%%The purpose of this section is to
+%%explain how to write such macros.
+
+Макросы без аргументов очень просты.
+%%Macros with no arguments are very simple.
+Определение макроса\index{текст замены?\tdescr{текст замены}}%
+\index{def?\texttt{def}}\index{enddef?\texttt{enddef}}
+$$ {\tt def}\, \descr{символический знак}\, \hbox{\tt =}\,
+ \descr{текст замены}\, {\tt enddef}
+$$
+делает \tdescr{символический знак} сокращением для
+\tdescr{текста замены}, где \tdescr{текст замены} может быть, в сущности,
+любой последовательностью знаков.
+%%A macro definition\index{replacement text?\tdescr{replacement text}}%
+%%\index{def?\texttt{def}}\index{enddef?\texttt{enddef}}
+%%$$ {\tt def}\, \descr{symbolic token}\, \hbox{\tt =}\,
+%% \descr{replacement text}\, {\tt enddef}
+%%$$
+%%makes the \tdescr{symbolic token} an abbreviation for the
+%%\tdescr{replacement text}, where the \tdescr{replacement text} can be
+%%virtually any sequence of tokens.
+Например, макропакет Plain мог бы определить команду {\tt fill} примерно
+так\index{fill?\texttt{fill}}:
+$$ \hbox{\tt def fill = addto currentpicture contour enddef} $$
+%%For example, the Plain macro package
+%%could almost define the {\tt fill} statement like
+%%this\index{fill?\texttt{fill}}:
+%%$$ \hbox{\tt def fill = addto currentpicture contour enddef} $$
+
+Макросы с аргументами похожи, за исключением того, что они имеют
+формальные параметры, которые говорят, как использовать аргументы в
+\tdescr{тексте замены}.
+%%Macros with arguments are similar, except they have formal parameters
+%%hat tell how to use the arguments in the \tdescr{replacement text}.
+Например, макрос {\tt
+rotatedaround}\index{rotatedaround?\texttt{rotatedaround}} определяется
+примерно так:
+$$\begin{verbatim}
+def rotatedaround(expr z, d) =
+ shifted -z rotated d shifted z enddef;
+\end{verbatim}
+$$
+%%For example, the {\tt
+%%rotatedaround}\index{rotatedaround?\texttt{rotatedaround}} macro is
+%%defined like this:
+%%$$\begin{verbatim}
+%%def rotatedaround(expr z, d) =
+%% shifted -z rotated d shifted z enddef;
+%%\end{verbatim}
+%%$$
+Слово {\tt expr}\index{expr?\texttt{expr}} в этом определении значит, что
+формальные параметры {\tt z} и {\tt d} могут быть произвольными выражениями.
+%%The {\tt expr}\index{expr?\texttt{expr}} in this definition means that
+%%formal parameters {\tt z} and {\tt d} can be arbitrary expressions.
+Этим параметрам следует соответствовать выражениям-парам, но MetaPost не
+проверяет этого сразу.
+%%(They should be pair expressions but the MetaPost interpreter does not
+%%immediately check for that.)
+
+Из-за того, что MetaPost --- это интерпретируемый язык, макросы с
+аргументами очень похожи на подпрограммы\index{подпрограммы}.
+%%Since MetaPost is an interpreted language, macros with arguments are a
+%%lot like subroutines\index{subroutines}.
+Макросы MetaPost часто используются подобно подпрограммам, поэтому язык
+включает в себя программные концепции для такого использования.
+%%MetaPost macros are often used
+%%like subroutines, so the language includes programming concepts to
+%%support this.
+Эти концепции включают локальные переменные, циклы и условные команды.
+%%These concepts include local variables, loops, and
+%%conditional statements.
+
+\subsection{Группировка}
+%%\subsection{Grouping}
+\label{grsec}
+
+Группировка в MetaPost весьма важна для функций\index{функции} и
+локальных\index{переменные!локальные}\index{локальность} переменных.
+%%Grouping in MetaPost is essential for functions\index{functions} and
+%%local\index{variables!local}\index{locality} variables.
+Базовая идея в том, что группа --- это последовательность команд,
+возможно завершающаяся выражением, с обеспечением того, что некоторые
+символьные знаки\index{знаки!символические} могут восстановить свои
+старые значения в конце группы.
+%%The basic idea
+%%is that a group is a sequence of statements possibly followed by an
+%%expression with the provision that certain symbolic
+%%tokens\index{tokens!symbolic} can have their old meanings restored at
+%%the end of the group.
+Если группа заканчивается выражением, то группа ведет себя подобно
+вызову функции, что возвращает это выражение.
+%%If the group ends with an expression, the group
+%%behaves like a function call that returns that expression.
+В противном случае, группа --- это просто составная
+команда\index{блок}.
+%%Otherwise,
+%%the group is just a compound statement\index{compound statement}.
+Синтаксис для группы\index{begingroup?\texttt{begingroup}}\index{endgroup?\texttt{endgroup}}
+---
+$$ {\tt begingroup}\, \descr{список команд}\, {\tt endgroup} $$
+или
+$$ {\tt begingroup}\, \descr{список команд}\, \descr{выражение}\, {\tt endgroup},
+$$
+где \tdescr{список команд} --- это последовательность команд, за
+каждой из которых следует точка с запятой.
+%%The syntax for a group
+%%is\index{begingroup?\texttt{begingroup}}\index{endgroup?\texttt{endgroup}}
+%%$$ {\tt begingroup}\, \descr{statement list}\, {\tt endgroup} $$
+%%or
+%%$$ {\tt begingroup}\, \descr{statement list}\, \descr{expression}\, {\tt %%endgroup}
+%%$$
+%%where a \tdescr{statement list} is a sequence of statements each
+%%followed by a semicolon.
+Группа с \tdescr{выражением} после
+\tdescr{списка команд} ведет себя как \tdescr{первичность} из
+рис.~\ref{syexpr} или подобно \tdescr{числовому атому} из
+рис.~\ref{synprim}.
+%%A group with an \tdescr{expression} after the
+%%\tdescr{statement list} behaves like a \tdescr{primary} in
+%%Figure~\ref{syexpr} or like a \tdescr{numeric atom} in
+%%Figure~\ref{synprim}.
+
+Из-за того, что \tdescr{текст замены} для макроса {\tt
+beginfig}\index{beginfig?\texttt{beginfig}} начинается с {\tt
+begingroup}, а \tdescr{текст замены} для {\tt
+endfig}\index{endfig?\texttt{endfig}} заканчивается на {\tt endgroup},
+каждая картинка входного файла MetaPost ведет себя как группа.
+%%Since the \tdescr{replacement text} for the {\tt
+%%beginfig}\index{beginfig?\texttt{beginfig}} macro starts with {\tt
+%%begingroup} and the \tdescr{replacement text} for {\tt
+%%endfig}\index{endfig?\texttt{endfig}} ends with {\tt endgroup}, each
+%%figure in a MetaPost input file behaves like a group.
+Это позволяет картинкам иметь локальные переменные.
+%%This is what allows figures can have local variables.
+Мы уже видели в разделе~\ref{vardecl}, что имена переменных,
+начинающиеся с {\tt x} или {\tt y} являются локальными в том смысле,
+что они считаются неизвестными в начале каждой картинки и их значения
+забываются в конце каждой картинки.
+%%We have already seen in
+%%Section~\ref{vardecl} that variable names beginning with {\tt x} or {\tt
+%%y} are local in the sense that they have unknown values at the beginning
+%%of each figure and these values are forgotten at the end of each figure.
+Следующий пример иллюстрирует как работает локальность.
+%%The following example illustrates how locality works:
+\begin{eqnarray*}
+&& \hbox{\tt x23 = 3.1;}\\
+&& \hbox{\tt beginfig(17);}\\
+&& \qquad \vdots\\
+&& \hbox{\tt y3a=1; x23=2;}\\
+&& \qquad \vdots\\
+&& \hbox{\tt endfig;}\\
+&& \hbox{\tt show x23, y3a;}
+\end{eqnarray*}
+Результат команды {\tt show}\index{show?\texttt{show}}
+%%The result of the {\tt show}\index{show?\texttt{show}} command is
+$$\begin{verbatim}
+>> 3.1
+>> y3a
+\end{verbatim}
+$$
+показывает, что {\tt x23} возвращается к своему прежнему значению {\tt 3.1},
+а {\tt y3a} совершенно неизвестно, как оно и было в {\tt beginfig(17)}.
+%%indicating that {\tt x23} has returned to its former value of {\tt 3.1} and
+%%{\tt y3a} is completely unknown as it was at {\tt beginfig(17)}.
+
+Локальность переменных {\tt x} и {\tt y} достигается
+командой\index{save?\texttt{save}}\label{Dsave}
+$$ \hbox{\tt save x,y} $$
+в \tdescr{тексте замены} для {\tt
+beginfig}\index{beginfig?\texttt{beginfig}}.
+%%The locality of {\tt x} and {\tt y} variables is achieved by the
+%%statement\index{save?\texttt{save}}\label{Dsave}
+%%$$ \hbox{\tt save x,y} $$
+%%in the \tdescr{replacement text} for {\tt
+%%beginfig}\index{beginfig?\texttt{beginfig}}.
+В общем, переменные делаются локальными командой
+$$ {\tt save}\, \descr{список символических знаков}, $$
+где \tdescr{список символических знаков} --- это разделенный запятыми
+список знаков:\index{знаки!символические}
+\begin{ctabbing}
+$\tt \descr{список символических знаков} \rightarrow \descr{символический знак}$\\
+ $\tt \qquad \;|\; \descr{символический знак}\hbox{\tt ,}
+ \descr{список символических знаков}$
+\end{ctabbing}
+%%In general, variables are made local by the statement
+%%$$ {\tt save}\, \descr{symbolic token list} $$
+%%where \tdescr{symbolic token list} is a comma-separated list of
+%%tokens:\index{tokens!symbolic}
+%%\begin{ctabbing}
+%%$\tt \descr{symbolic token list} \rightarrow \descr{symbolic token}$\\
+%% $\tt \qquad \;|\; \descr{symbolic token}\hbox{\tt ,}
+%% \descr{symbolic token list}$
+%%\end{ctabbing}
+Все переменные, чьи имена начинаются с одного из указанных символических
+знаков, становятся неизвестными числами, а их прежние значения сохраняются
+для восстановления в конце текущей группы.
+%%All variables whose names begin with one of the specified symbolic
+%%tokens become unknown numerics and their present values are saved for
+%%restoration at the end of the current group.
+Если команда {\tt save} используется вне группы, то значения по-просту
+невосстановимо уничтожаются.
+%%If the {\tt save}
+%%statement is used outside of a group, the original values are simply
+%%discarded.
+
+Главная цель команды {\tt save} позволить макросам использовать
+переменные без взаимодействия с существующими переменными или переменными
+в нескольких вызовах одного и того же макроса.
+%%The main purpose of the {\tt save} statement is to allow macros to use
+%%variables without interfering with existing variables or variables in
+%%other calls to the same macro.
+Например, предопределенный макрос {\tt
+whatever}\index{whatever?\texttt{whatever}} имеет такой \tdescr{текст замены}
+$$ \hbox{\tt begingroup save ?; ? endgroup} $$
+%%For example, the predefined macro {\tt
+%%whatever}\index{whatever?\texttt{whatever}} has the \tdescr{replacement text}
+%%$$ \hbox{\tt begingroup save ?; ? endgroup} $$
+Он возвращает неизвестное числовое количество, но оно не зовется больше
+знаком вопроса, потому что это имя было локальным в группе.
+%%This returns an unknown numeric quantity, but it is no longer called
+%%question mark since that name was local to the group.
+Спрашивая имя через {\tt show\index{show?\texttt{show}} whatever},
+получаем\index{CAPSULE?\texttt{CAPSULE}}
+$$ \hbox{\tt >> \%CAPSULE}{\it nnnn}, $$
+где {\it nnnn} --- это идентификационный номер, выбираемый, когда {\tt save}
+организует исчезновение имени знак вопроса.
+%%Asking the name via {\tt show\index{show?\texttt{show}} whatever}
+%%yields\index{CAPSULE?\texttt{CAPSULE}}
+%%$$ \hbox{\tt >> \%CAPSULE}{\it nnnn} $$
+%%where {\it nnnn} is an identification number that is chosen when {\tt save}
+%%makes the name question mark disappear.
+
+Вопреки универсальности, {\tt save} не может использоваться
+для локального изменения любой внутренней переменной\index{внутренние
+переменные}\index{переменные!внутренние} MetaPost.
+%%In spite of the versatility of {\tt save}, it cannot be used to make
+%%local changes to any of MetaPost's internal variables\index{internal
+%%variables}\index{variables!internal}.
+Команда, такая как
+$$ \hbox{\tt save linecap}, $$
+приведет MetaPost к временному забыванию специального значения этой
+переменной и сделает ее обычной неизвестной числовой величиной.
+%%A statement such as\index{linecap?\texttt{linecap}}
+%%$$ \hbox{\tt save linecap} $$
+%%would cause MetaPost to temporarily forget the special meaning of this
+%%variable and just make it an unknown numeric.
+Если вы хотите нарисовать одну пунктирную линию с {\tt linecap:=butt} и
+затем вернуться назад к прежнему значению, то вы можете использовать
+команду {\tt
+interim}\index{interim?\texttt{interim}}\label{Dinterm} как
+в следующем примере:
+\begin{eqnarray*}
+&& \hbox{\tt begingroup interim linecap:=butt;}\\
+&& {\tt draw}\, \descr{выражение-путь}\, \hbox{\tt dashed evenly; endgroup}
+\end{eqnarray*}
+%%If you want to draw one
+%%dashed line with {\tt linecap:=butt} and then go back to the previous
+%%value, you can use the {\tt
+%%interim}\index{interim?\texttt{interim}}\label{Dinterm} statement as
+%%follows:
+%%\begin{eqnarray*}
+%%&& \hbox{\tt begingroup interim linecap:=butt;}\\
+%%&& {\tt draw}\, \descr{path expression}\, \hbox{\tt dashed evenly; endgroup}
+%%\end{eqnarray*}
+Это сохранит значение внутренней
+переменной\index{внутренние переменные}\index{переменные!внутренние}
+{\tt linecap}, временно даст ей новое значение и это не приведет к
+забыванию того, что {\tt linecap} --- внутренняя переменная.
+%%This saves the value of the
+%%internal variable\index{internal variables}\index{variables!internal}
+%%{\tt linecap} and temporarily
+%%gives it a new value without forgetting that {\tt linecap} is an internal
+%%variable.
+Общий синтаксис:
+$$ {\tt interim}\, \descr{внутренняя переменная} \mathrel{\hbox{\tt:=}}
+ \descr{числовое выражение}
+$$
+%%The general syntax is
+%%$$ {\tt interim}\, \descr{internal variable} \mathrel{\hbox{\tt:=}}
+%% \descr{numeric expression}
+%%$$
+
+\subsection{Параметризованные макросы}
+%%\subsection{Parameterized Macros}
+
+Базовая идея макросов с параметрами в достижении большей гибкости передачей
+добавочной информации в макрос.
+%%The basic idea behind parameterized macros is to achieve greater flexibility by
+%%allowing auxiliary information to be passed to a macro.
+Мы уже видели, что определения макросов могут иметь формальные параметры для
+выражений, задаваемых при вызове макроса.
+%%We have already seen
+%%that macro definitions can have formal parameters that represent expressions
+%%to be given when the macro is called.
+Например, определение
+$$ \hbox{\tt def rotatedaround(expr z, d) = } \descr{текст замены}\,
+ {\tt enddef}
+$$
+позволяет MetaPost-интерпретатору понимать вызовы макроса в форме
+$$\tt rotatedaround\hbox{\tt (}
+ \descr{выражение}\hbox{\tt ,} \descr{выражение}\hbox{\tt )}
+$$
+%%For instance a definition such as
+%%$$ \hbox{\tt def rotatedaround(expr z, d) = } \descr{replacement text}\,
+%% {\tt enddef}
+%%$$
+%%allows the MetaPost interpreter to understand macro calls of the form
+%%$$\tt rotatedaround\hbox{\tt (}
+%% \descr{expression}\hbox{\tt ,} \descr{expression}\hbox{\tt )}
+%%$$
+
+Ключевое слово {\tt expr}\index{expr?\texttt{expr}}\index{параметр!expr}
+в определении макроса значит, что параметры могут быть выражениями любого
+типа.
+%%The keyword {\tt expr}\index{expr?\texttt{expr}}\index{parameter!expr}
+%%in the macro definition means that the parameters can be expressions of
+%%any type.
+Когда определение указывает {\tt (expr z, d)}, то формальные
+параметры {\tt z} и {\tt d} ведут себя подобно переменным подходящего типа.
+%%When the definition specifies {\tt (expr z, d)}, the formal
+%%parameters {\tt z} and {\tt d} behave like variables of the appropriate
+%%types.
+Внутри \tdescr{текста замены} они могут быть использованы в выражениях,
+как обычные переменные, но они не могут повторно декларироваться или
+получать новые значения.
+%%Within the \tdescr{replacement text}, they can be used in
+%%expressions just like variables, but they cannot be redeclared or
+%%assigned to.
+Нет ограничений на неизвестные или частично известные аргументы.
+%%There is no restriction against unknown or partially known
+%%arguments.
+Поэтому определение\index{midpoint?\texttt{midpoint}}
+$$ \hbox{\tt def midpoint(expr a, b) = (.5[a,b]) enddef} $$
+прекрасно работает для неизвестных {\tt a} и {\tt b}.
+%%Thus the definition\index{midpoint?\texttt{midpoint}}
+%%$$ \hbox{\tt def midpoint(expr a, b) = (.5[a,b]) enddef} $$
+%%works perfectly well when {\tt a} and {\tt b} are unknown.
+Уравнение, такое как
+$$ \hbox{\tt midpoint(z1,z2) = (1,1)}, $$
+может быть использовано для определения {\tt z1} и {\tt z2}.
+%%An equation such as
+%%$$ \hbox{\tt midpoint(z1,z2) = (1,1)} $$
+%%could be used to help determine {\tt z1} and {\tt z2}.
+
+Заметьте, что определение выше для {\tt midpoint} работает для чисел,
+пар или цветов --- нужно только совпадение типов обоих параметров.
+%%Notice that the above definition for {\tt midpoint} works for numerics,
+%%pairs, or colors as long as both parameters have the same type.
+Если зачем-то нужен макрос {\tt
+middlepoint}\index{middlepoint?\texttt{middlepoint}}, работающий только
+для пути или рисунка, то будет необходимо выполнять
+проверку {\tt if}\index{if?\texttt{if}} типа аргумента.
+%%If for some reason we want a {\tt
+%%middlepoint}\index{middlepoint?\texttt{middlepoint}} macro that works
+%%for a single path or picture, it would be necessary to do an {\tt
+%%if}\index{if?\texttt{if}} test on the argument type.
+Есть унарный оператор\index{path?\texttt{path}}
+$$ {\tt path}\, \descr{первичность}, $$
+возвращающий логический результат, показывающий является ли его аргумент путем.
+%%This uses the fact
+%%there is a unary operator\index{path?\texttt{path}}
+%%$$ {\tt path}\, \descr{primary} $$
+%%that returns a boolean result indicating whether its argument is a path.
+Из-за того, что проверка {\tt if} имеет базовый
+синтаксис\index{else?\texttt{else}}\index{fi?\texttt{fi}}
+$$ {\tt if}\, \descr{логическое выражение}\hbox{\tt:}\, \descr{сбалансированные знаки}\,
+ \hbox{\tt else:}\, \descr{сбалансированные знаки}\, {\tt fi},
+$$
+где \tdescr{сбалансированные знаки}\index{сбалансированные знаки?\tdescr{сбалансированные знаки}}
+могут быть чем-угодно, сбалансированным
+относительно {\tt if} и {\tt fi}, полный макрос {\tt
+middlepoint}\index{middlepoint?\texttt{middlepoint}} с проверкой типа может выглядеть
+так:
+$$\begin{verbatim}
+def middlepoint(expr a) = if path a: (point .5*length a of a)
+ else: .5(llcorner a + urcorner a) fi enddef;
+\end{verbatim}
+$$
+%%Since the basic {\tt if} test has the
+%%syntax\index{else?\texttt{else}}\index{fi?\texttt{fi}}
+%%$$ {\tt if}\, \descr{boolean expression}\hbox{\tt:}\, \descr{balanced tokens}\,
+%% \hbox{\tt else:}\, \descr{balanced tokens}\, {\tt fi}
+%%$$
+%%where the \tdescr{balanced tokens}\index{balanced
+%%tokens?\tdescr{balanced tokens}} can be anything that is balanced with
+%%respect to {\tt if} and {\tt fi}, the complete {\tt
+%%middlepoint}\index{middlepoint?\texttt{middlepoint}} macro with type test
+%%looks like this:
+%%$$\begin{verbatim}
+%%def middlepoint(expr a) = if path a: (point .5*length a of a)
+%% else: .5(llcorner a + urcorner a) fi enddef;
+%%\end{verbatim}
+%%$$
+Полный синтаксис проверки {\tt if} показан на рис.~\ref{syif}.
+%%The complete syntax for {\tt if} tests is shown in Figure~\ref{syif}.
+Позволяются многократные проверки {\tt if}, например,
+$$ \hbox{\tt if $e_1$: \ldots\ else: if $e_2$: \ldots\ else: \ldots\ fi fi},$$
+которые можно сократить до\index{elseif?\texttt{elseif}}
+$$ \hbox{\tt if $e_1$: \ldots\ elseif $e_2$: \ldots\ else: \ldots\ fi}, $$
+где $e_1$ и $e_2$ представляют логические выражения.
+%%It allows multiple {\tt if} tests like
+%%$$ \hbox{\tt if $e_1$: \ldots\ else: if $e_2$: \ldots\ else: \ldots\ fi fi} $$
+%%to be shortened to\index{elseif?\texttt{elseif}}
+%%$$ \hbox{\tt if $e_1$: \ldots\ elseif $e_2$: \ldots\ else: \ldots\ fi} $$
+%%where $e_1$ and $e_2$ represent boolean expressions.
+
+Обратите внимание, что проверки {\tt if} не являются командами и
+\tdescr{сбалансированные знаки}
+в синтаксических правилах могут не быть полными выражениями или командами.
+%%Note that {\tt if} tests are not statements and the \tdescr{balanced
+%%tokens} in the syntax rules can be any sequence of balanced tokens even
+%%if they do not form a complete expression or statement.
+Поэтому можно, пожертвовав наглядностью, убрать два знака в определении
+{\tt middlepoint}:
+$$\begin{verbatim}
+def middlepoint(expr a) = if path a: (point .5*length a of
+ else: .5(llcorner a + urcorner fi a) enddef;
+\end{verbatim}
+$$
+%%Thus we could
+%%have saved two tokens at the expense of clarity by defining {\tt
+%%middlepoint} like this:
+%%$$\begin{verbatim}
+%%def middlepoint(expr a) = if path a: (point .5*length a of
+%% else: .5(llcorner a + urcorner fi a) enddef;
+%%\end{verbatim}
+%%$$
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{проверка if} \rightarrow if \descr{логическое выражение} \hbox{\tt :}
+ \descr{сбалансированные знаки} \descr{альтернативы} fi$\\
+%%$\tt \descr{if test} \rightarrow if \descr{boolean expression} \hbox{\tt :}
+%% \descr{balanced tokens} \descr{alternatives} fi$\\
+$\tt \descr{альтернативы} \rightarrow \descr{пусто}$\\
+%%$\tt \descr{alternatives} \rightarrow \descr{empty}$\\
+$\tt \qquad \;|\; else\hbox{\tt :} \descr{сбалансированные знаки}$\\
+%%$\tt \qquad \;|\; else\hbox{\tt :} \descr{balanced tokens}$\\
+$\tt \qquad \;|\; elseif \descr{логическое выражение} \hbox{\tt :}
+ \descr{сбалансированные знаки} \descr{альтернативы}$
+%%$\tt \qquad \;|\; elseif \descr{boolean expression} \hbox{\tt :}
+%% \descr{balanced tokens} \descr{alternatives}$
+\end{ctabbing}
+\caption{Синтаксис проверки {\tt if}.}
+%%\caption{The syntax for {\tt if} tests.}
+\label{syif}
+\end{figure}
+
+Настоящее назначение макросов и проверок {\tt if} в автоматизации решения
+повторяющихся задач, а также в возможности решать подзадачи по-отдельности.
+%%The real purpose of macros and {\tt if} tests is to automate repetitive
+%%tasks and allow important subtasks to be solved separately.
+Например, рис.~\ref{fig42} использует макросы \verb|draw_marked|,
+\verb|mark_angle| и \verb|mark_rt_angle| для отметки линий и углов,
+появляющихся на рисунке.
+%%For example, Figure~\ref{fig42} uses macros \verb|draw_marked|,
+%%\verb|mark_angle|, and \verb|mark_rt_angle| to mark lines and angles
+%%that appear in the figure.
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+beginfig(42);
+pair a,b,c,d;
+b=(0,0); c=(1.5in,0); a=(0,.6in);
+d-c = (a-b) rotated 25;
+dotlabel.lft("a",a);
+dotlabel.lft("b",b);
+dotlabel.bot("c",c);
+dotlabel.llft("d",d);
+z0=.5[a,d];
+z1=.5[b,c];
+(z.p-z0) dotprod (d-a) = 0;
+(z.p-z1) dotprod (c-b) = 0;
+draw a--d;
+draw b--c;
+draw z0--z.p--z1;
+draw_marked(a--b, 1);
+draw_marked(c--d, 1);
+draw_marked(a--z.p, 2);
+draw_marked(d--z.p, 2);
+draw_marked(b--z.p, 3);
+draw_marked(c--z.p, 3);
+mark_angle(z.p, b, a, 1);
+mark_angle(z.p, c, d, 1);
+mark_angle(z.p, c, b, 2);
+mark_angle(c, b, z.p, 2);
+mark_rt_angle(z.p, z0, a);
+mark_rt_angle(z.p, z1, b);
+endfig;
+\end{verbatim}
+\quad \mathcenter{\includegraphics{manfig-ru-42}}
+$$
+\caption{Код MetaPost и соответствующий рисунок}
+%%\caption{MetaPost code and the corresponding figure}
+\label{fig42}
+\end{figure}
+
+Задача макроса \verb|draw_marked|\index{draw_marked?\texttt{draw\_marked}}
+--- нарисовать путь с заданным числом пересекающих отметок посередине.
+%%The task of the
+%%\verb|draw_marked|\index{draw_marked?\texttt{draw\_marked}} macro is to
+%%draw a path with a given number of cross marks near its midpoint.
+Стоит начать с подзадачи рисования одной пересекающей путь {\tt p}
+перпендикулярно отметки в некоторое время {\tt t}.
+%%A convenient starting place is the subproblem of drawing a single cross
+%%mark perpendicular to a path {\tt p} at some time {\tt t}.
+Макрос \verb|draw_mark|\index{draw_mark?\texttt{draw\_mark}} на
+рис.~\ref{drawmarked} решает эту подзадачу нахождением сначала вектора
+{\tt dm}, перпендикулярного {\tt p} в~{\tt t}.
+%%The \verb|draw_mark|\index{draw_mark?\texttt{draw\_mark}} macro in
+%%Figure~\ref{drawmarked} does this by first finding a vector {\tt dm}
+%%perpendicular to~{\tt p} at~{\tt t}.
+Для упрощения позиционирования пересекающей отметки определение макроса
+\verb|draw_marked| берет длину дуги\index{длина дуги} {\tt a}
+вдоль {\tt p} и оператором {\tt
+arctime}\index{arctime of?\texttt{arctime of}} вычисляет~{\tt t}
+%%To simplify positioning the cross
+%%mark, the \verb|draw_marked| macro is defined to take an arc
+%%length\index{arc length} {\tt a} along {\tt p} and use the {\tt
+%%arctime}\index{arctime} operator to compute~{\tt t}
+
+С решением подзадачи рисования одной отметки, макросу \verb|draw_marked|
+останется только нарисовать путь и вызвать \verb|draw_mark| с
+соответствующей длиной дуги.
+%%With the subproblem of drawing a single mark out of the way, the
+%%\verb|draw_marked| macro only needs to draw the path and call
+%%\verb|draw_mark| with the appropriate arc length values.
+Макрос \verb|draw_marked| на рис.~\ref{drawmarked} использует
+арифметическую прогрессию из {\tt n} значений {\tt a}, центр которых
+помещается в {\tt .5*arclength~p}\index{arclength?\texttt{arclength}}.
+%%The \verb|draw_marked| macro in Figure~\ref{drawmarked} uses {\tt n}
+%%equally-spaced {\tt a} values centered on {\tt
+%%.5*arclength~p}\index{arclength?\texttt{arclength}}.
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+marksize=4pt;
+
+def draw_mark(expr p, a) =
+ begingroup
+ save t, dm; pair dm;
+ t = arctime a of p;
+ dm = marksize*unitvector direction t of p
+ rotated 90;
+ draw (-.5dm.. .5dm) shifted point t of p;
+ endgroup
+enddef;
+
+def draw_marked(expr p, n) =
+ begingroup
+ save amid;
+ amid = .5*arclength p;
+ for i=-(n-1)/2 upto (n-1)/2:
+ draw_mark(p, amid+.6marksize*i);
+ endfor
+ draw p;
+ endgroup
+enddef;
+\end{verbatim}
+$$
+\caption{Макросы для рисования пути {\tt p} с {\tt n} пересекающими отметками.}
+%%\caption{Macros for drawing a path {\tt p} with {\tt n} cross marks.}
+\label{drawmarked}
+\end{figure}
+
+Из-за того, что \verb|draw_marked| работает для кривых, он может быть
+использован для рисования дуг, генерируемых макросом
+\verb|mark_angle|\index{mark_angle?\texttt{mark\_angle}}.
+%%Since \verb|draw_marked| works for curved lines, it can be used to draw
+%%the arcs that the
+%%\verb|mark_angle|\index{mark_angle?\texttt{mark\_angle}} macro
+%%generates.
+С заданными точками {\tt a}, {\tt b} и {\tt c}, определяющими
+направленный против часовой стрелки угол в {\tt b}, \verb|mark_angle|
+должен сгенерировать маленькую дугу от отрезка {\tt ba} до
+отрезка {\tt bc}.
+%%Given points {\tt a}, {\tt b}, and {\tt c} that define a
+%%counter-clockwise angle at {\tt b}, the \verb|mark_angle| needs to
+%%generate a small arc from segment {\tt ba} to segment {\tt bc}.
+Определение макроса на рис.~\ref{markangle} делает это созданием
+дуги {\tt p} с единичным радиусом и затем вычислением масштабирующего
+множителя {\tt s}, который делает ее достаточно большой на вид.
+%%The
+%%macro definition in Figure~\ref{markangle} does this by creating an arc
+%%{\tt p} of radius one and then computing a scale factor {\tt s} that
+%%makes it big enough to see clearly.
+
+Макрос \verb|mark_rt_angle|\index{mark_rt_angle?\texttt{mark\_rt\_angle}}
+намного проще.
+%%The \verb|mark_rt_angle|\index{mark_rt_angle?\texttt{mark\_rt\_angle}}
+%%macro is much simpler.
+Он берет общий прямой угол и использует оператор {\tt zscaled}\index{zscaled?\texttt{zscaled}} для необходимых вращения и
+масштабирования.
+%%It takes a generic right-angle corner and uses
+%%the {\tt zscaled}\index{zscaled?\texttt{zscaled}} operator to rotate it
+%%and scale it as necessary.
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+angle_radius=8pt;
+
+def mark_angle(expr a, b, c, n) =
+ begingroup
+ save s, p; path p;
+ p = unitvector(a-b){(a-b)rotated 90}..unitvector(c-b);
+ s = .9marksize/length(point 1 of p - point 0 of p);
+ if s<angle_radius: s:=angle_radius; fi
+ draw_marked(p scaled s shifted b, n);
+ endgroup
+enddef;
+
+def mark_rt_angle(expr a, b, c) =
+ draw ((1,0)--(1,1)--(0,1))
+ zscaled (angle_radius*unitvector(a-b)) shifted b
+enddef;
+\end{verbatim}
+$$
+\caption{Макросы для отметки углов.}
+%%\caption{Macros for marking angles.}
+\label{markangle}
+\end{figure}
+
+
+\subsection{Суффиксные и текстовые параметры}
+%%\subsection{Suffix and Text Parameters}
+
+Параметры макроса не всегда должны быть выражениями, как в предыдущих
+примерах.
+%%Macro parameters need not always be expressions as in the previous
+%%examples.
+Замена ключевого слова {\tt expr} на {\tt
+suffix}\index{suffix?\texttt{suffix}} или {\tt
+text}\index{text?\texttt{text}} в определении макроса объявляет параметры
+соответственно именами переменных или произвольной последовательностью
+знаков.
+%%Replacing the keyword {\tt expr} with {\tt
+%%suffix}\index{suffix?\texttt{suffix}} or {\tt
+%%text}\index{text?\texttt{text}} in a macro definition declares the
+%%parameters to be variable names or arbitrary sequences of tokens.
+Например, есть предопределенный макрос с именем {\tt
+hide}\index{hide?\texttt{hide}} и текстовым параметром\index{параметр!text},
+интерпретируемым как последовательность команд,
+производящий пустой \tdescr{текст замены}.
+%%For example, there is a predefined macro called {\tt
+%%hide}\index{hide?\texttt{hide}} that takes a text
+%%parameter\index{parameter!text} and interprets it as a sequence of
+%%statements while ultimately producing an empty \tdescr{replacement
+%%text}.
+Другими словами, {\tt hide} исполняет свой аргумент, а следующий знак
+после него берется так, как будто ничего не произошло.
+%%In other words, {\tt hide} executes its argument and then gets
+%%the next token as if nothing happened.
+Таким образом,
+$$ \hbox{\tt show hide(numeric a,b; a+b=3; a-b=1) a;} $$
+печатает ``\verb|>> 2|.''
+%%Thus
+%%$$ \hbox{\tt show hide(numeric a,b; a+b=3; a-b=1) a;} $$
+%%prints ``\verb|>> 2|.''
+
+Если бы {\tt hide} не был предопределен, то его можно было определить примерно так:
+%%If the {\tt hide} macro were not predefined, it could be defined like this:
+$$\begin{verbatim}
+def ignore(expr a) = enddef;
+def hide(text t) = ignore(begingroup t; 0 endgroup) enddef;
+\end{verbatim}
+$$
+Команды, представленные параметром-текстом {\tt t}, будут считаться
+как часть группы, формирующей аргумент для {\tt ignore}.
+%%The statements represented by the text parameter {\tt t} would be
+%%evaluated as part of the group that forms the argument to {\tt ignore}.
+Из-за того, что {\tt ignore} имеет пустой \tdescr{текст замены}, раскрытие
+{\tt hide} не произведет совершенно ничего.
+%%Since {\tt ignore} has an empty \tdescr{replacement text}, expansion of
+%%the {\tt hide} macro ultimately produces nothing.
+
+Другой пример предопределенного макроса с текстовым параметром --- это
+{\tt dashpattern}\index{dashpattern?\texttt{dashpattern}}.
+%%Another example of a predefined macro with a text parameter is {\tt
+%%dashpattern}\index{dashpattern?\texttt{dashpattern}}.
+Определение {\tt dashpattern} начинает
+$$\begin{verbatim}
+def dashpattern(text t) =
+ begingroup save on, off;
+\end{verbatim}
+$$
+и затем оно определяет {\tt on} и {\tt off} макросами, создающими
+требуемую картинку при появлении текстового параметра {\tt t} в тексте замены.
+%%The definition of {\tt dashpattern} starts
+%%$$\begin{verbatim}
+%%def dashpattern(text t) =
+%% begingroup save on, off;
+%%\end{verbatim}
+%%$$
+%%then it defines {\tt on} and {\tt off} to be macros that create the desired
+%%picture when the text parameter~{\tt t} appears in the replacement text.
+
+Текстовые параметры очень общие, но их общность иногда допустима.
+%%Text parameters are very general, but their generality sometimes gets in
+%%the way.
+Если же вы хотите в точности передавать имя переменной в макрос, то лучше
+объявить ее как параметр-суффикс\index{параметр!suffix}.
+%%If you just want to pass a variable name to a macro, it is
+%%better to declare it as a suffix parameter\index{parameter!suffix}.
+Например, \index{incr?\texttt{incr}}
+$$ \hbox{\verb|def incr(suffix $) = begingroup $:=$+1; $ endgroup enddef;|} $$
+определяет макрос, что будет получать любую числовую переменную, добавлять
+один к ней и возвращать новое значение.
+%%For example,\index{incr?\texttt{incr}}
+%%$$ \hbox{\verb|def incr(suffix $) = begingroup $:=$+1; $ endgroup enddef;|} $$
+%%defines a macro that will take any numeric variable, add one to it, and return
+%%the new value.
+Из-за того, что имена переменных могут состоять из более одного знака,
+$$ \hbox{\tt incr(a3b)} $$
+вполне допустимо, если {\tt a3b} --- числовая переменная.
+%%Since variable names can be more than one token long,
+%%$$ \hbox{\tt incr(a3b)} $$
+%%is perfectly acceptable if {\tt a3b} is a numeric variable.
+Параметры-суффиксы являются несколько более общими, чем имена переменных,
+потому что определения на рис.~\ref{syvar} допускает
+\tdescr{суффикс}\index{суффикс?\tdescr{суффикс}}, начинающийся
+с \tdescr{индекса}\index{индекс?\tdescr{индекс}}.
+%%Suffix parameters are slightly more general than variable names because the
+%%definition in Figure~\ref{syvar} allows a
+%%\tdescr{suffix}\index{suffix?\tdescr{suffix}} to start with a
+%%\tdescr{subscript}\index{subscript?\tdescr{subscript}}.
+
+Рис.~\ref{fig45} показывает как параметры suffix и expr могут быть
+использованы вместе.
+%%Figure~\ref{fig45} shows how suffix and expr parameters can be used
+%%together.
+Макрос {\tt getmid}\index{getmid?\texttt{getmid}} берет переменную-путь
+и создает массивы точек и направления, чьи имена получаются
+присоединением {\tt mid}, {\tt off} и {\tt dir} к переменной-пути.
+%%The {\tt getmid}\index{getmid?\texttt{getmid}} macro takes a
+%%path variable and creates arrays of points and directions whose names
+%%are obtained by appending {\tt mid}, {\tt off}, and {\tt dir} to the
+%%path variable.
+Макрос {\tt joinup}\index{joinup?\texttt{joinup}} берет
+массив точек и направлений и создает путь длины {\tt
+n}, проходящий через каждую {\tt pt[i]} с направлением {\tt d[i]} или
+$-\hbox{\tt d[i]}$.
+%%The {\tt joinup}\index{joinup?\texttt{joinup}} macro
+%%takes arrays of points and directions and creates a path of length {\tt
+%%n} that passes through each {\tt pt[i]} with direction {\tt d[i]} or
+%%$-\hbox{\tt d[i]}$.
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+def getmid(suffix p) =
+ pair p.mid[], p.off[], p.dir[];
+ for i=0 upto 36:
+ p.dir[i] = dir(5*i);
+ p.mid[i]+p.off[i] = directionpoint p.dir[i] of p;
+ p.mid[i]-p.off[i] = directionpoint -p.dir[i] of p;
+ endfor
+enddef;
+
+def joinup(suffix pt, d)(expr n) =
+ begingroup
+ save res, g; path res;
+ res = pt[0]{d[0]};
+ for i=1 upto n:
+ g:= if (pt[i]-pt[i-1]) dotprod d[i] <0: - fi 1;
+ res := res{g*d[i-1]}...{g*d[i]}pt[i];
+ endfor
+ res
+ endgroup
+enddef;
+
+beginfig(45)
+path p, q;
+p = ((5,2)...(3,4)...(1,3)...(-2,-3)...(0,-5)...(3,-4)
+ ...(5,-3)...cycle) scaled .3cm shifted (0,5cm);
+getmid(p);
+draw p;
+draw joinup(p.mid, p.dir, 36)..cycle;
+q = joinup(p.off, p.dir, 36);
+draw q..(q rotated 180)..cycle;
+drawoptions(dashed evenly);
+for i=0 upto 3:
+ draw p.mid[9i]-p.off[9i]..p.mid[9i]+p.off[9i];
+ draw -p.off[9i]..p.off[9i];
+endfor
+endfig;
+\end{verbatim}
+\quad \mathcenter{\includegraphics{manfig-ru-45}}
+$$
+\caption{Код MetaPost и соответствующий рисунок}
+%%\caption{MetaPost code and the corresponding figure}
+\label{fig45}
+\end{figure}
+
+Начинающееся с
+$$ \hbox{\tt def joinup(suffix pt, d)(expr n) =} $$
+определение может восприниматься так, что вызов макроса {\tt joinup} может
+иметь два набора скобок как в
+$$ \hbox{\tt joinup(p.mid, p.dir)(36)} $$
+вместо
+$$ \hbox{\tt joinup(p.mid, p.dir, 36)} $$
+%%A definition that starts
+%%$$ \hbox{\tt def joinup(suffix pt, d)(expr n) =} $$
+%%might suggest that calls to the {\tt joinup} macro should have two sets of
+%%parentheses as in
+%%$$ \hbox{\tt joinup(p.mid, p.dir)(36)} $$
+%%instead of
+%%$$ \hbox{\tt joinup(p.mid, p.dir, 36)} $$
+Обе формы являются допустимыми.
+%%In fact, both forms are acceptable.
+Параметры в вызове макроса могут разделяться запятыми или парами {\tt )(}.
+%%Parameters in a macro call can be
+%%separated by commas or by {\tt )(} pairs.
+Есть только одно ограничение --- за текстовым параметром\index{параметр!text}
+должна идти правая скобка.
+%%The only restriction is that
+%%a text parameter\index{parameter!text} must be followed by a right
+%%parenthesis.
+Например, макрос {\tt foo} с одним параметром text и другим expr может
+быть вызван
+$$ \hbox{\tt foo(a,b)(c),} $$
+в этом случае текстовый параметр --- это ``{\tt a,b}'', а параметр-выражение
+--- {\tt c}, но
+$$ \hbox{\tt foo(a,b,c)} $$
+устанавливает параметр-текст в ``{\tt a,b,c}'' и оставляет интерпретатор
+MetaPost продолжать искать параметр-выражение.
+%%For instance, a macro {\tt foo} with one text parameter
+%%and one expr parameter can be called
+%%$$ \hbox{\tt foo(a,b)(c)} $$
+%%in which case the text parameter is ``{\tt a,b}'' and the expr parameter is
+%{\tt c}, but
+%%$$ \hbox{\tt foo(a,b,c)} $$
+%%sets the text parameter to ``{\tt a,b,c}'' and leaves the MetaPost interpreter
+%%still looking for the expr parameter.
+
+\subsection{Макросы vardef}
+%%\subsection{Vardef Macros}
+
+Определение макроса может начинаться с {\tt
+vardef}\index{vardef?\texttt{vardef}} вместо {\tt def}.
+%%A macro definition can begin with {\tt
+%%vardef}\index{vardef?\texttt{vardef}} instead of {\tt def}.
+Макрос, определенный таким образом, называется vardef-макросом.
+%%Macros defined in this way are called vardef macros.
+Они особенно хорошо подходят к приложениям, где макросы используются
+как функции или процедуры.
+%%They are particularly
+%%well-suited to applications where macros are being used like functions
+%%or subroutines.
+Главная идея в том, что vardef-макрос подобен переменной типа ``макрос''.
+%%The main idea is that a vardef macro is like a variable
+%%of type ``macro.''
+
+Вместо {\tt def} \tdescr{символический знак} vardef-макрос начинает
+$$ {\tt vardef}\, \descr{обобщенная переменная}, $$
+где \tdescr{обобщенная переменная}\index{обобщенная переменная?\tdescr{обобщенная
+переменная}} -- это имя переменной с числовыми индексами, замененными
+на символ обобщенного индекса\index{индекс!обобщенный} --- {\tt
+[]}\index{[]?\texttt{[]}!vardef macro?\texttt{vardef}-макрос}.
+%%Instead of {\tt def} \tdescr{symbolic token}, a vardef macro begins
+%%$$ {\tt vardef}\, \descr{generic variable} $$
+%%where a \tdescr{generic variable}\index{generic variable?\tdescr{generic
+%%variable}} is a variable name with numeric subscripts replaced by the
+%%generic subscript\index{subscript!generic} symbol {\tt
+%%[]}\index{[]?\texttt{[]}!vardef macro?\texttt{vardef} macro}.
+Другими словами, имя после {\tt vardef} обязано иметь в точности
+такой же синтаксис как и имя в декларации переменной.
+%%In other words, the name following {\tt
+%%vardef} obeys exactly the same syntax as the name given in a variable
+%%declaration.
+Оно --- последовательность этикеток и символов обобщенного индекса,
+начинающаяся с этикетки, где этикетка\index{этикетки} --- это символический знак,
+не являющийся макросом или примитивным оператором, как объяснялось в
+разделе~\ref{vardecl}.
+%%It is a sequence of tags and generic subscript symbols
+%%starting with a tag, where a tag\index{tags} is a symbolic token that is
+%%not a macro or a primitive operator as explained in
+%%Section~\ref{vardecl}.
+
+В простейшем случае имя vardef-макроса состоит из одной этикетки.
+%%The simplest case is when the name of a vardef macro consists of a
+%%single tag.
+В таких обстоятельствах {\tt def} и {\tt vardef} обеспечивают почти
+одинаковую функциональность.
+%%Under such circumstances, {\tt def} and {\tt vardef}
+%%provide roughly the same functionality.
+Наиболее очевидная разница в том, что {\tt begingroup}\index{begingroup?\texttt{begingroup}} и {\tt
+endgroup}\index{endgroup?\texttt{endgroup}} автоматически вставляются
+соответственно в начало и конец \tdescr{текста замены} каждого
+vardef-макроса.
+%%The most obvious difference is
+%%that {\tt begingroup}\index{begingroup?\texttt{begingroup}} and {\tt
+%%endgroup}\index{endgroup?\texttt{endgroup}} are automatically inserted
+%%at the beginning and end of the \tdescr{replacement text} of every
+%%vardef macro.
+Это делает \tdescr{текст замены} группой и поэтому vardef-макрос
+ведет себя подобно процедуре или функции.
+%%This makes the \tdescr{replacement text} a group so that
+%%a vardef macro behaves like a subroutine or a function call.
+
+Другое свойство vardef-макросов заключается в разрешении имен из многих
+этикеток и имен, содержащих обобщенные индексы.
+%%Another property of vardef macros is that they allow multi-token macro
+%%names and macro names involving generic subscripts.
+Когда имя vardef-макроса имеет обобщенные индексы, то числовые значения
+для них должны быть заданы при вызове этого макроса.
+%%When a vardef macro
+%%name has generic subscripts, numeric values have to be given when the
+%%macro is called.
+После определения макроса
+$$ \hbox{\tt vardef a[]b(expr p) =}\, \descr{текст замены}\,
+ \hbox{\tt enddef;}
+$$
+{\tt a2b((1,2))} и {\tt a3b((1,2)..(3,4))} --- это вызовы макроса.
+%%After a macro definition
+%%$$ \hbox{\tt vardef a[]b(expr p) =}\, \descr{replacement text}\,
+%% \hbox{\tt enddef;}
+%%$$
+%%{\tt a2b((1,2))} and {\tt a3b((1,2)..(3,4))} are macro calls.
+Но как может \tdescr{текст замены} сказать о разнице между {\tt a2b}
+и {\tt a3b}?
+%%But how
+%%can the \tdescr{replacement text} tell the difference between {\tt a2b}
+%%and {\tt a3b}?
+Два неявных параметра-суффикса\index{параметр!suffix}
+автоматически предоставляются для этой цели.
+%%Two implicit suffix parameters\index{parameter!suffix}
+%%are automatically provided for this purpose.
+Каждый vardef-макрос имеет параметры-суффиксы
+\verb|#@|\index{#@?\texttt{\#@}} и
+\verb|@|\index{@?\texttt{@}}, где \verb|@| --- это последний знак в имени
+вызова макроса, а \verb|#@| --- это все предшествующее последнему знаку.
+%%Every vardef macro has
+%%suffix parameters \verb|#@|\index{#@?\texttt{\#@}} and
+%%\verb|@|\index{@?\texttt{@}}, where \verb|@| is the last token in the
+%%name from the macro call and \verb|#@| is everything preceding the last
+%%token.
+Поэтому \verb|#@| равно {\tt a2}, когда данное имя --- {\tt a2b}, и
+{\tt a3}, когда данное имя --- {\tt a3b}.
+%%Thus \verb|#@| is {\tt a2} when the name is given as {\tt a2b}
+%%and {\tt a3} when the name is given as {\tt a3b}.
+
+Предположим, например, что макрос {\tt a[]b} сдвигает свой аргумент на
+величину, зависящую от имени вызова этого макроса.
+%%Suppose, for example, that the {\tt a[]b} macro is to take its argument
+%%and shift it by an amount that depends on the macro name.
+Такой макрос можно определить примерно так:
+$$ \hbox{\verb|vardef a[]b(expr p) = p shifted (#@,b) enddef;|} $$
+%%The macro could be defined like this:
+%%$$ \hbox{\verb|vardef a[]b(expr p) = p shifted (#@,b) enddef;|} $$
+Тогда {\tt a2b((1,2))} означает {\tt (1,2) shifted (a2,b)}
+и {\tt a3b((1,2)..(3,4))} означает
+$$ \hbox{\tt ((1,2)..(3,4)) shifted (a3,b)}. $$
+%%Then {\tt a2b((1,2))} means {\tt (1,2) shifted (a2,b)}
+%%and {\tt a3b((1,2)..(3,4))} means
+%%$$ \hbox{\tt ((1,2)..(3,4)) shifted (a3,b)}. $$
+
+Если макрос был {\tt a.b[]}, то \verb|#@| всегда будет {\tt a.b},
+а параметр \verb|@| будет давать числовой индекс.
+%%If the macro had been {\tt a.b[]}, \verb|#@| would always be {\tt a.b}
+%%and the \verb|@| parameter would give the numeric subscript.
+Таким образом, {\tt a@} будет ссылаться на элемент массива {\tt a[]}.
+%%Then {\tt a@} would refer to an element of the array {\tt a[]}.
+Заметьте, что \verb|@| --- это параметр-суффикс, а не параметр-выражение,
+поэтому выражение, подобное {\tt @+1}, ошибочно.
+%%Note that
+%%\verb|@| is a suffix parameter, not an expr parameter, so an expression
+%%like {\tt @+1} would be illegal.
+Единственный способ получить числовые значения индексов
+параметра-суффикса\index{параметр!suffix}
+в извлечении их из строки, возвращаемой оператором {\tt
+str}\index{str?\texttt{str}}\label{Dstr}.
+%%The only way to get at the numeric
+%%values of subscripts in a suffix parameter\index{parameter!suffix} is by
+%%extracting them from the string returned by the {\tt
+%%str}\index{str?\texttt{str}}\label{Dstr} operator.
+Этот оператор по суффиксу возвращает его строковое представление.
+%%This operator takes
+%%a suffix and returns a string representation of a suffix.
+Поэтому {\tt str @} будет \verb|"3"| для {\tt a.b3} и \verb|"3.14"| для {\tt a.b3.14} или {\tt a.b[3.14]}.
+%%Thus {\tt str
+%%@} would be \verb|"3"| in {\tt a.b3} and \verb|"3.14"| in {\tt a.b3.14}
+%%or {\tt a.b[3.14]}.
+Из-за того, что синтаксис для \tdescr{суффикса}\index{суффикс?\tdescr{суффикс}}
+на рис.~\ref{syvar} требует заключать отрицательные индексы в квадратные
+скобки, {\tt str @} возвращает {\tt \qq{[-3]}\qq} для {\tt a.b[-3]}.
+%%Since the syntax for a
+%%\tdescr{suffix}\index{suffix?\tdescr{suffix}} in Figure~\ref{syvar}
+%%requires negative subscripts to be in brackets, {\tt str @} returns {\tt
+%%\qq{[-3]}\qq} in {\tt a.b[-3]}.
+
+Оператор {\tt str}, как правило, используется только при крайней
+необходимости.
+%%The {\tt str} operator is generally for emergency use only.
+Лучше использовать параметры-суффиксы только как имена переменных или
+суффиксы.
+%%It is
+%%better to use suffix parameters only as variable names or suffixes.
+Наилучший пример vardef-макроса, использующего суффиксы, --- это макрос,
+определяющий соглашение по
+{\tt z}\index{z convention?{\tt z}-соглашение}.
+%%The
+%%best example of a vardef macro involving suffixes is the {\tt z} macro
+%%that defines the {\tt z} convention\index{z convention?{\tt z}
+%%convention}.
+Определение использует специальный знак
+\verb|@#|\index{@#?\texttt{@\#}}, который ссылается на суффикс после имени
+макроса:
+$$ \hbox{\verb|vardef z@#=(x@#,y@#) enddef;|} $$
+%%The definition involves a special token
+%%\verb|@#|\index{@#?\texttt{@\#}} that refers to the suffix following the
+%%macro name:
+%%$$ \hbox{\verb|vardef z@#=(x@#,y@#) enddef;|} $$
+Оно означает, что любое имя переменной, чей первый знак {\tt z},
+эквивалентно паре переменных, чьи имена получаются заменой {\tt z} на
+{\tt x} и~{\tt y}.
+%%This means that any variable name whose first token is {\tt z} is
+%%equivalent to a pair of variables whose names are obtained by replacing
+%%{\tt z} with {\tt x} and~{\tt y}.
+Например, {\tt z.a1} вызывает макрос {\tt z} с параметром-суффиксом
+\verb|@#|, установленным в {\tt a1}.
+%%For instance, {\tt z.a1} calls the
+%%{\tt z} macro with the suffix parameter \verb|@#| set to {\tt a1}.
+
+В общем,
+$$ {\tt vardef}\, \descr{обобщенная переменная} \hbox{\verb|@#|} $$
+является альтернативой {\tt vardef} \tdescr{обобщенная переменная},
+приводящей интерпретатор MetaPost к выделению суффикса, следующего за
+именем, заданным в вызове макроса, и делающей его доступным как
+параметр-суффикс \verb|@#|.
+%%In general,
+%%$$ {\tt vardef}\, \descr{generic variable} \hbox{\verb|@#|} $$
+%%is an alternative to {\tt vardef} \tdescr{generic variable} that causes the
+%%MetaPost interpreter
+%%to look for a suffix following the name given in the macro call and makes this
+%%available as the \verb|@#| suffix parameter.
+
+Суммируем особые свойства vardef-макросов: они допускают как широкий класс
+имен для макросов, так и имена макросов, за которыми следует специальный
+параметр-суффикс.
+%%To summarize the special features of vardef macros, they allow a broad
+%%class of macro names as well as macro names followed by a special suffix
+%%parameter.
+Более того, {\tt begingroup} и {\tt endgroup} автоматически
+добавляются к \tdescr{тексту замены} vardef-макроса.
+%%Furthermore, {\tt begingroup} and {\tt endgroup} are
+%%automatically added to the \tdescr{replacement text} of a vardef macro.
+Таким образом, использование {\tt vardef} вместо {\tt def} для
+определения макроса {\tt joinup}\index{joinup?\texttt{joinup}} на
+рис.~\ref{fig45} позволит избежать нужды явно включать {\tt begingroup}
+и {\tt endgroup} в определение макроса.
+%%Thus using {\tt vardef} instead of {\tt def} to define the {\tt
+%%joinup}\index{joinup?\texttt{joinup}} macro in Figure~\ref{fig45} would
+%%have avoided the need to include {\tt begingroup} and {\tt endgroup}
+%%explicitly in the macro definition.
+
+Фактически, большинство определений макросов в предыдущих примерах могут
+использовать {\tt vardef} вместо {\tt def}.
+%%In fact, most of the macro definitions given in previous examples could
+%%equally well use {\tt vardef} instead of {\tt def}.
+Обычно не имеет большого значения, который из них использовать, но есть
+хорошее общее правило: используйте {\tt vardef}, если вы собираетесь
+использовать макрос как функцию или процедуру.
+%%It usually does not
+%%matter very much which you use, but a good general rule is to use {\tt
+%%vardef} if you intend the macro to be used like a function or a
+%%subroutine.
+Следующее сравнение должно помочь при решении, когда использовать
+{\tt vardef}.
+%%The following comparison should help in deciding when to
+%%use {\tt vardef}.
+
+\begin{itemize}
+\item Vardef-макрос автоматически окружен {\tt begingroup} и
+{\tt endgroup}.
+%%\item Vardef macros are automatically surrounded by {\tt begingroup}
+%%and {\tt endgroup}.
+\item Имя vardef-макроса может быть более одного знака длиной и оно
+может содержать индексы.
+%%\item The name of a vardef macro can be more than one token long and it can
+%%contain subscripts.
+\item Vardef-макрос может иметь доступ к суффиксу, следующему за именем
+макроса при его вызове.
+%%\item A vardef macro can have access to the suffix that follows the macro name
+%%when the macro is called.
+\item Когда символический знак используется в имени vardef-макроса, он
+остается этикеткой\index{этикетки} и может по-прежнему использоваться в именах
+других переменных.
+%%\item When a symbolic token is used in the name of a vardef macro it remains
+%%a tag\index{tags} and can still be used in other variable names.
+Поэтому {\tt p5dir} --- это правильное имя переменной, несмотря на то, что
+{\tt dir} --- это vardef-макрос, но обычный макрос, такой как {\tt ...}\index{...?\texttt{...}}, не может быть использован в имени переменной.
+%%Thus
+%%{\tt p5dir} is a legal variable name even though {\tt dir} is a vardef
+%%macro, but an ordinary macro such as {\tt ...}\index{...?\texttt{...}}
+%%cannot be used in a variable name.
+Это к лучшему, потому как {\tt z5...z6} естественно считать выражением-путем,
+а не составным именем переменной.
+%%(This is fortunate since {\tt
+%%z5...z6} is supposed to be a path expression, not an elaborate variable
+%%name).
+\end{itemize}
+
+\subsection{Определение унарных и бинарных макросов}
+%%\subsection{Defining Unary and Binary Macros}
+
+Уже не раз упоминалось, что некоторые обсуждаемые до сих пор операторы
+и команды на самом деле являются предопределенными макросами.
+%%It has been mentioned several times that some of the operators and
+%%commands discussed so far are actually predefined macros.
+Это касается унарных операторов {\tt round}\index{round?\texttt{round}} и {\tt
+unitvector}\index{unitvector?\texttt{unitvector}}, команд
+{\tt fill}\index{fill?\texttt{fill}} и {\tt
+draw}\index{draw?\texttt{draw}}, бинарных операторов {\tt
+dotprod}\index{dotprod?\texttt{dotprod}} и {\tt
+intersectionpoint}\index{intersectionpoint?\texttt{intersectionpoint}}.
+%%These include
+%%unary operators such as {\tt round}\index{round?\texttt{round}} and {\tt
+%%unitvector}\index{unitvector?\texttt{unitvector}}, statements such as
+%%{\tt fill}\index{fill?\texttt{fill}} and {\tt
+%%draw}\index{draw?\texttt{draw}}, and binary operators such as {\tt
+%%dotprod}\index{dotprod?\texttt{dotprod}} and {\tt
+%%intersectionpoint}\index{intersectionpoint?\texttt{intersectionpoint}}.
+Главная разница между этими макросами и теми, определения которых мы уже
+знаем, в том, как определять синтаксис их аргументов.
+%%The main difference between these macros and the ones we already know
+%%how to define is their argument syntax.
+
+Макросы {\tt round} и {\tt unitvector} --- это примеры того, что
+на рис.~\ref{syexpr} зовется \tdescr{унарным оператором}.
+%%The {\tt round} and {\tt unitvector} macros are examples of what
+%%Figure~\ref{syexpr} calls \tdescr{unary op}.
+За ними следует выражение-первичность.
+%%That is, they are followed by a primary expression.
+Для указания аргумента макроса такого типа определение макроса должно
+выглядеть подобно этому:
+$$ \hbox{\tt vardef round primary u =}\, \descr{текст замены}\,
+ \hbox{\tt enddef;}
+$$
+%%To specify a macro argument of this type, the
+%%macro definition should look like this:
+%%$$ \hbox{\tt vardef round primary u =}\, \descr{replacement text}\,
+%% \hbox{\tt enddef;}
+%%$$
+Параметр {\tt u} --- это {\tt expr}-параметр\index{параметр!expr} и он
+может быть использован в точности также как параметр-выражение,
+определяемый обычным синтаксисом,
+$$ \hbox{\tt (expr u)} $$
+%%The {\tt u} parameter is an expr parameter\index{parameter!expr} and it can be
+%%used exactly like the expr parameter defined using the ordinary
+%%$$ \hbox{\tt (expr u)} $$
+%%syntax.
+
+Как предполагает пример с {\tt round}, макрос может определяться с
+параметром
+\tdescr{вторичностью}\index{вторичность?\tdescr{вторичность}},
+\tdescr{третичностью}\index{третичность?\tdescr{третичность}} или
+\tdescr{выражением}\index{выражение?\tdescr{выражение}}.
+%%As the {\tt round} example suggests, a macro can be defined to take a
+%%\tdescr{secondary}\index{secondary?\tdescr{secondary}},
+%%\tdescr{tertiary}\index{tertiary?\tdescr{tertiary}}, or an
+%%\tdescr{expression}\index{expression?\tdescr{expression}} parameter.
+Например, предопределенное определение макроса {\tt fill} примерно такое\index{fill?\texttt{fill}}
+$$ \hbox{\tt def fill expr c = addto currentpicture contour c enddef;} $$
+%%For example, the predefined definition of the {\tt fill} macro is
+%%roughly\index{fill?\texttt{fill}}
+%%$$ \hbox{\tt def fill expr c = addto currentpicture contour c enddef;} $$
+
+Возможно даже определить макрос в роли \tdescr{of-оператора}\index{of operator?\tdescr{of-оператор}} из рис.~\ref{syexpr}.
+%%It is even possible to define a macro to play the role of \tdescr{of
+%%operator}\index{of operator?\tdescr{of operator}} in
+%%Figure~\ref{syexpr}.
+Например, макрос {\tt direction
+of}\index{direction of?\texttt{direction of}} имеет определение такой
+формы:
+$$ \hbox{\tt vardef direction expr t of p =}\, \descr{текст замены}\,
+ \hbox{\tt enddef;}
+$$
+%%For example, the {\tt direction
+%%of}\index{direction of?\texttt{direction of}} macro has a definition of
+%%this form:
+%%$$ \hbox{\tt vardef direction expr t of p =}\, \descr{replacement text}\,
+%% \hbox{\tt enddef;}
+%%$$
+
+Макросы можно также определять с поведением, подобным бинарным операторам.
+%%Macros can also be defined to behave like binary operators.
+Например, определение макроса {\tt dotprod} имеет
+форму\index{dotprod?\texttt{dotprod}}\index{primarydef?\texttt{primarydef}}
+$$ \hbox{\tt primarydef w dotprod z =}\, \descr{текст замены}\,
+ \hbox{\tt enddef;}
+$$
+%%For instance, the
+%%definition of the {\tt dotprod} macro has the
+%%form\index{dotprod?\texttt{dotprod}}\index{primarydef?\texttt{primarydef}}
+%%$$ \hbox{\tt primarydef w dotprod z =}\, \descr{replacement text}\,
+%% \hbox{\tt enddef;}
+%%$$
+Эта форма делает {\tt dotprod} \tdescr{первичным бинарным
+оператором}\index{первичный
+binop?\tdescr{первичный бинарный оператор}}.
+%%This makes {\tt dotprod} a \tdescr{primary binop}\index{primary
+%%binop?\tdescr{primary binop}}.
+Похожим образом {\tt
+secondarydef}\index{secondarydef?\texttt{secondarydef}} и {\tt
+tertiarydef}\index{tertiarydef?\texttt{tertiarydef}} вводят определения
+\tdescr{вторичного бинарного оператора}\index{вторичный binop?\tdescr{вторичный бинарный оператор}}
+и \tdescr{третичного бинарного оператора}\index{третичный binop?\tdescr{третичный бинарный оператор}}.
+%%Similarly, {\tt
+%%secondarydef}\index{secondarydef?\texttt{secondarydef}} and {\tt
+%%tertiarydef}\index{tertiarydef?\texttt{tertiarydef}} introduce
+%%\tdescr{secondary binop}\index{secondary binop?\tdescr{secondary binop}}
+%%and \tdescr{tertiary binop}\index{tertiary binop?\tdescr{tertiary
+%%binop}} definitions.
+Все они определяют обычные макросы, а не vardef-макросы, например,
+``{\tt primaryvardef}'' не существует.
+%%These all define ordinary macros, not vardef
+%%macros; e.g., there is no ``{\tt primaryvardef}.''
+
+Таким образом, определения макросов могут вводиться с {\tt def},
+{\tt vardef}, {\tt primarydef}, {\tt secondarydef} или {\tt tertiarydef}.
+%%Thus macro definitions can be introduced by {\tt def}, {\tt vardef},
+%%{\tt primarydef}, {\tt secondarydef}, or {\tt tertiarydef}.
+\tdescr{Текст замены}\index{текст замены?\tdescr{текст замены}}
+--- это любой список знаков, сбалансированный относительно пар {\tt
+def}-{\tt enddef}, где все пять определяющих макрос знаков
+рассматриваются подобными {\tt def} в соответствии {\tt def}-{\tt enddef}.
+%%A \tdescr{replacement text}\index{replacement text?\tdescr{replacement
+%%text}} is any list of tokens that is balanced with respect to {\tt
+%%def}-{\tt enddef} pairs where all five macro definition tokens are
+%%treated like {\tt def} for the purpose of {\tt def}-{\tt enddef}
+%%matching.
+
+Весь синтаксис для определений макросов приводится на рис.~\ref{symacro}.
+%%The rest of the syntax for macro definitions is summarized in
+%%Figure~\ref{symacro}.
+В этом синтаксисе есть несколько сюрпризов.
+%%The syntax contains a few surprises.
+Параметры макроса могут иметь \tdescr{отделенную часть} и
+\tdescr{неотделенную часть}.
+%%The macro
+%%parameters can have a \tdescr{delimited part} and an \tdescr{undelimited
+%%part}.
+Обычно одна из них \tdescr{пусто}, но возможно иметь обе части непустыми:
+$$ \hbox{\tt def foo(text a) expr b =}\, \descr{текст замены}\,
+ \hbox{\tt enddef;}
+$$
+%%Normally, one of these is \tdescr{empty}, but it is possible to
+%%have both parts nonempty:
+%%$$ \hbox{\tt def foo(text a) expr b =}\, \descr{replacement text}\,
+%% \hbox{\tt enddef;}
+%%$$
+Это определяет макрос {\tt foo} с текстовым параметром в скобках, за которым
+идет выражение.
+%%This defines a macro {\tt foo} to take a text parameter in parentheses followed
+%%by an expression.
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{определение макроса} \rightarrow
+ \descr{заголовок макроса} \hbox{\tt =} \descr{текст замены}\, enddef$\\
+%%$\tt \descr{macro definition} \rightarrow
+%% \descr{macro heading} \hbox{\tt =} \descr{replacement text}\, enddef$\\
+$\tt \descr{заголовок макроса} \rightarrow def\, \descr{символический знак}
+ \descr{отделенная часть} \descr{неотделенная часть}$\\
+%%$\tt \descr{macro heading} \rightarrow def\, \descr{symbolic token}
+%% \descr{delimited part} \descr{undelimited part}$\\
+$\tt \qquad \;|\; vardef\, \descr{обобщенная переменная} \descr{отделенная часть}
+ \descr{неотделенная часть}$\\
+%%$\tt \qquad \;|\; vardef\, \descr{generic variable} \descr{delimited part}
+%% \descr{undelimited part}$\\
+$\tt \qquad \;|\; vardef\, \descr{обобщенная переменная} \hbox{\tt @\#}
+ \descr{отделенная часть} \descr{неотделенная часть}$\\
+%%$\tt \qquad \;|\; vardef\, \descr{generic variable} \hbox{\tt @\#}
+%% \descr{delimited part} \descr{undelimited part}$\\
+$\tt \qquad \;|\; \descr{определение бинарности} \descr{параметр}
+ \descr{символический знак} \descr{параметр}$\\
+%%$\tt \qquad \;|\; \descr{binary def} \descr{parameter}
+%% \descr{symbolic token} \descr{parameter}$\\
+$\tt \descr{отделенная часть} \rightarrow \descr{пусто}$\\
+%%$\tt \descr{delimited part} \rightarrow \descr{empty}$\\
+$\tt \qquad \;|\; \descr{отделенная часть}
+ \hbox{\tt (}\descr{тип параметра} \descr{знаки параметра}\hbox{\tt )}$\\
+%%$\tt \qquad \;|\; \descr{delimited part}
+%% \hbox{\tt (}\descr{parameter type} \descr{parameter tokens}\hbox{\tt )}$\\
+$\tt \descr{тип параметра} \rightarrow expr \;|\; suffix \;|\; text$\\
+%%$\tt \descr{parameter type} \rightarrow expr \;|\; suffix \;|\; text$\\
+$\tt \descr{знаки параметра} \rightarrow \descr{параметр} \;|\;
+ \descr{знаки параметра}\hbox{\tt ,} \descr{параметр}$\\
+%%$\tt \descr{parameter tokens} \rightarrow \descr{parameter} \;|\;
+%% \descr{parameter tokens}\hbox{\tt ,} \descr{parameter}$\\
+$\tt \descr{параметр} \rightarrow \descr{символический знак}$\\
+%%$\tt \descr{parameter} \rightarrow \descr{symbolic token}$\\
+$\tt \descr{неотделенная часть} \rightarrow \descr{пусто}$\\
+%%$\tt \descr{undelimited part} \rightarrow \descr{empty}$\\
+$\tt \qquad \;|\; \descr{тип параметра} \descr{параметр}$\\
+%%$\tt \qquad \;|\; \descr{parameter type} \descr{parameter}$\\
+$\tt \qquad \;|\; \descr{приоритет} \descr{параметр}$\\
+%%$\tt \qquad \;|\; \descr{precedence level} \descr{parameter}$\\
+$\tt \qquad \;|\; expr\, \descr{параметр}\, of\, \descr{параметр}$\\
+%%$\tt \qquad \;|\; expr\, \descr{parameter}\, of\, \descr{parameter}$\\
+$\tt \descr{приоритет} \rightarrow primary \;|\; secondary \;|\;
+ tertiary$\\
+%%$\tt \descr{precedence level} \rightarrow primary \;|\; secondary \;|\;
+%% tertiary$\\
+$\tt \descr{определение бинарности} \rightarrow primarydef \;|\; secondarydef \;|\;
+ tertiatydef$
+%%$\tt \descr{binary def} \rightarrow primarydef \;|\; secondarydef \;|\;
+%% tertiatydef$
+\end{ctabbing}
+\caption{Синтаксис определений макросов}
+%%\caption{The syntax for macro definitions}
+\label{symacro}
+\end{figure}
+
+Синтаксис также позволяет \tdescr{неотделенной части} указывать тип
+аргумента {\tt suffix}\index{suffix?\texttt{suffix}} или {\tt
+text}\index{text?\texttt{text}}.
+%%The syntax also allows the \tdescr{undelimited part} to specify an
+%%argument type of {\tt suffix}\index{suffix?\texttt{suffix}} or {\tt
+%%text}\index{text?\texttt{text}}.
+Пример макроса с неотделенным параметром-суффиксом\index{параметр!suffix} ---
+это предопределенный макрос {\tt incr}\index{incr?\texttt{incr}}\label{Dincr},
+который в действительности определяется примерно так:
+$$ \hbox{\verb|vardef incr suffix $ = $:=$+1; $ enddef;|} $$
+%%An example of a macro with an
+%%undelimited suffix parameter\index{parameter!suffix} is the predefined
+%%macro {\tt incr}\index{incr?\texttt{incr}}\label{Dincr} that is actually
+%%defined like this:
+%%$$ \hbox{\verb|vardef incr suffix $ = $:=$+1; $ enddef;|} $$
+Это делает {\tt incr} функцией, что берет переменную, увеличивает ее и
+возвращает новое значение.
+%%This makes {\tt incr} a function that takes a variable, increments it,
+%%and returns the new value.
+Неотделенные параметры-суффиксы могут быть в скобках, поэтому и {\tt incr a},
+и {\tt incr(a)} правильны, если {\tt a} --- это числовая переменная.
+%%Undelimited suffix parameters may be
+%%parenthesized, so {\tt incr a} and {\tt incr(a)} are both legal if {\tt
+%%a} is a numeric variable.
+Есть также похожий предопределенный макрос {\tt
+decr}\index{decr?\texttt{decr}}, вычитающий~1.
+%%There is also a similar predefined macro {\tt
+%%decr}\index{decr?\texttt{decr}} that subtracts~1.
+
+Неотделенные текстовые параметры\index{параметр!text} распространяются до
+конца команды.
+%%Undelimited text parameters\index{parameter!text} run to the end of a
+%%statement.
+Более точно, неотделенный текстовый параметр --- это список знаков, следующих
+за вызовом макроса до первого ``{\tt ;}\index{точка с запятой}'' или ``{\tt
+endgroup}\index{endgroup?\texttt{endgroup}}'' или ``{\tt
+end}\index{end?\texttt{end}}'', с тем уточнением, что аргумент, содержащий
+``{\tt begingroup}'' будет всегда включать соответствующий ``{\tt endgroup}''.
+%%More precisely, an undelimited text parameter is the list of
+%%tokens following the macro call up to the first ``{\tt
+%%;}\index{semicolon}'' or ``{\tt
+%%endgroup}\index{endgroup?\texttt{endgroup}}'' or ``{\tt
+%%end}\index{end?\texttt{end}}'' except that an argument containing ``{\tt
+%%begingroup}'' will always include the matching ``{\tt endgroup}.''
+Пример неотделенного текстового параметра --- в предопределенном макросе
+{\tt cutdraw}\index{cutdraw?\texttt{cutdraw}}\label{Dctdraw}, чье
+определение выглядит примерно так\index{linecap?\texttt{linecap}}\index{butt?\texttt{butt}}\index{interim?\texttt{interim}}
+$$\begin{verbatim}
+def cutdraw text t =
+ begingroup interim linecap:=butt; draw t; endgroup enddef;
+\end{verbatim}
+$$
+%%An example of an undelimited text parameter comes from the predefined macro
+%%{\tt cutdraw}\index{cutdraw?\texttt{cutdraw}}\label{Dctdraw} whose
+%%definition is
+%%roughly\index{linecap?\texttt{linecap}}\index{butt?\texttt{butt}}\index{interim?\texttt{interim}}
+%%$$\begin{verbatim}
+%%def cutdraw text t =
+%% begingroup interim linecap:=butt; draw t; endgroup enddef;
+%%\end{verbatim}
+%%$$
+Это делает {\tt cutdraw} синонимом {\tt draw}, но с другим значением {\tt linecap}.
+%%This makes {\tt cutdraw} synonymous with {\tt draw} except for the {\tt
+%%linecap} value.
+Это макрос предоставляется в основном для совместимости с \MF\index{metafont?\MF}.
+%%(This macro is provided mainly for compatibility with
+%%\MF\index{metafont?\MF}.)
+
+\section{Циклы}
+%%\section{Loops}
+
+Многочисленные примеры в предыдущих разделах использовали простую форму цикла
+{\tt for}\index{циклы}\index{for?\texttt{for}}\index{endfor?\texttt{endfor}},
+$$ {\tt for}\, \descr{символический знак}\, \hbox{\tt =}\,
+ \descr{выражение}\, {\tt upto}\, \descr{выражение}:\
+ \descr{тело цикла}\, {\tt endfor}
+$$
+%%Numerous examples in previous sections have used simple {\tt for} loops of the
+%%form\index{loops}\index{for?\texttt{for}}\index{endfor?\texttt{endfor}}
+%%$$ {\tt for}\, \descr{symbolic token}\, \hbox{\tt =}\,
+%% \descr{expression}\, {\tt upto}\, \descr{expression}:\
+%% \descr{loop text}\, {\tt endfor}
+%%$$
+Конструировать цикл с уменьшением также просто --- нужно лишь заменить
+{\tt upto} на {\tt
+downto}\index{downto?\texttt{downto}}\label{Ddwnto} и сделать второе
+\tdescr{выражение} меньшим первого.
+%%It is equally simple to construct a loop that counts downward: just
+%%replace {\tt upto} by {\tt
+%%downto}\index{downto?\texttt{downto}}\label{Ddwnto} make the second
+%%\tdescr{expression} smaller than the first.
+Этот раздел описывает более сложные ситуации: прогрессии; циклы, где параметр
+цикла ведет себя как суффикс; способы выхода из цикла.
+%%This section covers more
+%%complicated types of progressions, loops where the loop counter behaves
+%%like a suffix parameter, and ways of exiting from a loop.
+
+Начнем с представления общего факта того, что {\tt
+upto}\index{upto?\texttt{upto}} --- это предопределенный макрос,
+равный\index{step?\texttt{step}}\index{until?\texttt{until}}
+$$ \hbox{\tt step 1 until}, $$
+и {\tt downto}\index{downto?\texttt{downto}} --- макрос, равный
+{\tt step -1 until}.
+%%The first generalization is suggested by the fact that {\tt
+%%upto}\index{upto?\texttt{upto}} is a predefined macro
+%%for\index{step?\texttt{step}}\index{until?\texttt{until}}
+%%$$ \hbox{\tt step 1 until} $$
+%%and {\tt downto}\index{downto?\texttt{downto}} is a macro for {\tt step
+%%-1 until}.
+Цикл, начинающийся с
+$$ \hbox{\tt for i=a step b until c}, $$
+перебирает последовательность {\tt i} из значений {\tt a}, ${\tt a}+{\tt b}$, ${\tt
+a}+2{\tt b}$, \ldots, останавливаясь до того как {\tt i} пройдет за {\tt c},
+т.~е. цикл перебирает значения {\tt i}, где ${\tt i}\leqslant {\tt c}$ при ${\tt b}>0$ и
+${\tt i}\geqslant {\tt c}$ при ${\tt b}<0$.
+%%A loop begining
+%%$$ \hbox{\tt for i=a step b until c} $$
+%%scans a sequence of {\tt i} values {\tt a}, ${\tt a}+{\tt b}$, ${\tt
+%%a}+2{\tt b}$, \ldots, stopping before {\tt i} passes {\tt c}; i.e., the
+%%loop scans {\tt i} values where ${\tt i}\le {\tt c}$ if ${\tt b}>0$ and
+%%${\tt i}\ge {\tt c}$ if ${\tt b}<0$.
+Для ${\tt b}=0$ цикл никогда не закончится даже при ${\tt a}={\tt c}$.
+%%For ${\tt b}=0$ the loop never
+%%terminates, even if ${\tt a}={\tt c}$.
+
+Лучше всего использовать такой цикл только тогда, когда шаг цикла ---
+это целое\index{арифметика} или число, представимое точно в виде дроби, кратной $1\over65536$.
+%%It is best to use this feature only when the step size is an integer or
+%%some number that can be represented exactly in fixed point
+%%arithmetic\index{arithmetic} as a multiple of $1\over65536$.
+В противном случае будет накапливаться ошибка и параметр цикла может не
+достичь ожидаемого конечного значения.
+%%Otherwise,
+%%error will accumulate and the loop index might not reach the expected
+%%termination value.
+Например,
+$$ \hbox{\tt for i=0 step .1 until 1: show i; endfor} $$
+покажет десять значений {\tt i}, последнее из которых будет 0.90005.
+%%For instance,
+%%$$ \hbox{\tt for i=0 step .1 until 1: show i; endfor} $$
+%%shows ten {\tt i} values the last of which is 0.90005.
+
+Стандартный способ избежать проблемы, связанной с нецелым размером шага,
+в итерации по целым значениям и умножению их при использовании на
+масштабирующий множитель, как это было сделано на рисунках \ref{fig1}
+и~\ref{fig40}.
+%%The standard way of avoid the problems associated with non-integer step
+%%sizes is to iterate over integer values and then multiply by a scale
+%%factor when using the loop index as was done in Figures \ref{fig1}
+%%and~\ref{fig40}.
+
+Есть альтернатива --- можно указывать значения для перебора явно.
+%%Alternatively, the values to iterate over can be given explicitly.
+Любая последовательность из нуля и более выражений, разделенных запятыми,
+может использоваться на месте {\tt a step b upto c}.
+%%Any
+%%sequence of zero or more expressions separated by commas can be used in
+%%place of {\tt a step b upto c}.
+Причем, все выражения не обязаны иметь одинаковый тип или известные
+значения.
+%%In fact, the expressions need not all
+%%be the same type and they need not have known values.
+Таким образом,
+$$ \hbox{\tt for t=3.14, 2.78, (a,2a), "hello": show t; endfor} $$
+покажет четыре значения из списка.
+%%Thus
+%%$$ \hbox{\tt for t=3.14, 2.78, (a,2a), "hello": show t; endfor} $$
+%%shows the four values listed.
+
+Заметьте, что тело цикла в примере выше --- это команда, за которой следует
+точка с запятой.
+%%Note that the loop body in the above example is a statement followed by a
+%%semicolon.
+Для тела цикла естественно содержать одну или более команду, хотя это и не
+обязательно.
+%%It is common for the body of a loop to be one or more statements,
+%%but this need not be the case.
+Цикл подобен определению макроса, за которым следует вызов этого макроса.
+%%A loop is like a macro definition followed by
+%%calls to the macro.
+Тело цикла может быть практически любой последовательностью знаков, имеющих
+смысл в совокупности.
+%%The loop body can be virtually any sequence of tokens as
+%%long as they make sense together.
+Поэтому (нелепая) команда
+$$ \hbox{\tt draw for p=(3,1),(6,2),(7,5),(4,6),(1,3): p-{}- endfor cycle;} $$
+эквивалента
+$$ \hbox{\tt draw (3,1)-{}-(6,2)-{}-(7,5)-{}-(4,6)-{}-(1,3)-{}-cycle;} $$
+%%Thus, the (ridiculous) statement
+%%$$ \hbox{\tt draw for p=(3,1),(6,2),(7,5),(4,6),(1,3): p-- endfor cycle;} $$
+%%is equivalent to
+%%$$ \hbox{\tt draw (3,1)--(6,2)--(7,5)--(4,6)--(1,3)--cycle;} $$
+См. рис~\ref{fig17} с более реалистическим подходящим примером.
+%%(See Figure~\ref{fig17} for a more realistic example of this.)
+
+Если цикл подобен определению макроса, то параметр цикла подобен
+{\tt expr}-параметру\index{параметр!expr}.
+%%If a loop is like a macro definition, the loop index is like an expr
+%%parameter\index{parameter!expr}.
+Он может представлять любое значение, но он не является переменной и
+его нельзя менять командой присваивания\index{присваивание}.
+%%It can represent any value, but it is
+%%not a variable and it cannot be changed by an assignment
+%%statement\index{assignment}.
+Последнее можно отменить использованием цикла {\tt
+forsuffixes}\index{forsuffixes?\texttt{forsuffixes}}.
+%%In order to do that, you need a {\tt
+%%forsuffixes}\index{forsuffixes?\texttt{forsuffixes}} loop.
+Цикл {\tt forsuffixes} во многом похож на цикл {\tt for}, но в нем
+параметр цикла ведет себя как параметр-суффикс\index{параметр!suffix}.
+%%A {\tt
+%%forsuffixes} loop is a lot like a {\tt for} loop, except the loop index
+%%behaves like a suffix parameter\index{parameter!suffix}.
+Используется синтаксис
+$$ {\tt forsuffixes}\, \descr{символический знак}\, \hbox{\tt =}\,
+ \descr{список суффиксов}:\ \descr{тело цикла}\, {\tt endfor},
+$$
+где \tdescr{список суффиксов} --- это разделенный запятыми список.
+%%The syntax is
+%%$$ {\tt forsuffixes}\, \descr{symbolic token}\, \hbox{\tt =}\,
+%% \descr{suffix list}:\ \descr{loop text}\, {\tt endfor}
+%%$$
+%%where a \tdescr{suffix list} is a comma-separated list of suffixes.
+Если некоторые суффиксы \tdescr{пусты}, то \tdescr{тело цикла} выполняется
+с параметром цикла, установленным в пустой суффикс.
+%%If some of the suffixes are \tdescr{empty}, the \tdescr{loop text} gets
+%%executed with the loop index parameter set to the empty suffix.
+
+Хороший пример для цикла {\tt forsuffixes} --- это определение макроса {\tt
+dotlabels}\index{dotlabels?\texttt{dotlabels}}\index{str?\texttt{str}}:
+$$\begin{verbatim}
+vardef dotlabels@#(text t) =
+ forsuffixes $=t: dotlabel@#(str$,z$); endfor enddef;
+\end{verbatim}
+$$
+%%A good example of a {\tt forsuffixes} loop is the definition of the {\tt
+%%dotlabels}\index{dotlabels?\texttt{dotlabels}}
+%%macro\index{str?\texttt{str}}:
+%%$$\begin{verbatim}
+%%vardef dotlabels@#(text t) =
+%% forsuffixes $=t: dotlabel@#(str$,z$); endfor enddef;
+%%\end{verbatim}
+%%$$
+Он объясняет, почему параметр {\tt dotlabels} должен быть разделенный запятыми
+список суффиксов.
+%%This should make it clear why the parameter to {\tt dotlabels} has to be a
+%%comma-separated list of suffixes.
+Большинство макросов с разделенными запятыми списками переменной длины
+используют их в циклах {\tt for} или {\tt forsuffixes} именно таким образом,
+т.~е. для перебора значений.
+%%Most macros that accept variable-length
+%%comma-separated lists
+%%use them in {\tt for} or {\tt forsuffixes} loops in this fashion as values to
+%%iterate over.
+
+Когда нет значений для перебора, вы можете использовать цикл
+{\tt forever}\index{forever?\texttt{forever}},
+$$ {\tt forever}\hbox{\tt :}\, \descr{тело цикла}\, {\tt endfor} $$
+%%When there are no values to iterate over, you can use a
+%%{\tt forever}\index{forever?\texttt{forever}} loop:
+%%$$ {\tt forever}\hbox{\tt :}\, \descr{loop text}\, {\tt endfor} $$
+Для завершения такого цикла, когда логическое условие станет истинным,
+используйте пункт выхода\index{exitif?\texttt{exitif}}:
+$$ {\tt exitif}\, \descr{логическое выражение} \hbox{\tt ;} $$
+%%To terminate such a loop when a boolean condition becomes true, use an exit
+%%clause\index{exitif?\texttt{exitif}}:
+%%$$ {\tt exitif}\, \descr{boolean expression} \hbox{\tt ;} $$
+Когда интерпретатор MetaPost встречает пункт выхода, он
+вычисляет \tdescr{логическое выражение} и выходит из текущего цикла,
+если оно истинно.
+%%When the MetaPost interpreter encounters an exit clause, it evaluates
+%%the \tdescr{boolean expression} and exits the current loop if the
+%%expression is true.
+Если более удобно выйти из цикла, когда выражение станет ложным,
+то используйте предопределенный макрос {\tt
+exitunless}\index{exitunless?\texttt{exitunless}}.
+%%If it is more convenient to exit the loop when an
+%%expression becomes false, use the predefined macro {\tt
+%%exitunless}\index{exitunless?\texttt{exitunless}}.
+
+Поэтому вариант MetaPost для цикла {\bf while} --- это
+$$ \hbox{\tt forever: exitunless}\, \descr{логическое выражение} \hbox{\tt ;}\,
+ \descr{тело цикла}\, {\tt endfor}
+$$
+%%Thus MetaPost's version of a {\bf while} loop is
+%%$$ \hbox{\tt forever: exitunless}\, \descr{boolean expression} \hbox{\tt ;}\,
+%% \descr{loop text}\, {\tt endfor}
+%%$$
+Пункт выхода может помещаться как непосредственно перед {\tt endfor}, так и
+в любом другом месте \tdescr{тела цикла}.
+%%The exit clause could equally well come just before {\tt endfor} or anywhere
+%%in the \tdescr{loop text}.
+Любой цикл {\tt for}, {\tt forever} или {\tt forsuffixes} может практически
+содержать любое количество пунктов выхода.
+%%In fact any {\tt for}, {\tt forever}, or
+%%{\tt forsuffixes} loop can contain any number of exit clauses.
+
+Сводка синтаксиса цикла, показанная на рис.~\ref{syloop}, не упоминает
+явно пункты выхода, потому что \tdescr{тело цикла} может быть в действительности
+любой последовательностью знаков.
+%%The summary of loop syntax shown in Figure~\ref{syloop} does not mention
+%%exit clauses explicitly because a \tdescr{loop text} can be virtually
+%%any sequence of tokens.
+Единственное ограничение в том, что \tdescr{тело цикла} должно быть сбалансировано
+относительно {\tt for} и {\tt endfor}.
+%%The only restriction is that a \tdescr{loop
+%%text} must be balanced with respect to {\tt for} and {\tt endfor}.
+Конечно, в этом балансе {\tt forsuffixes} и {\tt forever} рассматриваются
+как {\tt for}.
+%%Of course this balancing process treats {\tt forsuffixes} and {\tt forever}
+%%just like {\tt for}.
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{цикл} \rightarrow \descr{заголовок цикла}\hbox{\tt :}\,
+ \descr{тело цикла} endfor$\\
+%%$\tt \descr{loop} \rightarrow \descr{loop header}\hbox{\tt :}\,
+%% \descr{loop text} endfor$\\
+$\tt \descr{заголовок цикла} \rightarrow for\, \descr{символический знак}\,
+ \hbox{\tt =}\, \descr{прогрессия}$\\
+%%$\tt \descr{loop header} \rightarrow for\, \descr{symbolic token}\,
+%% \hbox{\tt =}\, \descr{progression}$\\
+$\tt \qquad \;|\; for\, \descr{символический знак}\, \hbox{\tt =}\,
+ \descr{список for}$\\
+%%$\tt \qquad \;|\; for\, \descr{symbolic token}\, \hbox{\tt =}\,
+%% \descr{for list}$\\
+$\tt \qquad \;|\; forsuffixes\, \descr{символический знак}\, \hbox{\tt =}\,
+ \descr{список суффиксов}$\\
+%%$\tt \qquad \;|\; forsuffixes\, \descr{symbolic token}\, \hbox{\tt =}\,
+%% \descr{suffix list}$\\
+$\tt \qquad \;|\; forever$\\
+%%$\tt \qquad \;|\; forever$\\
+$\tt \descr{прогрессия} \rightarrow \descr{числовое выражение}\, upto\,
+ \descr{числовое выражение}$\\
+%%$\tt \descr{progression} \rightarrow \descr{numeric expression}\, upto\,
+%% \descr{numeric expression}$\\
+$\tt \qquad \;|\; \descr{числовое выражение}\, downto\,
+ \descr{числовое выражение}$\\
+%%$\tt \qquad \;|\; \descr{numeric expression}\, downto\,
+%% \descr{numeric expression}$\\
+$\tt \qquad \;|\; \descr{числовое выражение}\, step\,
+ \descr{числовое выражение}\, until\, \descr{числовое выражение} $\\
+%%$\tt \qquad \;|\; \descr{numeric expression}\, step\,
+%% \descr{numeric expression}\, until\, \descr{numeric expression} $\\
+$\tt \descr{список for} \rightarrow \descr{выражение}
+ \;|\; \descr{список for}\hbox{\tt ,}\, \descr{выражение}$\\
+%%$\tt \descr{for list} \rightarrow \descr{expression}
+%% \;|\; \descr{for list}\hbox{\tt ,}\, \descr{expression}$\\
+$\tt \descr{список суффиксов} \rightarrow \descr{суффикс}
+ \;|\; \descr{список суффиксов}\hbox{\tt ,}\, \descr{суффикс}$
+%%$\tt \descr{suffix list} \rightarrow \descr{suffix}
+%% \;|\; \descr{suffix list}\hbox{\tt ,}\, \descr{suffix}$
+\end{ctabbing}
+\caption{Синтаксис для циклов}
+%%\caption{The syntax for loops}
+\label{syloop}
+\end{figure}
+
+
+\section{Изготовление рамок}
+%%\section{Making Boxes}
+\label{boxessec}
+
+Этот раздел описывает дополнительные макросы, не включенные в
+Plain MetaPost, что предоставляют удобства делать то, в чем хорош
+{\it pic} \cite{ke:pic}.
+%%This section describes auxiliary macros not included in Plain MetaPost
+%%that make it convenient to do things that {\it pic} is good at
+%%\cite{ke:pic}.
+А то, что следует далее --- это описание, как использовать макросы,
+содержащиеся в файле {\tt boxes.mp}\index{boxes.mp?\texttt{boxes.mp}}.
+%%What follows is a description of how to use the macros
+%%contained in the file {\tt boxes.mp}\index{boxes.mp?\texttt{boxes.mp}}.
+Этот файл размещается в специальном каталоге для макросов MetaPost
+и обеспечивающего программного обеспечения\footnote{Имя этого каталога
+подобно чему-то типа \texttt{/usr/lib/mp/lib}, но зависит от системы.}
+и должен стать доступным через команду MetaPost {\tt input boxes}
+до любых рисунков, использующих макросы для создания рамок.
+%%This file is included in a special directory reserved for MetaPost
+%%macros and support software\footnote{The name of this directory is
+%%likely to be something like \texttt{/usr/lib/mp/lib}, but this is system
+%%dependent.} and can be accessed by giving the MetaPost command {\tt
+%%input boxes} before any figures that use the box making macros.
+Синтаксис команды {\tt input}\index{input?\texttt{input}} ---
+$$ {\tt input}\, \descr{имя файла}, $$
+где окончание ``{\tt .mp}'' может опускаться в имени файла.
+%%The
+%%syntax for the {\tt input} command is \index{input?\texttt{input}}
+%$$ {\tt input}\, \descr{file name} $$
+%%where a final ``{\tt .mp}'' can be omitted from the file name.
+Команда {\tt input} смотрит сначала в текущем каталоге, а затем в специальном
+каталоге для макросов.
+%%The {\tt input}
+%%command looks first in the current directory and then in the special macro
+%%directory.
+Пользователи, заинтересовавшиеся в написании макросов, возможно захотят
+посмотреть на файл {\tt boxes.mp} в этом каталоге.
+%%Users interested in writing macros may want to look at the
+%%{\tt boxes.mp} file in this directory.
+
+С времени появления пакета \texttt{boxes} в MetaPost-сообществе были
+разработаны несколько альтернативных пакетов разных видов для рисования рамок.
+%%Since the advent of the \texttt{boxes} package several alternative
+%%packages for drawing boxes of all kinds have been developed by the
+%%MetaPost community.
+Наиболее известные из них --- это
+%%The most widely known ones are
+\texttt{MetaObj}\index{MetaObj?\texttt{MetaObj}},
+\texttt{MetaUML}\index{MetaUML?\texttt{MetaUML}},
+\texttt{expressg}\index{expressg?\texttt{expressg}} и
+%%\texttt{expressg}\index{expressg?\texttt{expressg}}, and
+\texttt{blockdraw\_mp}\index{blockdraw\_mp?\texttt{blockdraw\_mp}}.
+Если вы собираетесь создавать много структурных рисунков, диаграмм и
+т.~п., то эти пакеты тоже могут стать для вас интересным ресурсом.
+%%If you intend to create lots of structural drawings, flow charts,
+%%\emph{etc.}, those packages might be an interesting ressource, too.
+
+\subsection{Прямоугольные рамки}
+%%\subsection{Rectangular Boxes}
+
+Главная идея создающих рамки макросов в том, что можно
+сказать\index{boxit?\texttt{boxit}}\label{Dboxit}
+$$ {\tt boxit.} \descr{суффикс}
+ \hbox{\tt(} \descr{выражение-картинка} \hbox{\tt),}
+$$
+где \tdescr{суффикс} не начинается с индекса\footnote{Некоторые ранние
+версии делающих рамки макросов не позволяли никаких индексов в суффиксе
+{\tt boxit}.}.
+%%The main idea of the box-making macros is that one should
+%%say\index{boxit?\texttt{boxit}}\label{Dboxit}
+%%$$ {\tt boxit.} \descr{suffix}
+%% \hbox{\tt(} \descr{picture expression} \hbox{\tt)}
+%%$$
+%%where the \tdescr{suffix} does not start with a subscript.\footnote{Some early
+%%versions of the box making macros did not allow any subscripts in the
+%%{\tt boxit} suffix.}
+Эта конструкция создает переменные-пары \tdescr{суффикс}{\tt.c},
+\tdescr{суффикс}{\tt.n}, \tdescr{суффикс}{\tt.e}, \ldots, что могут затем
+использоваться при размещении рисунка перед его рисованием отдельной
+командой\index{drawboxed?\texttt{drawboxed}}\label{Ddrbxed}, например,
+$$ \hbox{\tt drawboxed(} \descr{список суффиксов} \hbox{\tt )} $$
+%%This creates pair variables \tdescr{suffix}{\tt.c},
+%%\tdescr{suffix}{\tt.n}, \tdescr{suffix}{\tt.e}, \ldots\ that can then be
+%%used for positioning the picture before drawing it with a separate command such
+%%as\index{drawboxed?\texttt{drawboxed}}\label{Ddrbxed}
+%%$$ \hbox{\tt drawboxed(} \descr{suffix list} \hbox{\tt )} $$
+Аргумент {\tt drawboxed} должен быть разделенным запятыми списком имен рамок,
+где имя рамки\index{имя рамки} --- это \tdescr{суффикс}, с которым
+вызывается {\tt boxit}.
+%%The argument to {\tt drawboxed} should be a comma-separated list of box names,
+%%where a box name\index{box name} is a \tdescr{suffix} with which {\tt boxit}
+%%has been called.
+
+Для команды {\tt boxit.bb(pic)} имя рамки --- это {\tt bb}, а
+содержимое рамки --- это рисунок {\tt pic}.
+%%For the command {\tt boxit.bb(pic)}, the box name is {\tt bb} and the
+%%contents of the box is the picture {\tt pic}.
+В этом случае, {\tt bb.c} --- это позиция помещения центра картинки {\tt pic},
+а {\tt bb.sw}, {\tt bb.se}, {\tt bb.ne} и {\tt bb.nw} --- это углы
+прямоугольного пути, что будет окружать картинку-результат.
+%%In this case, {\tt bb.c}
+%%the position where the center of picture {\tt pic} is to be placed, and
+%%{\tt bb.sw}, {\tt bb.se}, {\tt bb.ne}, and {\tt bb.nw} are the corners
+%%of a rectangular path that will surround the resulting picture.
+Переменные {\tt bb.dx} и {\tt bb.dy} дают промежутки между сдвинутой
+версией {\tt pic} и окружающим прямоугольником, а {\tt bb.off} ---
+это расстояние, на которое {\tt pic} сдвигается для достижения всего
+этого.
+%%Variables {\tt bb.dx} and {\tt bb.dy} give the spacing between the
+%%shifted version of {\tt pic} and the surrounding rectangle, and {\tt
+%%bb.off} is the amount by which {\tt pic} has to be shifted to achieve
+%%all this.
+
+Когда макрос {\tt boxit} вызывается с именем рамки~$b$, то это дает
+линейные уравнения, что заставляют $b${\tt.sw}, $b${\tt.se}, $b${\tt.ne}
+и $b${\tt.nw} быть углами прямоугольника вдоль осей $x$ и $y$,
+содержащим внутри картинку, показанную серым прямоугольником на
+рис.~\ref{fig48}.
+%%When the {\tt boxit} macro is called with box name~$b$, it gives linear
+%%equations that force $b${\tt.sw}, $b${\tt.se}, $b${\tt.ne}, and
+%%$b${\tt.nw} to be the corners of a rectangle aligned on the $x$ and $y$
+%%axes with the box contents centered inside as indicated by the gray
+%%rectangle in Figure~\ref{fig48}.
+Значения $b${\tt.dx}, $b${\tt.dy} и $b${\tt.c} остаются неуказанными, так что
+пользователь может задать уравнения для размещения рамок.
+%%The values of $b${\tt.dx},
+%%$b${\tt.dy}, and $b${\tt.c} are left unspecified so that the user can
+%%give equations for positioning the boxes.
+Если такие уравнения не задаются, то макросы типа {\tt drawboxed} могут
+это обнаруживать и задавать стандартные значения.
+%%If no such equations are
+%%given, macros such as {\tt drawboxed} can detect this and give default
+%%values.
+Стандартные значения для переменных {\tt dx} и {\tt dy} управляются
+внутренними переменными\index{внутренние
+переменные}\index{переменные!внутренние} {\tt
+defaultdx}\index{defaultdx?\texttt{defaultdx}}\label{Ddefaultdx} и
+{\tt defaultdy}\index{defaultdy?\texttt{defaultdy}}\label{Ddefaultdy}.
+%%The default values for {\tt dx} and {\tt dy} variables are
+%%controlled by the internal variables\index{internal
+%%variables}\index{variables!internal} {\tt
+%%defaultdx}\index{defaultdx?\texttt{defaultdx}}\label{Ddefaultdx} and
+%%{\tt defaultdy}\index{defaultdy?\texttt{defaultdy}}\label{Ddefaultdy}.
+
+\begin{figure}[htp]
+$$ \includegraphics{manfig-ru-48} $$
+\caption[Как {\tt boxit}-рисунок соотносится с ассоциированным переменными]
+ {Отношения между рисунком, заданным для {\tt boxit}, и
+ связанными с этим переменными. Рисунок изображен серым прямоугольником.}
+%%\caption[How a {\tt boxit} picture relates to the associated variables]
+%% {The relationship between the picture given to {\tt boxit} and the
+%% associated variables. The picture is indicated by a gray rectangle.}
+\label{fig48}
+\end{figure}
+
+Если $b$ представляет имя рамки, то {\tt drawboxed($b$)} рисует
+прямоугольную границу содержимого~$b$, а затем и само содержимое.
+%%If $b$ represents a box name, {\tt drawboxed($b$)} draws the rectangular
+%%boundary of box~$b$ and then the contents of the box.
+Этот охватывающий прямоугольник может быть использован отдельно как
+{\tt bpath~$b$} или, в общем случае,\index{bpath?\texttt{bpath}}\label{Dbpath}
+$$ {\tt bpath}\, \descr{имя рамки} $$
+%%This bounding
+%%rectangle can be accessed separately as {\tt bpath~$b$}, or in
+%%general\index{bpath?\texttt{bpath}}\label{Dbpath}
+%%$$ {\tt bpath}\, \descr{box name} $$
+Это полезно в комбинации с операторами типа {\tt
+cutbefore}\index{cutbefore?\texttt{cutbefore}} и {\tt
+cutafter}\index{cutafter?\texttt{cutafter}} для контроля
+за путями, входящими в рамку.
+%%It is useful in combination with operators like
+%%{\tt cutbefore}\index{cutbefore?\texttt{cutbefore}} and {\tt %%cutafter}\index{cutafter?\texttt{cutafter}}
+%%in order to control paths that enter the box.
+Например, если $a$ и $b$ --- это имена рамок и $p$ --- это путь из $a${\tt.c}
+в $b${\tt.c},\index{drawarrow?\texttt{drawarrow}} то
+$$ \hbox{\tt drawarrow $p$ cutbefore bpath $a$ cutafter bpath $b$} $$
+рисует стрелку от края рамки $a$ до края рамки $b$.
+%%For example, if $a$ and $b$ are box names and $p$ is a path from $a${\tt.c}
+%%to $b${\tt.c},\index{drawarrow?\texttt{drawarrow}}
+%%$$ \hbox{\tt drawarrow $p$ cutbefore bpath $a$ cutafter bpath $b$} $$
+%%draws an arrow from the edge of box $a$ to the edge of box $b$.
+
+Рис.~\ref{fig49} показывает практический пример включения нескольких
+стрелок, нарисованных с {\tt cutafter bpath} \tdescr{имя рамки}.
+%%Figure~\ref{fig49} shows a practical example including some arrows drawn
+%%with {\tt cutafter bpath} \tdescr{box name}.
+Поучительно сравнить рис.~\ref{fig49} с похожей картинкой в руководстве по
+{\it pic} \cite{ke:pic}.
+%%It is instructive to
+%%compare Figure~\ref{fig49} to the similar figure in the pic manual
+%%\cite{ke:pic}.
+Рисунок использует макрос\index{boxjoin?\texttt{boxjoin}}\label{Dbxjoin}
+$$ \hbox{\tt boxjoin(} \descr{текст уравнений} \hbox{\tt )} $$
+для управления отношениями между последовательными рамками.
+%%The figure uses a
+%%macro\index{boxjoin?\texttt{boxjoin}}\label{Dbxjoin}
+%%$$ \hbox{\tt boxjoin(} \descr{equation text} \hbox{\tt )} $$
+%%to control the relationship between consecutive boxes.
+В \tdescr{тексте уравнений} {\tt a} и {\tt b} представляют имена рамок,
+заданные в последовательных вызовах {\tt boxit}, а \tdescr{текст уравнений}
+дает уравнения для контроля за относительными размерами и позициями рамок.
+%%Within the
+%%\tdescr{equation text}, {\tt a} and {\tt b} represent the box names given in
+%%consecutive calls to {\tt boxit} and the \tdescr{equation text} gives equations
+%%to control the relative sizes and positions of the boxes.
+
+\begin{figure}[htp]
+$$\hbox{$\begin{verbatim}
+input boxes
+beginfig(49);
+boxjoin(a.se=b.sw; a.ne=b.nw);
+boxit.a(btex\strut$\cdots$ etex); boxit.ni(btex\strut$n_i$ etex);
+boxit.di(btex\strut$d_i$ etex); boxit.ni1(btex\strut$n_{i+1}$ etex);
+boxit.di1(btex\strut$d_{i+1}$ etex); boxit.aa(btex\strut$\cdots$ etex);
+boxit.nk(btex\strut$n_k$ etex); boxit.dk(btex\strut$d_k$ etex);
+drawboxed(di,a,ni,ni1,di1,aa,nk,dk); label.lft("ndtable:", a.w);
+interim defaultdy:=7bp;
+boxjoin(a.sw=b.nw; a.se=b.ne);
+boxit.ba(); boxit.bb(); boxit.bc();
+boxit.bd(btex $\vdots$ etex); boxit.be(); boxit.bf();
+bd.dx=8bp; ba.ne=a.sw-(15bp,10bp);
+drawboxed(ba,bb,bc,bd,be,bf); label.lft("hashtab:",ba.w);
+vardef ndblock suffix $ =
+ boxjoin(a.sw=b.nw; a.se=b.ne);
+ forsuffixes $$=$1,$2,$3: boxit$$(); ($$dx,$$dy)=(5.5bp,4bp);
+ endfor; enddef;
+ndblock nda; ndblock ndb; ndblock ndc;
+nda1.c-bb.c = ndb1.c-nda3.c = (whatever,0);
+xpart ndb3.se = xpart ndc1.ne = xpart di.c;
+ndc1.c - be.c = (whatever,0);
+drawboxed(nda1,nda2,nda3, ndb1,ndb2,ndb3, ndc1,ndc2,ndc3);
+drawarrow bb.c -- nda1.w;
+drawarrow be.c -- ndc1.w;
+drawarrow nda3.c -- ndb1.w;
+drawarrow nda1.c{right}..{curl0}ni.c cutafter bpath ni;
+drawarrow nda2.c{right}..{curl0}di.c cutafter bpath di;
+drawarrow ndc1.c{right}..{curl0}ni1.c cutafter bpath ni1;
+drawarrow ndc2.c{right}..{curl0}di1.c cutafter bpath di1;
+drawarrow ndb1.c{right}..nk.c cutafter bpath nk;
+drawarrow ndb2.c{right}..dk.c cutafter bpath dk;
+x.ptr=xpart aa.c; y.ptr=ypart ndc1.ne;
+drawarrow subpath (0,.7) of (z.ptr..{left}ndc3.c) dashed evenly;
+label.rt(btex \strut ndblock etex, z.ptr); endfig;
+\end{verbatim}
+$}
+\atop \vcenter{\vskip8pt\hbox{\includegraphics{manfig-ru-49}}}
+$$
+\caption{Код MetaPost и соответствующий рисунок}
+%%\caption{MetaPost code and the corresponding figure}
+\label{fig49}
+\end{figure}
+
+Например, вторая строка ввода для приведенного рисунка содержит
+$$ \hbox{\tt boxjoin(a.se=b.sw; a.ne=b.nw)} $$
+%%For example, the second line of input for the above figure contains
+%%$$ \hbox{\tt boxjoin(a.se=b.sw; a.ne=b.nw)} $$
+Это размещает рамки горизонтально в ряд, благодаря заданию дополнительных
+уравнений, вызываемых всякий раз, когда некоторая рамка {\tt b} следует за
+некоторой рамкой {\tt a}.
+%%This causes boxes to line up horizontally by giving additional equations that
+%%are invoked each time some box {\tt a} is followed by some other box~{\tt b}.
+%%These equations are first invoked on the next line when box~{\tt a} is followed
+%%by box~{\tt ni}.
+Этим достигается
+$$ \hbox{\tt a.se=ni.sw; a.ne=ni.nw} $$
+%%This yields
+%%$$ \hbox{\tt a.se=ni.sw; a.ne=ni.nw} $$
+Следующая пара рамок --- это ~{\tt ni} и~{\tt di}.
+%%The next pair of boxes is box~{\tt ni} and box~{\tt di}.
+На этот раз неявно генерируемые уравнения ---
+$$ \hbox{\tt ni.se=di.sw; ni.ne=di.nw} $$
+%%This time the implicitly generated equations are
+%%$$ \hbox{\tt ni.se=di.sw; ni.ne=di.nw} $$
+Этот процесс продолжается до тех пор, пока новый {\tt
+boxjoin}\index{boxjoin?\texttt{boxjoin}} не будет задан.
+%%This process continues until a new {\tt
+%%boxjoin}\index{boxjoin?\texttt{boxjoin}} is given.
+В нашем случае новой декларацией будет
+$$ \hbox{\tt boxjoin(a.sw=b.nw; a.se=b.ne)} $$
+--- она соединяет рамки друг под другом.
+%%In this case the new declaration is
+%%$$ \hbox{\tt boxjoin(a.sw=b.nw; a.se=b.ne)} $$
+%%which causes boxes to be stacked below each other.
+
+После вызова {\tt boxit} для первых восьми рамок от {\tt a} до {\tt
+dk}, высоты рамок принуждаются к взаимному соответствию, но широты
+остаются неизвестными.
+%%After calling {\tt boxit} for the first eight boxes {\tt a} through {\tt
+%%dk}, the box heights are constrained to match but the widths are still
+%%unknown.
+Таким образом, макрос {\tt drawboxed}\index{drawboxed?\texttt{drawboxed}}
+нуждается в присваивании типовых значений переменным \tdescr{имя рамки}{\tt.dx}
+и \tdescr{имя рамки}{\tt.dy}.
+%%Thus the {\tt drawboxed}\index{drawboxed?\texttt{drawboxed}}
+%%macro needs to assign default values to the \tdescr{box name}{\tt.dx}
+%%and \tdescr{box name}{\tt.dy} variables.
+Первым делом {\tt di.dx} и {\tt di.dy} получают значения по-умолчанию, так
+что все рамки принуждаются быть достаточно большими для вмещения
+содержимого~{\tt di}.
+%%First, {\tt di.dx} and {\tt
+%%di.dy} get default values so that all the boxes are forced to be large
+%%enough to contain the contents of box~{\tt di}.
+
+Макрос, который в действительности присваивает типовые значения
+переменным {\tt dx} и {\tt dy}, зовется {\tt
+fixsize}\index{fixsize?\texttt{fixsize}}\label{Dfixsiz}.
+%%The macro that actually assigns default values to {\tt dx} and {\tt dy}
+%%variables is called {\tt
+%%fixsize}\index{fixsize?\texttt{fixsize}}\label{Dfixsiz}.
+Он берет список имен рамок и рассматривает их по-одному за раз,
+гарантируя, что каждая рамка будет иметь заданные размер и форму.
+%%It takes a
+%%list of box names and considers them one at a time, making sure that
+%%each box has a fixed size and shape.
+Затем макрос с именем {\tt
+fixpos}\index{fixpos?\texttt{fixpos}}\label{Dfixpos} берет этот же
+самый список имен рамок и присваивает типовые значения переменным \tdescr{имя
+рамки}{\tt.off}, как необходимо для фиксации позиции каждой рамки.
+%%A macro called {\tt
+%%fixpos}\index{fixpos?\texttt{fixpos}}\label{Dfixpos} then takes this
+%%same list of box names and assigns default values to the \tdescr{box
+%%name}{\tt.off} variables as needed to fix the position of each box.
+Использование {\tt fixsize} для фиксации размеров каждой рамки до
+присваивания позиции любой из них может обычно сократить число
+требуемых позиций по-умолчанию до одной.
+%%By using {\tt fixsize} to fix the dimensions of each box before assigning
+%%default positions to any of them, the number of needing default
+%%positions can usually be cut to at most one.
+
+Из-за того, что охватывающий путь для рамки не может быть вычислен
+до тех пор, пока размер, форма и позиция рамки неопределены, макрос
+{\tt bpath}\index{bpath?\texttt{bpath}} применяет {\tt fixsize} и {\tt
+fixpos} к своим аргументам.
+%%Since the bounding path for a box cannot be computed until the size,
+%%shape, and position of the box is determined, the {\tt
+%%bpath}\index{bpath?\texttt{bpath}} macro applies {\tt fixsize} and {\tt
+%%fixpos} to its argument.
+Другие макросы, что делают также, включают\index{pic?\texttt{pic}}\label{Dpic}
+$$ {\tt pic}\, \descr{имя рамки}, $$
+где \tdescr{имя рамки} --- это суффикс, возможно, в скобках.
+%%Other macros that do this
+%%include\index{pic?\texttt{pic}}\label{Dpic}
+%%$$ {\tt pic}\, \descr{box name} $$
+%%where the \tdescr{box name} is a suffix, possibly in parentheses.
+Он возвращает содержание именованной рамки как картинки, позиционированной
+так, что
+$$ {\tt draw\ pic} \descr{имя рамки} $$
+изображает содержимое рамки без охватывающего прямоугольника.
+%%This returns
+%%the contents of the named box as a picture positioned so that
+%%$$ {\tt draw\ pic} \descr{box name} $$
+%%draws the box contents without the bounding rectangle.
+Эта операция может также быть усовершенствована макросом {\tt
+drawunboxed}\index{drawunboxed?\texttt{drawunboxed}}\label{Ddrunbx},
+берущим разделенный запятыми список имен рамок.
+%%This operation can also be accomplished by the {\tt
+%%drawunboxed}\index{drawunboxed?\texttt{drawunboxed}}\label{Ddrunbx}
+%%macro that takes a comma-separated list of box names.
+Есть еще макрос {\tt drawboxes}\index{drawboxes?\texttt{drawboxes}}\label{Ddrbxes},
+рисующий только охватывающие прямоугольники.
+%%There is also a
+%%{\tt drawboxes}\index{drawboxes?\texttt{drawboxes}}\label{Ddrbxes} macro
+%%that draws just the bounding rectangles.
+
+Другой способ нарисовать пустые прямоугольники --- это просто\label{Deboxit}
+$$ {\tt boxit} \descr{имя рамки} \hbox{\tt ()} $$
+без рисунка-аргумента, как это делалось несколько раз на рис.~\ref{fig49}.
+%%Another way to draw empty rectangles is by just saying\label{Deboxit}
+%%$$ {\tt boxit} \descr{box name} \hbox{\tt ()} $$
+%%with no picture argument as is done several times in Figure~\ref{fig49}.
+Это похоже на вызов {\tt boxit} с пустым аргументом.
+%%This is like calling {\tt boxit} with an empty picture.
+Кроме того, аргумент может быть строковым\label{Dsboxit} выражением
+вместо выражения-рисунка и в этом случае строка изображается
+шрифтом по-умолчанию.
+%%Alternatively the argument can be a string\label{Dsboxit} expression
+%%instead of a picture
+%%expression in which case the string is typeset in the default font.
+
+\subsection{Круглые и овальные рамки}
+%%\subsection{Circular and Oval Boxes}
+
+Круговые и овальные рамки во многом похожи на прямоугольные, отличаясь
+только формой охватывающего пути.
+%%Circular and oval boxes are a lot like rectangular boxes except for the shape
+%%of the bounding path.
+Такие рамки устанавливаются макросом
+{\tt circleit}\index{circleit?\texttt{circleit}}\label{Dcircit}:
+$$ {\tt circleit} \descr{имя рамки}
+ \hbox{\tt(} \descr{содержание рамки} \hbox{\tt)},
+$$
+где \tdescr{имя рамки} --- это суффикс, а \tdescr{содержание рамки} --- это либо
+выражение-картинка, либо строковое выражение, либо \tdescr{пусто}.
+%%Such boxes are set up by the
+%%{\tt circleit}\index{circleit?\texttt{circleit}}\label{Dcircit} macro:
+%%$$ {\tt circleit} \descr{box name}
+%% \hbox{\tt(} \descr{box contents} \hbox{\tt)}
+%%$$
+%%where \tdescr{box name} is a suffix and \tdescr{box contents} is either a
+%%picture expression, a string expression, or \tdescr{empty}.
+
+Макрос {\tt circleit} определяет переменные-пары также, как {\tt boxit}, но без
+угловых точек \tdescr{имя рамки}{\tt.ne}, \tdescr{имя рамки}{\tt.sw} и т.~д.
+%%The {\tt circleit} macro defines pair variables just as {\tt boxit} does, except
+%%that there are no corner points \tdescr{box name}{\tt.ne},
+%%\tdescr{box name}{\tt.sw}, etc.
+Вызов
+$$ \hbox{\tt circleit.a(}\ldots \hbox{\tt )} $$
+задает отношения между точками {\tt a.c}, {\tt a.s}, {\tt a.e}, {\tt
+a.n}, {\tt a.w} и расстояния {\tt a.dx} и {\tt a.dy}.
+%%A call to
+%%$$ \hbox{\tt circleit.a(}\ldots \hbox{\tt )} $$
+%%gives relationships among points {\tt a.c}, {\tt a.s}, {\tt a.e}, {\tt
+%%a.n}, {\tt a.w} and distances {\tt a.dx} and {\tt a.dy}.
+Вместе с {\tt a.c} и {\tt a.off} эти переменные определяют, как картинка
+центрируется в овале, что можно увидеть на рис.~\ref{fig50}.
+%%Together with
+%%{\tt a.c} and {\tt a.off}, these variables describe how the picture is
+%%centered in an oval as can be seen from the Figure~\ref{fig50}.
+
+\begin{figure}[htp]
+$$ \includegraphics{manfig-ru-50} $$
+\caption[Как {\tt circleit}-рисунок соотносится с ассоциированными переменными]
+ {Отношения между заданным {\tt circleit} рисунком и связанными
+ с этим переменными. Рисунок изображен серым прямоугольником.}
+%%\caption[How a {\tt circleit} picture relates to the associated variables]
+%% {The relationship between the picture given to {\tt circleit} and the
+%% associated variables. The picture is indicated by a gray rectangle.}
+\label{fig50}
+\end{figure}
+
+Макросы {\tt drawboxed}\index{drawboxed?\texttt{drawboxed}}, {\tt
+drawunboxed}\index{drawunboxed?\texttt{drawunboxed}}, {\tt
+drawboxes}\index{drawboxes?\texttt{drawboxes}}, {\tt
+pic}\index{pic?\texttt{pic}} и {\tt
+bpath}\index{bpath?\texttt{bpath}} работают для рамок {\tt circleit}
+также как и для рамок {\tt boxit}.
+%%The {\tt drawboxed}\index{drawboxed?\texttt{drawboxed}}, {\tt
+%%drawunboxed}\index{drawunboxed?\texttt{drawunboxed}}, {\tt
+%%drawboxes}\index{drawboxes?\texttt{drawboxes}}, {\tt
+%%pic}\index{pic?\texttt{pic}}, and {\tt
+%%bpath}\index{bpath?\texttt{bpath}} macros work for {\tt circleit} boxes
+%%just as they do for {\tt boxit} boxes.
+
+Типовой охватывающий путь для рамки {\tt circleit} достаточно велик для
+окружения содержимого рамки с маленькими предохраняющими отступами,
+управляемыми внутренней переменной\index{внутренние переменные}\index{переменные!внутренние}
+{\tt circmargin}\label{Dcmargin}.
+%%By default, the boundary path
+%%for a {\tt circleit} box is a circle large enough to surround the box
+%%contents with a small safety margin controlled by the internal
+%%variable\index{internal variables}\index{variables!internal} {\tt
+%%circmargin}\label{Dcmargin}.
+Рис.~\ref{fig51} предоставляет базовый пример использования
+{\tt bpath} с рамками {\tt circleit}.
+%%Figure~\ref{fig51} gives a basic example
+%%of the use of {\tt bpath} with {\tt circleit} boxes.
+
+\begin{figure}[htbp]
+$$\begin{verbatim}
+vardef drawshadowed(text t) =
+ fixsize(t);
+ forsuffixes s=t:
+ fill bpath.s shifted (1pt,-1pt);
+ unfill bpath.s;
+ drawboxed(s);
+ endfor
+enddef;
+
+beginfig(51)
+circleit.a(btex Box 1 etex);
+circleit.b(btex Box 2 etex);
+b.n = a.s - (0,20pt);
+drawshadowed(a,b);
+drawarrow a.s -- b.n;
+endfig;
+\end{verbatim}
+\qquad \mathcenter{\includegraphics{manfig-ru-51}} $$
+\caption[Код MetaPost и рисунок-результат.] {Код MetaPost и
+ рисунок-результат. Заметьте, что макрос {\tt drawshadowed},
+ используемый здесь, не входит в макропакет {\tt boxes.mp}.}
+%%\caption[MetaPost code and the resulting figure.] {MetaPost code and
+%% the resulting figure. Note that the {\tt drawshadowed} macro
+%% used here is not part of the {\tt boxes.mp} macro package.}
+\label{fig51}
+\index{drawshadowed?\texttt{drawshadowed}}
+\end{figure}
+
+Полный пример рамок {\tt circleit} приводится на рис.~\ref{fig52}.
+%%A full example of {\tt circleit} boxes appears in Figure~\ref{fig52}.
+Пути овальной границы вокруг ``Start'' и ``Stop'' соответствуют уравнениям
+$$ \hbox{\tt aa.dx=aa.dy;} \quad \hbox{\rm и}\quad \hbox{\tt ee.dx=ee.dy} $$
+после
+$$ \hbox{\verb|circleit.ee(btex\strut Stop etex)|}
+ \quad\hbox{\rm и}\quad
+ \hbox{\verb|circleit.ee(btex\strut Stop etex)|}.
+$$
+%%The oval boundary paths around ``Start'' and ``Stop'' are due to the equations
+%%$$ \hbox{\tt aa.dx=aa.dy;} \quad {\rm and}\quad \hbox{\tt ee.dx=ee.dy} $$
+%%after
+%%$$ \hbox{\verb|circleit.ee(btex\strut Stop etex)|}
+%% \quad{\rm and}\quad
+%% \hbox{\verb|circleit.ee(btex\strut Stop etex)|}.
+%%$$
+Общее правило в том, что {\tt bpath.}$c$ выходит круглым, если все
+$c${\tt.dx}, $c${\tt.dy} и $c\hbox{\tt.dx}-c\hbox{\tt.dy}$ неизвестны.
+%%The general rule is that {\tt bpath.}$c$ comes out circular if
+%%$c${\tt.dx}, $c${\tt.dy}, and $c\hbox{\tt.dx}-c\hbox{\tt.dy}$ are all
+%%unknown.
+Иначе макросы выбирают достаточно большой овал для вмещения данной
+картинки с предохраняющими отступами {\tt
+circmargin}\index{circmargin?\texttt{circmargin}}.
+%%Otherwise, the macros select an oval big enough to contain the
+%%given picture with the safety margin {\tt
+%%circmargin}\index{circmargin?\texttt{circmargin}}.
+
+
+\begin{figure}[htp]
+$$\hbox{$\begin{verbatim}
+vardef cuta(suffix a,b) expr p =
+ drawarrow p cutbefore bpath.a cutafter bpath.b;
+ point .5*length p of p
+enddef;
+
+vardef self@# expr p =
+ cuta(@#,@#) @#.c{curl0}..@#.c+p..{curl0}@#.c enddef;
+
+beginfig(52);
+verbatimtex \def\stk#1#2{$\displaystyle{\matrix{#1\cr#2\cr}}$} etex
+circleit.aa(btex\strut Start etex); aa.dx=aa.dy;
+circleit.bb(btex \stk B{(a|b)^*a} etex);
+circleit.cc(btex \stk C{b^*} etex);
+circleit.dd(btex \stk D{(a|b)^*ab} etex);
+circleit.ee(btex\strut Stop etex); ee.dx=ee.dy;
+numeric hsep;
+bb.c-aa.c = dd.c-bb.c = ee.c-dd.c = (hsep,0);
+cc.c-bb.c = (0,.8hsep);
+xpart(ee.e - aa.w) = 3.8in;
+drawboxed(aa,bb,cc,dd,ee);
+label.ulft(btex$b$etex, cuta(aa,cc) aa.c{dir50}..cc.c);
+label.top(btex$b$etex, self.cc(0,30pt));
+label.rt(btex$a$etex, cuta(cc,bb) cc.c..bb.c);
+label.top(btex$a$etex, cuta(aa,bb) aa.c..bb.c);
+label.llft(btex$a$etex, self.bb(-20pt,-35pt));
+label.top(btex$b$etex, cuta(bb,dd) bb.c..dd.c);
+label.top(btex$b$etex, cuta(dd,ee) dd.c..ee.c);
+label.lrt(btex$a$etex, cuta(dd,bb) dd.c..{dir140}bb.c);
+label.bot(btex$a$etex, cuta(ee,bb) ee.c..tension1.3 ..{dir115}bb.c);
+label.urt(btex$b$etex, cuta(ee,cc) ee.c{(cc.c-ee.c)rotated-15}..cc.c);
+endfig;
+\end{verbatim}
+$}
+\atop \vcenter{\vskip8pt\hbox{\includegraphics{manfig-ru-52}}}
+$$
+\caption{Код MetaPost и соответствующий рисунок}
+%%\caption{MetaPost code and the corresponding figure}
+\label{fig52}
+\end{figure}
+
+
+\section{Файловые чтение и запись}
+%%\section{Reading and Writing Files}
+
+Доступ к файлам --- это одно из новых свойств, введенное в версию~0.60
+языка MetaPost.
+%%File access was one of the new language features introduced in version~0.60
+%%of the MetaPost language.
+Новый оператор
+$$ {\tt readfrom}\ \descr{имя файла} $$\index{readfrom?\texttt{readfrom}}\label{Dreadfrom}%
+возвращает очередную строку из именованного входного файла\index{файлы!чтение}.
+%%A new operator
+%%$$ {\tt readfrom}\ \descr{file name} $$\index{readfrom?\texttt{readfrom}}\label{Dreadfrom}%
+%%returns a string giving the next line of input from the named
+%%file\index{files!reading}.
+\tdescr{Имя файла} может быть любым первичным выражением типа строка.
+%%The \tdescr{file name} can be any primary expression of type string.
+Если файл закончился или не может читаться, то результат чтения --- это строка
+из одного нулевого символа.
+%%If the file has ended or cannot be read, the
+%%result is a string consisting of a single null character.
+Макропакет {\tt plain} вводит имя {\tt EOF}\index{EOF?\texttt{EOF}}\label{Deof}
+для такой строки.
+%%The preloaded {\tt plain} macro package introduces the name
+%%{\tt EOF}\index{EOF?\texttt{EOF}}\label{Deof} for this string.
+После возвращения {\tt EOF} от {\tt readfrom}, следующие чтения этого же
+файла приведут к его повторному чтению сначала.
+%%After
+%%{\tt readfrom} has returned {\tt EOF}, additional reads from the same file
+%%cause the file to be reread from the start.
+
+Все файлы, открытые \ttt{readfrom}, что еще не считаны полностью,
+закрываются\index{файлы!закрытие} автоматически, когда программа заканчивает
+выполнение, хотя существует команда
+$${\tt closefrom}\ \descr{имя файла}$$%
+\index{closefrom?\texttt{closefrom}}\label{Dclosefrom}%
+для явного закрытия файлов, открытых {\tt readfrom}.
+%%All files opened by \ttt{readfrom} that have not completely been read
+%%yet are closed\index{files!closing} automatically when the program
+%%terminates, but there exists a command
+%%$${\tt closefrom}\ \descr{file name}$$%
+%%\index{closefrom?\texttt{closefrom}}\label{Dclosefrom}%
+%%to close files opened by {\tt readfrom} explicitly.
+Разумно явно закрывать файлы, которые не нужно считывать полностью, т.~е. до
+получения {\tt EOF}, потому что в противном случае такие файлы продолжат
+использовать внутренние ресурсы и возможно обусловят ошибку
+\ttt{capacity exceeded!}\footnote{емкость превышена!}
+%%It is wise to
+%%manually close files you do not need to read completely (i.e. until {\tt
+%% EOF} is returned) because otherwise such files will continue to use
+%%internal resources and perhaps cause a \ttt{capacity exceeded!} error.
+
+Противоположностью {\tt readfrom} является команда
+$$ {\tt write}\ \descr{строковое выражение}\ {\tt to}\ \descr{имя файла} $$%
+\index{write to?\texttt{write to}}\label{Dwrite}%
+%%The opposite of {\tt readfrom} is the command
+%%$$ {\tt write}\ \descr{string expression}\ {\tt to}\ \descr{file name} $$%
+%%\index{write to?\texttt{write to}}\label{Dwrite}%
+Она пишет\index{файлы!запись} строку текста в указанный файл вывода,
+открывая сначала файл, если это нужно.
+%%This writes\index{files!writing} a line of text to the specified output file,
+%%opening the file first if necessary.
+Все такие файлы закрываются\index{файлы!закрытие} автоматически, когда программа
+завершается.
+%%All such files are
+%%closed\index{files!closing} automatically when the program terminates.
+Они могут быть также закрыты явно использованием {\tt EOF}\index{EOF?\texttt{EOF}}
+как \tdescr{строкового выражения}.
+%%They
+%%can also be closed explicitly by using {\tt EOF}\index{EOF?\texttt{EOF}}
+%%as the \tdescr{string expression}.
+Единственный способ узнать была ли команда {\tt write} успешной в закрытии
+файла и использовании {\tt readfrom} для его просмотра.
+%%The only way to tell if a {\tt write}
+%%command has succeeded is to close the file and use {\tt readfrom} to look
+%%at it.
+
+\section{Полезные средства}
+%%\section{Utility Routines}
+
+\index{полезные средства}
+%%\index{utility routines}
+\index{mplib?\texttt{mplib}}
+\index{metapost/base?\texttt{metapost/base}}
+
+Этот раздел описывает некоторые полезные средства, включенные в каталог
+\texttt{mplib} иерархии разработки исходников.
+%%This section describes some of the utility routines included in the
+%%\texttt{mplib} directory of the development source hierarchy.
+Будущие версии этой документации должны содержать больше информации, пока же,
+пожалуйста, читайте файлы исходников --- большинство из них имеют
+объяснительные комментарии в начале.
+%%Future
+%%versions of this documentation may include more; meanwhile, please read
+%%the source files, most have explanatory comments at the top.
+Исходники также включают в дистрибутивы как MetaPost, так и в б\'ольшие \TeX, как
+правило, в каталог \texttt{texmf/metapost/base}.
+%%They are
+%%also included in the MetaPost and larger \TeX\ distributions, typically
+%%in a \texttt{texmf/metapost/base} directory.
+
+
+\subsection{\texttt{TEX.mp}}
+
+\label{dTEX}
+\index{TEX.mp?\texttt{TEX.mp}}
+\index{метки с переменным текстом}
+%%\index{labels, with variable text}
+\index{строковые выражения, как метки}
+%%\index{string expressions, as labels}
+
+\texttt{TEX.mp} предоставляет способ печатать текст строковых выражений
+MetaPost.
+%%\texttt{TEX.mp} provides a way to typeset the text of a MetaPost string
+%%expression.
+Предположим, например, что вам нужны метки в форме $n_0$,
+$n_1$, \ldots, $n_{10}$ по оси $x$.
+%%Suppose, for example, you need labels of the form $n_0$,
+%%$n_1$, \ldots, $n_{10}$ across the $x$ axis.
+Вы можете сделать их с (относительным) удобством с \texttt{TEX.mp}:
+%%You can do this (relatively) conveniently with \texttt{TEX.mp}, as follows:
+$$\begin{verbatim}
+input TEX;
+beginfig(100)
+ last := 10;
+ for i := 0 upto last:
+ label(TEX("$n_{" & decimal(i) & "}$"), (5mm*i,0));
+ endfor
+ ...
+endfig;
+\end{verbatim}
+$$
+В отличии от этого, базовая команда \texttt{btex} (см. стр.\ \pageref{Dbtex})
+печатает текст буквально.
+%%In contrast, the basic \texttt{btex} command (see p.\ \pageref{Dbtex})
+%%typesets verbatim text.
+Получается, что \texttt{btex~s~etex} печатает литеральный символ `s', а
+\texttt{TEX(s)} печатает значение текстовой переменной MetaPost~$s$.
+%%That is, \texttt{btex~s~etex} typesets the
+%%literal character `s'; \texttt{TEX(s)} typesets the value of the
+%%MetaPost text variable~$s$.
+
+\index{LaTeX?\LaTeX!набор меток с} В версию 0.9
+\texttt{TEX.mp} добавлены два дополнительных средства, позволяющие
+использовать \LaTeX\ для печати меток: \texttt{TEXPRE} и \texttt{TEXPOST}.
+%%\index{LaTeX?\LaTeX!typesetting labels with} In version 0.9,
+%%\texttt{TEX.mp} acquired two additional routines to facilitate using
+%%\LaTeX\ to typeset labels: \texttt{TEXPRE} and \texttt{TEXPOST}.
+Их значения запоминаются и включаются соответственно перед и после
+каждого вызова \texttt{TEX}.
+%%Their
+%%values are remembered, and included before and after (respectively) each
+%%call to \texttt{TEX}.
+Без них каждый вызов \texttt{TEX} печатает совершенно независимо.
+%%Otherwise, each \texttt{TEX} call is effectively
+%%typeset independently.
+Вызовы \texttt{TEX} также не взаимодействуют с использованием
+{\tt verbatimtex}\index{verbatimtex?\texttt{verbatimtex}} (стр.\ \pageref{Dverbatimtex}).
+%%\texttt{TEX} calls also do not interfere with
+%%uses of {\tt verbatimtex}\index{verbatimtex?\texttt{verbatimtex}} (p.\ \pageref{Dverbatimtex}).
+
+Вот тот же самый пример, что и выше, но с использованием команд
+\LaTeX\ \verb|\(| и \verb|\)|:
+%%Here's the same example as above, using the \LaTeX\ commands \verb|\(|
+%%and \verb|\)|:
+
+$$\begin{verbatim}
+input TEX;
+TEXPRE("%&latex" & char(10) & "\documentclass{article}\begin{document}");
+TEXPOST("\end{document}");
+beginfig(100)
+ last := 10;
+ for i := 0 upto last:
+ label(TEX("\( n_{" & decimal(i) & "} \)"), (5mm*i,0));
+ endfor
+ ...
+endfig;
+\end{verbatim}
+$$
+Объяснения:
+%%Explanation:
+\begin{itemize}
+
+\item
+\texttt{\%\&latex} приводит к вызову \LaTeX\ вместо \TeX\ (см. также ниже).
+%%The \texttt{\%\&latex} causes \LaTeX\ to be invoked instead of \TeX.
+%%(See below, also.)
+Основанные на Web2C и MiKTeX дистрибутивы \TeX, как минимум,
+понимают \texttt{\%\&} спецификацию; см., например, документацию Web2C
+для деталей, \url{http://tug.org/web2c}.
+%%Web2C- and MiKTeX-based \TeX\ implementations, at
+%%least, understand this \texttt{\%\&} specification; see, e.g., the Web2C
+%%documentation for details, \url{http://tug.org/web2c}.
+(Информация о том, как делать это же в других системах будет весьма приветствоваться.)
+%%(Information on
+%%how to do the same with other systems would be most welcome.)
+
+\item
+\texttt{char(10)} помещает маркер новой строки (десятичный код символа ASCII --- 10)
+в вывод.
+%%The \texttt{char(10)} puts a newline (ASCII character code 10, decimal)
+%%in the output.
+
+\item
+\verb|\documentclass...| --- обычный способ начать документ \LaTeX.
+%%The \verb|\documentclass...| is the usual way to start a \LaTeX\
+%%document.
+
+\item
+Из-за поведения \texttt{mpto} \verb|TEXPOST("\end{document}")| не является
+строго необходимым, но надежнее его включать.
+%%The \verb|TEXPOST("\end{document}")| is not strictly necessary, due to
+%%the behavior of \texttt{mpto}, but it is safer to include it.
+
+\end{itemize}
+
+К сожалению, инструкции \TeX\ \verb|\special| исчезают в этом процессе.
+%%Unfortunately, \TeX\ \verb|\special| instructions vanish in this
+%%process.
+Поэтому нельзя использовать пакеты, подобные \texttt{xcolor}
+и \texttt{hyperref}.
+%%So it is not possible to use packages such as \texttt{xcolor}
+%%and \texttt{hyperref}.
+
+В случае, если вы любопытны, то средства \texttt{TEX.mp} реализуются очень просто:
+они пишут команды \texttt{btex} во временный файл и затем используют
+\texttt{scantokens} (стр.\ \pageref{Dscantokens}) для его обработки.
+%%In case you're curious, these routines are implemented very simply: they
+%%write \texttt{btex} commands to a temporary file and then use
+%%\texttt{scantokens} (p.\ \pageref{Dscantokens}) to process it.
+Механизм \texttt{makempx} (стр.\ \pageref{Dmakempx}) выполняет всю работу
+по использованию \TeX.
+%%The
+%%\texttt{makempx} mechanism (p.\ \pageref{Dmakempx}) does all the work of
+%%running \TeX.
+
+Магические \verb|%&| в первой строке --- это не единственный путь указать
+на вызов программы, отличной от (plain) \TeX.
+%%The \verb|%&| magic on the first line is not the only way to specify
+%%invoking a different program than (plain) \TeX.
+Здесь проявляется преимущество максимума гибкости: разные конструкции \texttt{TEX}
+могут использовать разные процессоры \TeX.
+%%It has the advantage of
+%%maximum flexibility: different \texttt{TEX} constructs can use different
+%%\TeX\ processors.
+Возможны не менее двух других способов:
+%%But at least two other methods are possible:
+
+\begin{itemize}
+\item Установка переменный среды \texttt{TEX} в \texttt{latex} или
+в какой-угодно процессор, желаемый для вызова.
+%%Set the environment variable \texttt{TEX} to \texttt{latex}---or
+%%whatever processor you want to invoke.
+(Для работы с фрагментами \ConTeXt\ нужно вызывать \ttt{texexec}.)
+%%(To handle \ConTeXt\ fragments,
+%%\ttt{texexec} could be used.)
+Этот способ удобен, когда пишется сценарий или идет работа над проектом,
+всегда требующим \texttt{latex}.
+%%This might be convenient when writing a
+%%script, or working on a project that always requires \texttt{latex}.
+
+\item Вызов MetaPost с опцией командной строки \ttt{-tex=latex} (или другим
+процессором, конечно).
+%%Invoke MetaPost with the command-line option \ttt{-tex=latex} (or
+%%whatever processor, of course).
+Это может быть полезно в Makefile или при единственном исполнении.
+%%This might be useful from a Makefile,
+%%or just a one-off run.
+\end{itemize}
+
+\subsection{\texttt{mproof.tex}}
+
+\index{mproof.tex?\texttt{mproof.tex}}
+
+\texttt{mproof.tex} --- это средство (plain) \TeX, а не MetaPost.
+%%\texttt{mproof.tex} is a (plain) \TeX\ routine, not MetaPost at all.
+Оно печатает гранки вывода MetaPost.
+%%It writes a proof sheet for MetaPost output.
+Вызывайте его примерно так:
+%%Call it like this:
+$$\hbox{\tt tex mproof {\sl имя-выходного-файла-MetaPost}}$$
+%%$$\hbox{\tt tex mproof {\sl MetaPost-output-filename}}$$
+Затем работайте с результирующим файлом \texttt{dvi} обычным образом.
+%%Then process the resulting \texttt{dvi} file as usual.
+
+\section{Отладка}
+%%\section{Debugging}
+
+MetaPost унаследовал многие возможности \MF\index{metafont?\MF} для
+интерактивной отладки, значительная часть которых может лишь вкратце быть упомянута
+здесь.
+%%MetaPost inherits from \MF\index{metafont?\MF} numerous facilities for
+%%interactive debugging, most of which can only be mentioned briefly here.
+Больше информации по сообщениям об ошибках, отладке, генерации
+трассирующей информации можно найти в {\sl The\ \MF book} \cite{kn:c}.
+%%Further information on error messages, debugging, and generating tracing
+%%information can be found in {\sl The\ \MF book} \cite{kn:c}.
+
+Предположим, что ваш входной файл содержит в строке 17
+$$ \hbox{\tt draw z1-{}-z2;} $$
+без предварительного определения значений {\tt z1} и {\tt z2}.
+%%Suppose your input file says
+%%$$ \hbox{\tt draw z1--z2;} $$
+%%on line 17 without first giving known values to {\tt z1} and {\tt z2}.
+Рис.~\ref{errmsg} показывает то, что интерпретатор MetaPost печатает на
+вашем терминале, когда находит ошибку.
+%%Figure~\ref{errmsg} shows what the MetaPost interpreter prints on your
+%%terminal when it finds the error.
+Собственно сообщение об ошибке --- это строка, начинающаяся с ``{\tt !}'',
+следующие шесть строк дают контекст, точно показывающий, что читалось с ввода,
+когда была обнаружена ошибка, а ``{\tt ?}'' на последней строке --- это
+приглашение для вашего ответа.
+%%The actual error message is the line
+%%beginning with ``{\tt !}''; the next six lines give the context that
+%%shows exactly what input was being read when the error was found; and
+%%the ``{\tt ?}'' on last line is a prompt for your response.
+Из-за того, что сообщение об ошибке говорит о неопределенной координате $x$,
+это значение печатается в первой строке после `{\tt >{}>}''.
+%%Since the
+%%error message talks about an undefined $x$~coordinate, this value is
+%%printed on the first line after the ``{\tt >>}''.
+В этом случае координата $x$ пары {\tt z1} --- это неизвестная
+переменная {\tt x1}, поэтому интерпретатор печатает имя переменной
+{\tt x1} точно также, как если бы в этом месте было
+сказано\index{show?\texttt{show}} ``{\tt show x1}''.
+%%In this case the
+%%$x$~coordinate of {\tt z1} is just the unknown variable {\tt x1}, so the
+%%interpreter prints the variable name {\tt x1} just as it would if it
+%%were told to\index{show?\texttt{show}} ``{\tt show x1}'' at this point.
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+>> x1
+! Undefined x coordinate has been replaced by 0.
+<to be read again>
+ {
+--->{
+ curl1}..{curl1}
+l.17 draw z1--
+ z2;
+?
+\end{verbatim}
+$$
+\caption{Пример сообщения об ошибке.}
+%%\caption{An example of an error message.}
+\label{errmsg}
+\end{figure}
+
+Листинг контекста может показаться слегка путаным в первый раз, но он
+по-просту выдает несколько строк текста, показывая, как много из
+каждой строки было уже считано.
+%%The context listing may seem a little confusing at first, but it really just
+%%gives a few lines of text showing how much of each line has been read so far.
+Каждая строка ввода печатается в две строки, подобные следующим:
+%%Each line of input is printed on two lines like this:
+\begin{eqnarray*}
+ \descr{дескриптор}\ \hbox{Уже считанный текст} \\
+ && \hbox{Текст для считывания}
+%%\descr{descriptor}\ \hbox{Text read so far} \\
+%% && \hbox{Text yet to be read}
+\end{eqnarray*}
+\tdescr{Дескриптор} идентифицирует исходник.
+%%The \tdescr{descriptor} identifies the input source.
+Это либо номер строки типа ``{\tt l.17}'' для строки 17 текущего файла, либо
+имя макроса перед ``{\tt ->}'', либо объясняющая фраза в угловых скобках.
+%%It is either a
+%%line number like ``{\tt l.17}'' for line 17 of the current file; or it
+%%can be a macro name followed by ``{\tt ->}''; or it is a descriptive
+%%phrase in angle brackets.
+Таким образом, значение листинга контекста на рис.~\ref{errmsg}: интерпретатор
+только что считал строку 17 входного файла до ``{\tt -{}-}'', раскрытие макроса
+{\tt -{}-} как раз началось и начальный ``\verb|{|'' возвращен назад, позволяя
+ввод пользователя до разбора этого знака.
+%%Thus, the meaning of the context listing in
+%%Figure~\ref{errmsg} is that the interpreter has just read line 17 of the
+%%input file up to ``{\tt --},'' the expansion of the {\tt --} macro has
+%%just started, and the initial ``\verb|{|'' has been reinserted to allow
+%%for user input before scanning this token.
+
+Среди возможных ответов на приглашение {\tt ?} есть такие:
+%%Among the possible responses to a {\tt ?} prompt are the following:
+\begin{description}
+\item[x] прекращает исполнение --- вы можете исправить ваш входной файл и перезапустить MetaPost.
+%%\item[x] terminates the run so that you can fix your input file and start over.
+\item[h] печатает подсказку, за которой идет другое {\tt ?}-приглашение.
+%%\item[h] prints a help message followed by another {\tt ?} prompt.
+\item[\tdescr{return}] приводит интерпретатор к продолжению работы так хорошо, как
+он сможет.
+%%\item[\tdescr{return}] causes the interpreter to proceed as best it can.
+\item[?] печатает список возможных опций, за которыми следует {\tt ?}-приглашение.
+%%\item[?] prints a listing of the options available, followed by another
+%% {\tt ?} prompt.
+\end{description}
+
+Сообщения об ошибках и ответы на команды {\tt show} также печатаются и в
+файл-дубликат\index{файлы!дубликат}, чье имя получается из имени
+главного входного файла изменением ``{\tt .mp}'' на ``{\tt .log}''.
+%%Error messages and responses to {\tt show} commands are also written
+%%into the transcript\index{files!transcript} file whose name is obtained
+%%from the name of the main input file by changing ``{\tt .mp}'' to ``{\tt
+%%.log}''.
+Когда внутренняя переменная\index{внутренние
+переменные}\index{переменные!внутренние} {\tt
+tracingonline}\index{tracingonline?\texttt{tracingonline}} имеет исходное
+значение ноль, то некоторые команды {\tt show} печатают свои результаты во
+всех деталях только в файл-дубликат.
+%%When the internal variable\index{internal
+%%variables}\index{variables!internal} {\tt
+%%tracingonline}\index{tracingonline?\texttt{tracingonline}} is at its
+%%default value of zero, some {\tt show} commands print their results in
+%%full detail only in the transcript file.
+
+Только один тип команды {\tt show}\index{show?\texttt{show}} обсуждался до
+сих пор: {\tt show} с разделенным запятыми списком выражений печатает
+символьное представление этих выражений.
+%%Only one type of {\tt show}\index{show?\texttt{show}} command has been
+%%discussed so far: {\tt show} followed by a comma-separated list of
+%%expressions prints symbolic representations of the expressions.
+
+Команда {\tt showtoken}\index{showtoken?\texttt{showtoken}}\label{Dshtok}
+может быть использована для показа параметров и текста замены макроса.
+%%The {\tt showtoken}\index{showtoken?\texttt{showtoken}}\label{Dshtok}
+%%command can be used to show the
+%%parameters and replacement text of a macro.
+Она берет разделенный запятыми список знаков и идентифицирует каждый из них.
+%%It takes a comma-separated list of tokens and identifies each one.
+Если знак --- это примитив, например,
+``\verb|showtoken +|'', то он по-просту идентифицируется собой:
+$$ \hbox{\verb|> +=+|} $$
+%%If the token is a primitive as in
+%%``\verb|showtoken +|'' it is just identified as being itself:
+%%$$ \hbox{\verb|> +=+|} $$
+Применение {\tt showtoken} к переменной или {\tt vardef}-макросу приведет к
+$$ \hbox{\tt > } \descr{знак}\hbox{\tt =variable} $$
+%%Applying {\tt showtoken} to a variable or a {\tt vardef} macro yields
+%%$$ \hbox{\tt > } \descr{token}\hbox{\tt =variable} $$
+
+Для получения дополнительной информации о переменной используйте
+{\tt showvariable}\index{showvariable?\texttt{showvariable}}\label{Dshvar}
+вместо {\tt showtoken}.
+%%To get more information about a variable, use
+%%{\tt showvariable}\index{showvariable?\texttt{showvariable}}\label{Dshvar}
+%%instead of {\tt showtoken}.
+Аргумент к {\tt showvariable} --- это разделенный запятыми список символических
+знаков, а ее результат --- это описание всех переменных, чьи имена начинаются с
+одного из знаков из списка.
+%%The
+%%argument to {\tt showvariable} is a comma-separated list of symbolic tokens
+%%and the result is a description of all the variables whose names begin with
+%%one of the listed tokens.
+Это работает даже для vardef-макросов.
+%%This even works for {\tt vardef} macros.
+Например, {\tt showvariable z} печатает
+$$ \hbox{\verb|z@#=macro:->begingroup(x(SUFFIX2),y(SUFFIX2))endgroup|} $$
+%%For example, {\tt showvariable z} yields
+%%$$ \hbox{\verb|z@#=macro:->begingroup(x(SUFFIX2),y(SUFFIX2))endgroup|} $$
+
+Есть еще команда {\tt
+showdependencies}\index{showdependencies?\texttt{showdependencies}}\label{Dshdep},
+не имеющая аргументов и печатающая список всех {\em зависимых} переменных и то, как
+линейные уравнения заданные ранее делают их зависимыми с другими переменными.
+%%There is also a {\tt
+%%showdependencies}\index{showdependencies?\texttt{showdependencies}}\label{Dshdep}
+%%command that takes no arguments and prints a list of all {\em dependent}
+%%variables and how the linear equations given so far make them depend on
+%%other variables.
+Таким образом, после
+$$ \hbox{\tt z2-z1=(5,10); z1+z2=(a,b);} $$
+{\tt showdependencies} напечатает то, что показано на рис.~\ref{shdep}.
+%%Thus after
+%%$$ \hbox{\tt z2-z1=(5,10); z1+z2=(a,b);} $$
+%%{\tt showdependencies} prints what is shown in Figure~\ref{shdep}.
+Это может быть полезным при ответе на вопрос типа ``Что значит, что
+`{\tt !\ Undefined x coordinate}?'\footnote{Координата x ---
+неопределена} --- я думаю, что приведенные ранее уравнения определяют
+{\tt x1}.''
+%%This could
+%%be useful in answering a question like ``What does it mean
+%%`{\tt !\ Undefined x coordinate}?'
+%%I thought the equations given so far would determine {\tt x1}.''
+
+\begin{figure}[htp]
+$$\begin{verbatim}
+x2=0.5a+2.5
+y2=0.5b+5
+x1=0.5a-2.5
+y1=0.5b-5
+\end{verbatim}
+$$
+\caption{Результат {\tt z2-z1=(5,10); z1+z2=(a,b); showdependencies;}}
+%%\caption{The result of {\tt z2-z1=(5,10); z1+z2=(a,b); showdependencies;}}
+\label{shdep}
+\end{figure}
+
+Если все это не приводит к успеху, то есть еще предопределенный макрос
+{\tt tracingall}\index{tracingall?\texttt{tracingall}}\label{Dtall},
+приводящий интерпретатор к печати детального отчета обо всем, что он
+делает.
+%%When all else fails, the predefined macro {\tt
+%%tracingall}\index{tracingall?\texttt{tracingall}}\label{Dtall} causes
+%%the interpreter to print a detailed listing of everything it is doing.
+Вследствие того, что трассирующая информация часто имеет весьма большой
+размер, возможно будет лучше использовать макрос {\tt
+loggingall}\index{loggingall?\texttt{loggingall}}\label{Dlogall},
+производящий ту же самую информацию, но только для записи в
+файл-дубликат\index{файлы!дубликат}.
+%%Since the tracing information is often quite voluminous, it may be
+%%better to use the {\tt
+%%loggingall}\index{loggingall?\texttt{loggingall}}\label{Dlogall} macro
+%%that produces the same information but only writes it in the
+%%transcript\index{files!transcript} file.
+Есть еще макрос {\tt
+tracingnone}\index{tracingnone?\texttt{tracingnone}}\label{Dtnone},
+отключающий все распечатки по трассировке.
+%%There is also a {\tt
+%%tracingnone}\index{tracingnone?\texttt{tracingnone}}\label{Dtnone} macro
+%%that turns off all the tracing output.
+
+Вывод трассировки контролируется множеством внутренних
+переменных\index{внутренние переменные}\index{переменные!внутренние},
+приводимых далее.
+%%Tracing output is controlled by the set of internal
+%%variables\index{internal variables}\index{variables!internal} summarized
+%%below.
+Когда любой из этих переменных задают положительное значение, то этим
+устанавливается соответствующая форма трассировки.
+%%When any one of these variables is given a positive value, the
+%%corresponding form of tracing is turned on.
+Здесь приведено множество переменных трассировки и то, что случается, когда
+каждая из них становится положительной.
+%%Here is the set of tracing
+%%variables and what happens when each of them is positive:
+\begin{description}
+\item[{\tt tracingcapsules}]\index{tracingcapsules?\texttt{tracingcapsules}}\label{Dtcapsules}%
+показывает значения временных количеств (капсул), когда они становятся известными.
+%%\item[{\tt tracingcapsules}]\index{tracingcapsules?\texttt{tracingcapsules}}\label{Dtcapsules}%
+%%shows the values of temporary quantities (capsules) when they become known.
+%
+\item[{\tt tracingchoices}]\index{tracingchoices?\texttt{tracingchoices}}\label{Dtchoices}%
+показывает контрольные точки Безье\index{управляющие точки} на каждом пути, где они
+выбираются. %
+%%\item[{\tt tracingchoices}]\index{tracingchoices?\texttt{tracingchoices}}\label{Dtchoices}%
+%%shows the B\'ezier control\index{control points} points of each new path
+%%when they are chosen. %
+\item[{\tt tracingcommands}]\index{tracingcommands?\texttt{tracingcommands}}\label{Dtcommands}%
+показывает команды перед их выполнением. Установка в ${}>1$ также покажет проверки
+{\tt if}\index{if?\texttt{if}} и циклы до их раскрытия;
+установка в ${}>2$ покажет алгебраические операции до их выполнения.
+%%\item[{\tt tracingcommands}]\index{tracingcommands?\texttt{tracingcommands}}\label{Dtcommands}%
+%%shows the commands before they are performed. A setting ${}>1$ also shows
+%%{\tt if}\index{if?\texttt{if}} tests and loops before they are expanded;
+%%a setting ${}>2$ shows algebraic operations before they are performed.
+%
+\item[{\tt tracingequations}]\index{tracingequations?\texttt{tracingequations}}\label{Dtequations}%
+показывает каждую переменную, когда она становится известной.
+%%\item[{\tt %%tracingequations}]\index{tracingequations?\texttt{tracingequations}}\label{Dtequations}%
+%%shows each variable when it becomes known.
+%
+\item[{\tt tracinglostchars}]\index{tracinglostchars?\texttt{tracinglostchars}}\label{Dtlostchars}%
+предупреждает о символах, отсутствующих в картинке, из-за их отсутствия в шрифте, используемом
+для печати меток.
+%%\item[{\tt tracinglostchars}]\index{tracinglostchars?\texttt{tracinglostchars}}\label{Dtlostchars}%
+%%warns about characters omitted from a picture because they are not in the font
+%%being used to typeset labels.
+%
+\item[{\tt tracingmacros}]\index{tracingmacros?\texttt{tracingmacros}}\label{Dtmacros}%
+печатает макросы до их раскрытия.
+%%\item[{\tt tracingmacros}]\index{tracingmacros?\texttt{tracingmacros}}\label{Dtmacros}%
+%%shows macros before they are expanded.
+%
+\item[{\tt tracingoutput}]\index{tracingoutput?\texttt{tracingoutput}}\label{Dtoutput}%
+печатает картинки при их отправке в PostScript-файлы.
+%%\item[{\tt tracingoutput}]\index{tracingoutput?\texttt{tracingoutput}}\label{Dtoutput}%
+%%shows pictures as they are being shipped out as PostScript files.
+%
+\item[{\tt tracingrestores}]\index{tracingrestores?\texttt{tracingrestores}}\label{Dtrestores}%
+показывает символы и внутренние переменные при их восстановлении в конце группы.
+%%\item[{\tt tracingrestores}]\index{tracingrestores?\texttt{tracingrestores}}\label{Dtrestores}%
+%%shows symbols and internal variables as they are being restored at the end
+%%of a group.
+%
+\item[{\tt tracingspecs}]\index{tracingspecs?\texttt{tracingspecs}}\label{Dtspecs}%
+показывает выделения, генерируемые при рисовании многоугольным пером\index{перья!многоугольные}.
+%%\item[{\tt tracingspecs}]\index{tracingspecs?\texttt{tracingspecs}}\label{Dtspecs}%
+%%shows the outlines generated when drawing with a
+%%polygonal pen\index{pens!polygonal}.
+%
+\item[{\tt tracingstats}]\index{tracingstats?\texttt{tracingstats}}\label{Dtstats}
+в конце работы печатает в файл-дубликат о том, как много ограниченных ресурсов
+интерпретатора MetaPost было использовано.
+%%\item[{\tt tracingstats}]\index{tracingstats?\texttt{tracingstats}}\label{Dtstats}
+%%shows in the transcript file at the end of the job how many of the
+%%MetaPost interpreter's limited resources were used.
+\end{description}
+
+\section*{Признательность}
+%%\section*{Acknowledgement}
+
+Я рад поблагодарить Дональда Кнута за возможность проделать эту работу ---
+за развитие \MF\ и помещения его в открытый доступ.
+%%I would like to thank Don Knuth for making this work possible by
+%%developing \MF\ and placing it in the public domain.
+Я также в долгу перед ним за полезные предложения, особенно в
+связи с обработкой включаемого материала \TeX.
+%%I am also indebted
+%%to him for helpful suggestions, particularly with regard to the
+%%treatment of included \TeX\ material.
+
+
+\appendix
+\section{Справочное руководство}
+%%\section{Reference Manual}
+
+\let\svtopfrac=\topfraction % prepare to restore values at end of this appendix
+\let\svtxtfrac=\textfraction % grouping would fail because \setcounter is global
+\newcounter{svtopnum}
+\newcounter{svtotnum}
+\setcounter{svtopnum}{\value{topnumber}}
+\setcounter{svtotnum}{\value{totalnumber}}
+
+\renewcommand\topfraction{1.0} % set values to allow *lots* of figures and tables
+\renewcommand\textfraction{0.0}
+\setcounter{topnumber}{10}
+\setcounter{totalnumber}{10}
+
+Таблицы \ref{ivartab}--\ref{pseudotab} суммируют встроенные возможности
+Plain MetaPost и возможности, определенные в файле с макросами {\tt
+boxes.mp}\index{boxes.mp?\texttt{boxes.mp}}.
+%%Tables \ref{ivartab}--\ref{pseudotab} summarize the built-in features of
+%%Plain MetaPost and the features defined in the {\tt
+%%boxes.mp}\index{boxes.mp?\texttt{boxes.mp}} macro file.
+Как объяснялось в разделе ~\ref{boxessec}, файл с макросами {\tt boxes.mp}
+не включается автоматически и макросы из него недоступны до тех пор, пока
+вы не запросите их командой\index{input?\texttt{input}}
+$$ \hbox{\tt input boxes} $$
+%%As explained in
+%%Section~\ref{boxessec}, the {\tt boxes.mp} macro file is not
+%%automatically preloaded and the macros defined there are not accessible
+%%until you ask for them via the command\index{input?\texttt{input}}
+%%$$ \hbox{\tt input boxes} $$
+
+Возможности, зависящие от {\tt boxes.mp} отмечены символами \bx.
+%%Features that depend on {\tt boxes.mp} are marked by \bx\ symbols.
+Возможности из макропакета Plain\index{макросы Plain} отмечены символами
+\pl, а примитивы MetaPost приводятся без \bx\ или \pl.
+%%Features from the Plain\index{Plain macros} macro package are marked by
+%%\pl\ symbols, and MetaPost primitives are not marked by \bx\ or \pl.
+Разница между примитивами и макросами из plain может игнорироваться
+случайным пользователем, но важно помнить, что возможности с меткой \bx\
+могут быть использованы только после чтения файла {\tt
+boxes.mp}\index{boxes.mp?\texttt{boxes.mp}} с макросами.
+%%The distinction between primitives and plain macros can be ignored by
+%%the casual user, but it is important to remember that features marked by
+%%a \bx\ can only be used after reading in the {\tt
+%%boxes.mp}\index{boxes.mp?\texttt{boxes.mp}} macro file.
+
+Таблицы в этом приложении приводят имя каждой возможности, номер страницы,
+где она объясняется, и краткое описание.
+%%The tables in this appendix give the name of each feature, the page
+%%number where it is explained, and a short description.
+Небольшое число свойств нигде не объяснялось и они не имеют номеров страниц.
+%%A few features
+%%are not explained elsewhere and have no page number listed.
+Эти возможности существуют, в основном, для совместимости с
+\MF\index{metafont?\MF} и предполагаются самообъясняющими.
+%%These
+%%features exist primarily for compatibility with \MF\index{metafont?\MF}
+%%and are intended to be self-explanatory.
+Некоторые определенные возможности \MF\ полностью отсутствуют из-за
+ограниченного интереса к ним пользователей MetaPost и/или из-за требуемых
+длинных объяснений.
+%%Certain other features from
+%%\MF\ are omitted entirely because they are of limited interest to the
+%%MetaPost users and/or would require long explanations.
+Все они документированы в {\sl The \MF book} \cite{kn:c} как объяснено в
+приложении~\ref{MPvsMF}.
+%%All of these are
+%%documented in {\sl The \MF book} \cite{kn:c} as explained in
+%%Appendix~\ref{MPvsMF}.
+
+Таблица~\ref{ivartab} перечисляет внутренние переменные с числовыми значениями.
+%%Table~\ref{ivartab} lists internal variables that take on numeric values.
+Таблица~\ref{pvartab} перечисляет предопределенные переменные других типов.
+%%Table~\ref{pvartab} lists predefined variables of other types.
+Таблица~\ref{consttab} перечисляет предопределенные константы.
+%%Table~\ref{consttab} lists predefined constants.
+Некоторые из них реализованы как переменные, чьи значения предполагается не
+менять.
+%%Some of these are implemented
+%%as variables whose values are intended to be left unchanged.
+
+Таблица~\ref{optab} приводит операторы MetaPost и перечисляет
+возможные типы для аргументов и результата каждого из них.
+%%Table~\ref{optab} summarizes MetaPost operators and lists
+%%the possible argument and result types for each one.
+Пункт ``--'' для левого аргумента задает унарный оператор, а ``--'' для
+обоих задает оператор без аргументов.
+%%A ``--'' entry for
+%%the left argument indicates a unary operator; ``--'' entries for both
+%%arguments indicate a nullary operator.
+Операторы с параметрами-суффиксами не приводятся в этой таблице, потому что они
+обрабатываются как ``похожие на функции макросы''.
+%%Operators that take suffix
+%%parameters are not listed in this table because they are treated as
+%%``function-like macros''.
+
+Две последние таблицы --- это таблица~\ref{cmdtab} для команд и
+таблица~\ref{pseudotab} для макросов, ведущих себя как функции или
+процедуры.
+%%The last two tables are Table~\ref{cmdtab} for commands and
+%%Table~\ref{pseudotab} macros that behave like functions or procedures.
+Такие макросы берут списки аргументов в скобках и/или параметры-суффиксы и
+возвращают либо значение приведенного в таблице типа, либо ничего.
+%%Such macros take parenthesized argument lists and/or suffix parameters,
+%%returning either a value whose type is listed in the table, or nothing.
+Последний случай для макросов, ведущих себя как процедуры.
+%%The latter case is for macros that behave like procedures.
+Их возвращаемые значения приводится как ``--''.
+%%Their return values are listed as ``--''.
+
+Картинки в этом приложении представляют синтаксис языка MetaPost, начиная
+с выражений на рисунках \ref{syexpr1}--\ref{sypseudo}.
+%%The figures in this appendix present the syntax of the MetaPost language
+%%starting with expressions in Figures \ref{syexpr1}--\ref{sypseudo}.
+Хотя правила иногда указывают типы для выражений, первичностей, вторичностей и
+третичностей, но отдельный синтаксис для \tdescr{числового выражения},
+\tdescr{выражения-пары} и т.~п. не приводится.
+%%Although the productions sometimes specify types for expressions, primaries,
+%%secondaries, and tertiaries, no attempt is made to give separate syntaxes
+%%for \tdescr{numeric expression}, \tdescr{pair expression}, etc.
+Своей простоте правила на рис.~\ref{sytypexpr} обязаны этим отсутствием
+информации о типах.
+%%The simplicity of the productions in Figure~\ref{sytypexpr} is due to this
+%%lack of type information.
+Информация о типах может быть найдена в таблицах \ref{ivartab}--\ref{pseudotab}.
+%%Type information can be found in Tables \ref{ivartab}--\ref{pseudotab}.
+
+Рисунки \ref{syprog} и \ref{sycmds} содержат синтаксис программ MetaPost,
+включая команды и их обобщения.
+%%Figures \ref{syprog} and \ref{sycmds} give the syntax for MetaPost programs,
+%%including statements and commands.
+Они не упоминают циклов\index{циклы} и проверок {\tt if}\index{if?\texttt{if}},
+потому что эти конструкции не ведут себя как команды.
+%%They do not mention loops\index{loops}
+%%and {\tt if}\index{if?\texttt{if}}
+%%tests because these constructions do not behave like statements.
+Синтаксис на рисунках \ref{syexpr1}--\ref{sycondloop} применим к результатам
+раскрытия всех условных конструкций и циклов.
+%%The syntax
+%%given in Figures \ref{syexpr1}--\ref{sycondloop} applies to the result of
+%%expanding all conditionals and loops.
+Условные конструкции и циклы имеют синтаксис, но они работают практически
+с произвольными последовательностями знаков.
+%%Conditionals and loops do have a
+%%syntax, but they deal with almost arbitrary sequences of tokens.
+Рис.~\ref{sycondloop} определяет условные конструкции через
+\tdescr{сбалансированные знаки}, а циклы через \tdescr{тело цикла}, где
+\tdescr{сбалансированные знаки} --- это любая последовательность знаков,
+сбалансированная относительно {\tt if} и {\tt fi}, а \tdescr{тело цикла} ---
+это последовательность знаков, сбалансированная относительно {\tt for},
+{\tt forsuffixes}, {\tt forever} и {\tt endfor}.
+%%Figure~\ref{sycondloop} specifies conditionals in terms of
+%%\tdescr{balanced tokens} and loops in terms of \tdescr{loop text}, where
+%%\tdescr{balanced tokens} is any sequence of tokens balanced with respect
+%%to {\tt if} and {\tt fi}, and \tdescr{loop text} is a sequence of tokens
+%%balanced with respect to {\tt for}, {\tt forsuffixes}, {\tt forever},
+%%and {\tt endfor}.
+
+\begin{table}[htp]
+\caption{Внутренние переменные с числовыми значениями}
+%%\caption{Internal variables with numeric values}
+$$\begin{tabular}{|l|r|l|}
+\hline
+\multicolumn1{|c}{Имя}& \multicolumn1{|c}{Стр.}& \multicolumn1{|c|}{Описание}\\
+%%\multicolumn1{|c}{Name}& \multicolumn1{|c}{Page}& \multicolumn1{|c|}{Explanation}\\
+\hline
+\hline
+\pl\tt ahangle& \pageref{Dahangle}&
+ угол для наконечника стрелки в градусах (стандартно 45)\\\hline
+%% angle for arrowheads in degrees (default: 45)\\\hline
+\pl\tt ahlength& \pageref{Dahlength}&
+ размер наконечника стрелки (стд. 4{\tt bp})\\\hline
+%% size of arrowheads (default: 4{\tt bp})\\\hline
+\pl\tt bboxmargin& \pageref{Dbbmargin}&
+ особый промежуток, допускаемый {\tt bbox} (стд. 2{\tt bp})\\\hline
+%% extra space allowed by {\tt bbox} (default 2{\tt bp})\\\hline
+\tt charcode& \pageref{Dcharcode}&
+ номер текущей картинки\\\hline
+%% the number of the current figure\\\hline
+\bx\tt circmargin& \pageref{Dcmargin}&
+ пустота вокруг содержимого круговой или овальной рамки\\\hline
+%% clearance around contents of a circular or oval box\\\hline
+\tt day& --&
+ текущий день месяца\\\hline
+%% the current day of the month\\\hline
+\tt defaultcolormodel& --&
+ начальная цветовая модель (стд. 5, rgb)\\\hline
+%% the initial color model (default: 5, rgb)\\\hline
+\bx\tt defaultdx& \pageref{Ddefaultdx}&
+ обычный гориз. отступ вокруг содержимого рамки (стд. 3{\tt bp})\\\hline
+%% usual horizontal space around box contents (default 3{\tt bp})\\\hline
+\bx\tt defaultdy& \pageref{Ddefaultdy}&
+ обычный верт. отступ вокруг содержимого рамки (стд. 3{\tt bp})\\\hline
+%% usual vertical space around box contents (default 3{\tt bp})\\\hline
+\pl\tt defaultpen& \pageref{Ddefaultpen}&
+ число, используемое {\tt pickup} для выбора стд. пера\\\hline
+%% numeric index used by {\tt pickup} to select default pen\\\hline
+\pl\tt defaultscale& \pageref{Ddfscale}&
+ масштабирующий множитель шрифта для строк-меток (стд. 1)\\\hline
+%% font scale factor for label strings (default 1)\\\hline
+\pl\tt labeloffset& \pageref{Dlaboff}&
+ расстояние отступа для меток (стд. 3{\tt bp})\\\hline
+%% offset distance for labels (default 3{\tt bp})\\\hline
+\tt linecap& \pageref{Dlinecap}&
+ 0 для butt, 1 для round, 2 для square\\\hline
+%% 0 for butt, 1 for round, 2 for square\\\hline
+\tt linejoin& \pageref{Dlinejoin}&
+ 0 для mitered, 1 для round, 2 для beveled\\\hline
+%% 0 for mitered, 1 for round, 2 for beveled\\\hline
+\tt miterlimit& \pageref{Dmiterlim}&
+ контролирует длину острия как в PostScript\\\hline
+%% controls miter length as in PostScript\\\hline
+\tt month& --&
+ текущий месяц (например, 3 $\equiv$ Март)\\\hline
+%% the current month (e.g, 3 $\equiv$ March)\\\hline
+\tt mpprocset& --&
+ \vtop{\hbox{установите в~1, если хотите включить словарь
+сокращений}\hbox{PostScript в вывод}}\\\hline
+%% \vtop{\hbox{set this to~1 if you want to include a PostScript
+%%dictionary}\hbox{of abbreviations in the output}}\\\hline
+\tt pausing& --&
+ ${}>0$ --- показывать строки на терминале до их чтения\\\hline
+%% ${}>0$ to display lines on the terminal before they are read\\\hline
+\tt prologues& \pageref{Dprologues}&
+ ${}>0$ --- выводить PostScript с встроенными шрифтами\\\hline
+%% ${}>0$ to output conforming PostScript using built-in fonts\\\hline
+\tt restoreclipcolor& --&
+ восстановление состояния графики после вырезки (стд. 1)\\\hline
+%% restore the graphics state after clip operations (default: 1)\\\hline
+\tt showstopping& --&
+ ${}>0$ --- останавливать после каждой команды {\tt show}\\\hline
+%% ${}>0$ to stop after each {\tt show} command\\\hline
+\tt time& --&
+ число минут после полуночи в начале этой работы\\\hline
+%% the number of minutes past midnight when this job started\\\hline
+\tt tracingcapsules& \pageref{Dtcapsules}&
+ ${}>0$ --- показывать и капсулы\\\hline
+%% ${}>0$ to show capsules too\\\hline
+\tt tracingchoices& \pageref{Dtchoices}&
+ ${}>0$ --- показывать контрольные точки для путей\\\hline
+%% ${}>0$ to show the control points chosen for paths\\\hline
+\tt tracingcommands& \pageref{Dtcommands}&
+ ${}>0$ --- показывать команды при их выполнении\\\hline
+%% ${}>0$ to show commands and operations as they are performed\\\hline
+\tt tracingequations& \pageref{Dtequations}&
+ ${}>0$ --- показывать каждую ставшую известной переменную\\\hline
+%% ${}>0$ to show each variable when it becomes known\\\hline
+\tt tracinglostchars& \pageref{Dtlostchars}&
+ ${}>0$ --- показывать символы не из {\tt infont}\\\hline
+%% ${}>0$ to show characters that aren't {\tt infont}\\\hline
+\tt tracingmacros& \pageref{Dtmacros}&
+ ${}>0$ --- показывать макросы до их раскрытия\\\hline
+%% ${}>0$ to show macros before they are expanded\\\hline
+\tt tracingonline& \pageref{Dtonline}&
+ ${}>0$ --- показывать длинные диагностики на терминале\\\hline
+%% ${}>0$ to show long diagnostics on the terminal\\\hline
+\tt tracingoutput& \pageref{Dtoutput}&
+ ${}>0$ --- показывать цифровые края при выводе\\\hline
+%% ${}>0$ to show digitized edges as they are output\\\hline
+\tt tracingrestores& \pageref{Dtrestores}&
+ ${}>0$ --- показывать переменные при их восстановлении\\\hline
+%% ${}>0$ to show when a variable or internal is restored\\\hline
+\tt tracingspecs& \pageref{Dtspecs}&
+ ${}>0$ --- показывать деления пути (исп-ся многоугольное перо)\\\hline
+%% ${}>0$ to show path subdivision when using a polygonal a pen\\\hline
+\tt tracingstats& \pageref{Dtstats}&
+ ${}>0$ --- показывать использование памяти в конце работы\\\hline
+%% ${}>0$ to show memory usage at end of job\\\hline
+\tt tracingtitles& --&
+ ${}>0$ --- показывать заголовки при их появлении\\\hline
+%% ${}>0$ to show titles online when they appear\\\hline
+\tt troffmode& \pageref{Dtroffmode}&
+ будет~1, если есть опция {\tt -troff} или {\tt -T}\\\hline
+%% set to~1 if a {\tt -troff} or {\tt -T} option was given\\\hline
+\tt truecorners& \pageref{Dtruecorn}&
+ ${}>0$ --- делать {\tt llcorner} и т.~д., игнорировать {\tt setbounds}\\\hline
+%% ${}>0$ to make {\tt llcorner} etc. ignore {\tt setbounds}\\\hline
+\tt warningcheck& \pageref{Dwarncheck}&
+ сообщение об ошибке при большом значении переменной\\\hline
+%% controls error message when variable value is large\\\hline
+\tt year& --&
+ текущий год (например, 1992)\\\hline
+%% the current year (e.g., 1992)\\\hline
+\end{tabular}
+$$
+\label{ivartab}%
+\index{day?\texttt{day}}\index{month?\texttt{month}}\index{pausing?\texttt{pausing}}\index{showstopping?\texttt{showstopping}}%
+\index{time?\texttt{time}}\index{tracingtitles?\texttt{tracingtitles}}\index{year?\texttt{year}}
+\end{table}
+
+
+\begin{table}[htp]
+\caption{Другие предопределенные переменные}
+%%\caption{Other Predefined Variables}
+$$\begin{tabular}{|l|l|r|l|}
+\hline
+\multicolumn1{|c}{Имя}& \multicolumn1{|c}{Тип}& \multicolumn1{|c}{Стр.}&
+ \multicolumn1{|c|}{Объяснение}\\
+%%\multicolumn1{|c}{Name}& \multicolumn1{|c}{Type}& \multicolumn1{|c}{Page}&
+%% \multicolumn1{|c|}{Explanation}\\
+\hline
+\hline
+\pl\tt background& color& \pageref{Dbground}&
+ Цвет для {\tt unfill} и {\tt undraw} (обычно белый)\\\hline
+%% Color for {\tt unfill} and {\tt undraw} (usually white)\\\hline
+\pl\tt currentpen& pen& \pageref{Dcurpen}&
+ Текущее перо (для команды {\tt draw})\\\hline
+%% Last pen picked up (for use by the {\tt draw} command)\\\hline
+\pl\tt currentpicture& picture& \pageref{Dcurpic}&
+ Результат команд {\tt draw} и {\tt fill}\\\hline
+%% Accumulate results of {\tt draw} and {\tt fill} commands\\\hline
+\pl\tt cuttings& path& \pageref{Dcuttings}&
+ Подпуть, отрезанный последней {\tt cutbefore} или {\tt cutafter}\\\hline
+%% subpath cut off by last {\tt cutbefore} or {\tt cutafter}\\\hline
+\pl\tt defaultfont& string& \pageref{Ddffont}&
+ Шрифт для команд печати строк\\\hline
+%% Font used by label commands for typesetting strings\\\hline
+\pl\tt extra\_beginfig& string& \pageref{Dxbfig}&
+ Дополнительные команды для {\tt beginfig}\\\hline
+%% Commands for {\tt beginfig} to scan\\\hline
+\pl\tt extra\_endfig& string& \pageref{Dxefig}&
+ Дополнительные команды для {\tt endfig}\\\hline
+%% Commands for {\tt endfig} to scan\\\hline
+\end{tabular}
+$$
+\label{pvartab}
+\end{table}
+
+
+\begin{table}[htp]
+\caption{Предопределенные константы}
+%%\caption{Predefined Constants}
+$$\begin{tabular}{|l|l|r|l|}
+\hline
+\multicolumn1{|c}{Имя}& \multicolumn1{|c}{Тип}& \multicolumn1{|c}{Стр.}&
+ \multicolumn1{|c|}{Объяснение}\\
+%%\multicolumn1{|c}{Name}& \multicolumn1{|c}{Type}& \multicolumn1{|c}{Page}&
+%% \multicolumn1{|c|}{Explanation}\\
+\hline
+\hline
+\pl\tt beveled& numeric& \pageref{Dbvled}&
+ Значение {\tt linejoin} для срезанных соединений [2]\\\hline
+%%\pl\tt beveled& numeric& \pageref{Dbvled}&
+%% {\tt linejoin} value for beveled joins [2]\\\hline
+\pl\tt black& color& \pageref{Dblack}&
+ Эквивалентно {\tt (0,0,0)}\\\hline
+%%\pl\tt black& color& \pageref{Dblack}&
+%% Equivalent to {\tt (0,0,0)}\\\hline
+\pl\tt blue& color& \pageref{Dblue}&
+ Эквивалентно {\tt (0,0,1)}\\\hline
+%%\pl\tt blue& color& \pageref{Dblue}&
+%% Equivalent to {\tt (0,0,1)}\\\hline
+\pl\tt bp& numeric& \pageref{Dbp}&
+ Один пункт PostScript в {\tt bp}-единицах [1]\\\hline
+%%\pl\tt bp& numeric& \pageref{Dbp}&
+%% One PostScript point in {\tt bp} units [1]\\\hline
+\pl\tt butt& numeric& \pageref{Dbutt}&
+ Значение {\tt linecap} для butt-конца [0]\\\hline
+%%\pl\tt butt& numeric& \pageref{Dbutt}&
+%% {\tt linecap} value for butt end caps [0]\\\hline
+\pl\tt cc& numeric& --&
+ Одна единица цицеро в {\tt bp}-единицах [12.79213]\\\hline
+%%\pl\tt cc& numeric& --&
+%% One cicero in {\tt bp} units [12.79213]\\\hline
+\pl\tt cm& numeric& \pageref{Dcm}&
+ Один сантиметр в {\tt bp}-единицах [28.34645]\\\hline
+%%\pl\tt cm& numeric& \pageref{Dcm}&
+%% One centimeter in {\tt bp} units [28.34645]\\\hline
+\pl\tt dd& numeric& --&
+ Один дидот в {\tt bp}-единицах [1.06601]\\\hline
+%%\pl\tt dd& numeric& --&
+%% One didot point in {\tt bp} units [1.06601]\\\hline
+\pl\tt ditto& string& --&
+ Строка {\tt \qq} длины 1\\\hline
+%%\pl\tt ditto& string& --&
+%% The {\tt \qq} character as a string of length 1\\\hline
+\pl\tt down& pair& \pageref{Ddown}&
+ Вектор вниз $(0,-1)$\\\hline
+%%\pl\tt down& pair& \pageref{Ddown}&
+%% Downward direction vector $(0,-1)$\\\hline
+\pl\tt epsilon& numeric& --&
+ Наименьшее положительное число MetaPost [$1\over65536$]\\\hline
+%%\pl\tt epsilon& numeric& --&
+%% Smallest positive MetaPost number [$1\over65536$]\\\hline
+\pl\tt evenly& picture& \pageref{Devenly}&
+ Образец пунктира из тире и равных промежутков\\\hline
+%%\pl\tt evenly& picture& \pageref{Devenly}&
+%% Dash pattern for equal length dashes\\\hline
+\pl\tt EOF& string& \pageref{Deof}&
+ Одиночный нулевой символ\\\hline
+%%\pl\tt EOF& string& \pageref{Deof}&
+%% Single null character\\\hline
+\tt false& boolean& \pageref{Dfalse}&
+ Логическое значение {\it false\/}\\\hline
+%%\tt false& boolean& \pageref{Dfalse}&
+%% The boolean value {\it false\/}\\\hline
+\pl\tt fullcircle& path& \pageref{Dfcirc}&
+ Окружность диаметра 1 с центром в $(0,0)$\\\hline
+%%\pl\tt fullcircle& path& \pageref{Dfcirc}&
+%% Circle of diameter 1 centered on $(0,0)$\\\hline
+\pl\tt green& color& \pageref{Dgreen}&
+ Эквивалентно {\tt (0,1,0)}\\\hline
+%%\pl\tt green& color& \pageref{Dgreen}&
+%% Equivalent to {\tt (0,1,0)}\\\hline
+\pl\tt halfcircle& path& \pageref{Dhcirc}&
+ Верхняя полуокружность диаметра 1\\\hline
+%%\pl\tt halfcircle& path& \pageref{Dhcirc}&
+%% Upper half of a circle of diameter 1\\\hline
+\pl\tt identity& transform& \pageref{Dident}&
+ Тождественная трансформация\\\hline
+%%\pl\tt identity& transform& \pageref{Dident}&
+%% Identity transformation\\\hline
+\pl\tt in& numeric& \pageref{Din}&
+ Один дюйм в {\tt bp}-единицах [72]\\\hline
+%%\pl\tt in& numeric& \pageref{Din}&
+%% One inch in {\tt bp} units [72]\\\hline
+\pl\tt infinity& numeric& \pageref{Dinf}&
+ Наибольшее положительное значение [4095.99998]\\\hline
+%%\pl\tt infinity& numeric& \pageref{Dinf}&
+%% Large positive value [4095.99998]\\\hline
+\pl\tt left& pair& \pageref{Dleft}&
+ Направление влево $(-1,0)$\\\hline
+%%\pl\tt left& pair& \pageref{Dleft}&
+%% Leftward direction $(-1,0)$\\\hline
+\pl\tt mitered& numeric& \pageref{Dmitred}&
+ Значение {\tt linejoin} для ``острых'' соединений [0]\\\hline
+%%\pl\tt mitered& numeric& \pageref{Dmitred}&
+%% {\tt linejoin} value for mitered joins [0]\\\hline
+\pl\tt mm& numeric& \pageref{Dmm}&
+ Один миллиметр в {\tt bp}-единицах [2.83464]\\\hline
+%%\pl\tt mm& numeric& \pageref{Dmm}&
+%% One millimeter in {\tt bp} units [2.83464]\\\hline
+\tt mpversion& string& \pageref{Dmpversion}&
+ Номер версии MetaPost\\\hline
+%%\tt mpversion& string& \pageref{Dmpversion}&
+%% MetaPost version number\\\hline
+\tt nullpen& pen& \pageref{Dnlpen}&
+ Пустое перо\\\hline
+%%\tt nullpen& pen& \pageref{Dnlpen}&
+%% Empty pen\\\hline
+\tt nullpicture& picture& \pageref{Dnlpic}&
+ Пустая картинка\\\hline
+%%\tt nullpicture& picture& \pageref{Dnlpic}&
+%% Empty picture\\\hline
+\pl\tt origin& pair& --&
+ Пара $(0,0)$\\\hline
+%%\pl\tt origin& pair& --&
+%% The pair $(0,0)$\\\hline
+\pl\tt pc& numeric& --&
+ Одна пика в {\tt bp}-единицах [11.95517]\\\hline
+%%\pl\tt pc& numeric& --&
+%% One pica in {\tt bp} units [11.95517]\\\hline
+\tt pencircle& pen& \pageref{Dpncirc}&
+ Круговое перо диаметра 1\\\hline
+%%\tt pencircle& pen& \pageref{Dpncirc}&
+%% Circular pen of diameter 1\\\hline
+\pl\tt pensquare& pen& \pageref{Dpnsqr}&
+ Квадратное перо высоты и ширины 1\\\hline
+%%\pl\tt pensquare& pen& \pageref{Dpnsqr}&
+%% square pen of height 1 and width 1\\\hline
+\pl\tt pt& numeric& \pageref{Dpt}&
+ Один принтерный пункт в {\tt bp}-единицах [0.99626]\\\hline
+%%\pl\tt pt& numeric& \pageref{Dpt}&
+%% One printer's point in {\tt bp} units [0.99626]\\\hline
+\pl\tt quartercircle& path& --&
+ Первый квадрант окружности диаметра 1\\\hline
+%%\pl\tt quartercircle& path& --&
+%% First quadrant of a circle of diameter 1\\\hline
+\pl\tt red& color& \pageref{Dred}&
+ Эквивалентно {\tt (1,0,0)}\\\hline
+%%\pl\tt red& color& \pageref{Dred}&
+%% Equivalent to {\tt (1,0,0)}\\\hline
+\pl\tt right& pair& \pageref{Dright}&
+ Направление вправо $(1,0)$\\\hline
+%%\pl\tt right& pair& \pageref{Dright}&
+%% Rightward direction $(1,0)$\\\hline
+\pl\tt rounded& numeric& \pageref{Drnded}&
+ Значение для {\tt linecap} и {\tt linejoin} для круглых\\
+\tt & & &
+ соединений и концов [1]\\\hline
+%%\pl\tt rounded& numeric& \pageref{Drnded}&
+%% {\tt linecap} and {\tt linejoin} value for round joins\\
+%%\tt & & &
+%% and end caps [1]\\\hline
+\pl\tt squared& numeric& \pageref{Dsqred}&
+ Значение {\tt linecap} для квадратных концов [2]\\\hline
+%%\pl\tt squared& numeric& \pageref{Dsqred}&
+%% {\tt linecap} value for square end caps [2]\\\hline
+\tt true& boolean& \pageref{Dtrue}&
+ Логическая величина {\tt true}\\\hline
+%%\tt true& boolean& \pageref{Dtrue}&
+%% The boolean value {\tt true}\\\hline
+\pl\tt unitsquare& path& --&
+ Путь {\tt (0,0)-{}-(1,0)-{}-(1,1)-{}-(0,1)-{}-cycle}\\\hline
+%%\pl\tt unitsquare& path& --&
+%% The path {\tt (0,0)--(1,0)--(1,1)--(0,1)--cycle}\\\hline
+\pl\tt up& pair& \pageref{Dup}&
+ Направление вверх $(0,1)$\\\hline
+%%\pl\tt up& pair& \pageref{Dup}&
+%% Upward direction $(0,1)$\\\hline
+\pl\tt white& color& \pageref{Dwhite}&
+ Эквивалентно {\tt (1,1,1)}\\\hline
+%%\pl\tt white& color& \pageref{Dwhite}&
+%% Equivalent to {\tt (1,1,1)}\\\hline
+\pl\tt withdots& picture& \pageref{Dwdots}&
+ Образец пунктира из точек\\\hline
+%%\pl\tt withdots& picture& \pageref{Dwdots}&
+%% Dash pattern that produces dotted lines\\\hline
+\end{tabular}
+$$
+\label{consttab}%
+\index{cc?\texttt{cc}}\index{dd?\texttt{dd}}\index{ditto?\texttt{ditto}}\index{epsilon?\texttt{epsilon}}%
+\index{origin?\texttt{origin}}\index{pc?\texttt{pc}}\index{quartercircle?\texttt{quartercircle}}%
+\index{unitsquare?\texttt{unitsquare}}
+\end{table}
+
+
+\clearpage
+\LTXtable{\textwidth}{mpman-optab-ru}
+
+\begin{table}[htp]
+\caption{Команды}
+%%\caption{Commands}
+$$\begin{tabular}{|l|r|l|}
+\hline
+\multicolumn1{|c}{Имя}& \multicolumn1{|c}{Стр.}& \multicolumn1{|c|}{Объяснение}\\
+%%\multicolumn1{|c}{Name}& \multicolumn1{|c}{Page}& \multicolumn1{|c|}{Explanation}\\
+\hline
+\hline
+\tt \verb|addto|& \pageref{sydraw}&
+ Низкоуровневая команда для рисования и заполнения\\\hline
+%% Low-level command for drawing and filling\\\hline
+\tt \verb|clip|& \pageref{Dclip}&
+ Применяет путь вырезки к картинке\\\hline
+%% Applies a clipping path to a picture\\\hline
+\tt \verb|closefrom|& \pageref{Dclosefrom}&
+ Закрывает файл, открытый {\tt readfrom}\\\hline
+%% Close a file opened by {\tt readfrom}\\\hline
+\pl\tt \verb|cutdraw|& \pageref{Dctdraw}&
+ Рисовать с butt-концом\\\hline
+%% Draw with butt end caps\\\hline
+\tt \verb|dashed|& \pageref{Ddashed}&
+ Применять образец пунктира в команде рисования\\\hline
+%% Apply dash pattern to drawing command\\\hline
+\pl\tt \verb|draw|& \pageref{curves}&
+ Рисовать линию или картинку\\\hline
+%% Draw a line or a picture\\\hline
+\pl\tt \verb|drawarrow|& \pageref{Ddrwarr}&
+ Рисовать линию со стрелкой на конце\\\hline
+%% Draw a line with an arrowhead at the end\\\hline
+\pl\tt \verb|drawdblarrow|& \pageref{Ddrwdar}&
+ Рисовать линию со стрелками в обоих концах\\\hline
+%% Draw a line with arrowheads at both ends\\\hline
+\tt \verb|filenametemplate|& \pageref{Dfilenametemplate}&
+ Установить шаблон имени выходного файла\\\hline
+%% Set output file name pattern\\\hline
+\pl\tt \verb|fill|& \pageref{Dfill}&
+ Заполнить циклический путь\\\hline
+%% Fill inside a cyclic path\\\hline
+\pl\tt \verb|filldraw|& \pageref{Dfildrw}&
+ Рисовать циклический путь и заполнить его внутри\\\hline
+%% Draw a cyclic path and fill inside it\\\hline
+\tt \verb|interim|& \pageref{Dinterm}&
+ Сделать локальное изменение внутренней переменной\\\hline
+%% Make a local change to an internal variable\\\hline
+\tt \verb|let|& --&
+ Назначить символическому знаку значение другого знака\\\hline
+%% Assign one symbolic token the meaning of another\\\hline
+\pl\tt \verb|loggingall|& \pageref{Dlogall}&
+ Включить трассировку (только для файла-журнала)\\\hline
+%% Turn on all tracing (log file only)\\\hline
+\tt \verb|newinternal|& \pageref{Dnewint}&
+ Объявить новые внутренние переменные\\\hline
+%% Declare new internal variables\\\hline
+\pl\tt \verb|pickup|& \pageref{Dpickup}&
+ Указать новое перо для рисования линии\\\hline
+%% Specify new pen for line drawing\\\hline
+\tt \verb|save|& \pageref{Dsave}&
+ Делает переменные локальными\\\hline
+%% Make variables local\\\hline
+\tt \verb|setbounds|& \pageref{Dsetbnd}&
+ Устанавливает охватывающую рамку для картинки\\\hline
+%% Make a picture lie about its bounding box\\\hline
+\tt \verb|shipout|& \pageref{Dship}&
+ Низкоуровневая команда печати рисунка\\\hline
+%% Low-level command to output a figure\\\hline
+\tt \verb|show|& \pageref{Dshow}&
+ Печать выражений в символической форме\\\hline
+%% print out expressions symbolically\\\hline
+\tt \verb|showdependencies|& \pageref{Dshdep}&
+ Печать всех нерешенных уравнений\\\hline
+%% print out all unsolved equations\\\hline
+\tt \verb|showtoken|& \pageref{Dshtok}&
+ Печать информации по знаку\\\hline
+%% print an explanation of what a token is\\\hline
+\tt \verb|showvariable|& \pageref{Dshvar}&
+ Печать переменных в символьной форме\\\hline
+%% print variables symbolically\\\hline
+\tt \verb|special|& \pageref{Dspecl}&
+ Печать строки прямо в PostScript-файл вывода\\\hline
+%% print a string directly in the PostScript output file\\\hline
+\pl\tt \verb|tracingall|& \pageref{Dtall}&
+ Включить трассировку\\\hline
+%% Turn on all tracing\\\hline
+\pl\tt \verb|tracingnone|& \pageref{Dtnone}&
+ Отключить трассировку\\\hline
+%% Turn off all tracing\\\hline
+\pl\tt \verb|undraw|& \pageref{Dundraw}&
+ Стереть линию или рисунок\\\hline
+%% Erase a line or a picture\\\hline
+\pl\tt \verb|unfill|& \pageref{Dunfill}&
+ Стереть внутри замкнутого пути\\\hline
+%% Erase inside a cyclic path\\\hline
+\pl\tt \verb|unfilldraw|& \pageref{Dunfdrw}&
+ Стереть циклический путь и все внутри него\\\hline
+%% Erase a cyclic path and its inside\\\hline
+\tt \verb|withcmykcolor|& \pageref{Dwithcmykcolor}&
+ Используй CMYK-цвет в команде рисования\\\hline
+% Apply CMYK color to drawing command\\\hline
+ \tt \verb|withcolor|& \pageref{Dwithcolor}&
+ Используй обычный цвет в команде рисования\\\hline
+% Apply generic color specification to drawing command\\\hline
+ \tt \verb|withgreyscale|& \pageref{Dwithgreyscale}&
+ Используй оттенок серого в команде рисования\\\hline
+% Apply greyscale color to drawing command\\\hline
+ \tt \verb|withoutcolor|& \pageref{Dwithoutcolor}&
+ Не используй спецификации цвета в команде рисования\\\hline
+% Don't apply any color specification to drawing command\\\hline
+ \tt \verb|withpen|& \pageref{sec.pens}&
+ Используй перо в команде рисования\\\hline
+% Apply pen to drawing operation\\\hline
+ \tt \verb|withpostscript|& \pageref{Dwithpost}&
+ Конец кода PostScript\\\hline
+% End raw PostScript code\\\hline
+ \tt \verb|withprescript|& \pageref{Dwithpre}&
+ Начало кода PostScript\\\hline
+% Begin raw PostScript code\\\hline
+ \tt \verb|withrgbcolor|& \pageref{Dwithrgbcolor}&
+ Используй RGB-цвет в команде рисования\\\hline
+% Apply RGB color to drawing command\\\hline
+\tt \verb|write to|& \pageref{Dwrite}&
+ Писать строку в файл\\\hline
+%% Write string to file\\\hline
+\end{tabular}
+$$
+\index{let?\texttt{let}}%
+\label{cmdtab}
+\end{table}
+
+
+\begin{table}[htp]
+\caption{Макросы, похожие на функции}
+%%\caption{Function-Like Macros}
+$$\begin{tabular}{|l|l|l|r|p{5.7cm}|}
+%%$$\begin{tabular}{|l|l|l|r|l|}
+\hline
+\multicolumn1{|c}{Имя}& \multicolumn1{|c}{Аргументы}&
+ \multicolumn1{|c}{Резу-т}& \multicolumn1{|c}{С.}&
+ \multicolumn1{|c|}{Объяснение}\\
+%%\multicolumn1{|c}{Name}& \multicolumn1{|c}{Arguments}&
+%% \multicolumn1{|c}{Result}& \multicolumn1{|c}{Page}&
+%% \multicolumn1{|c|}{Explanation}\\
+\hline
+\hline
+\bx\tt \verb|boxit|& \small суффикс, картинка& --& \pageref{Dboxit}&
+%%\bx\tt \verb|boxit|& suffix, picture& --& \pageref{Dboxit}&
+ \small Задает рамку, содержащую картинку\\\hline
+%% Define a box containing the picture\\\hline
+\bx\tt \verb|boxit|& \small суффикс, строка& --& \pageref{Dsboxit}&
+%%\bx\tt \verb|boxit|& suffix, string& --& \pageref{Dsboxit}&
+ \small Определяет рамку, содержащую текст\\\hline
+%% Define a box containing text\\\hline
+\bx\tt \verb|boxit|& \small суффикс, \tdescr{пусто}& --& \pageref{Deboxit}&
+%%\bx\tt \verb|boxit|& suffix, \tdescr{empty}& --& \pageref{Deboxit}&
+ \small Определяет пустую рамку\\\hline
+%% Define an empty box\\\hline
+\bx\tt \verb|boxjoin|& \small уравнения& --& \pageref{Dbxjoin}&
+%%\bx\tt \verb|boxjoin|& equations& --& \pageref{Dbxjoin}&
+ \small Задает уравнения для соединяемых рамок\\\hline
+%% Give equations for connecting boxes\\\hline
+\bx\tt \verb|bpath|& \small суффикс& path& \pageref{Dbpath}&
+%%\bx\tt \verb|bpath|& suffix& path& \pageref{Dbpath}&
+ \small Охватывающий круг или прямоугольник\\\hline
+%% A box's bounding circle or rectangle\\\hline
+\pl\tt \verb|buildcycle|& \small список путей& path& \pageref{buildcy}&
+%%\pl\tt \verb|buildcycle|& list of paths& path& \pageref{buildcy}&
+ \small Строить замкнутый путь\\\hline
+%% Build a cyclic path\\\hline
+\bx\tt \verb|circleit|& \small суффикс, картинка& --& \pageref{Dcircit}&
+%%\bx\tt \verb|circleit|& suffix, picture& --& \pageref{Dcircit}&
+ \small Поместить картинку в круговую рамку\\\hline
+%% Put picture in a circular box\\\hline
+\bx\tt \verb|circleit|& \small суффикс, картинка& --& \pageref{Dcircit}&
+%%\bx\tt \verb|circleit|& suffix, picture&
+ \small Поместить строку в круговую рамку\\\hline
+%% Put a string in a circular box\\\hline
+\bx\tt \verb|circleit|& \small суффикс, \tdescr{пусто}& --& \pageref{Dcircit}&
+%%\bx\tt \verb|circleit|& suffix, \tdescr{empty}& --& \pageref{Dcircit}&
+ \small Определить пустую круговую рамку\\\hline
+%% Define an empty circular box\\\hline
+\pl\tt \verb|dashpattern|& \small расстояния вкл./выкл.& picture& \pageref{Ddshpat}&
+%%\pl\tt \verb|dashpattern|& on/off distances& picture& \pageref{Ddshpat}&
+ \small Создать образец пунктирных линий\\\hline
+%% Create a pattern for dashed lines\\\hline
+\pl\tt \verb|decr|& \small числовая переменная& numeric& \pageref{Dincr}&
+%%\pl\tt \verb|decr|& numeric variable& numeric& \pageref{Dincr}&
+ \small Уменьшить и возвратить новое значение\\\hline
+%% Decrement and return new value\\\hline
+\pl\tt \verb|dotlabel|& \small суффикс, картинка, пара& --& \pageref{Ddotlab}&
+%%\pl\tt \verb|dotlabel|& suffix, picture, pair& --& \pageref{Ddotlab}&
+ \small Нарисовать точку и рядом картинку\\\hline
+%% Mark point and draw picture nearby\\\hline
+\pl\tt \verb|dotlabel|& \small суффикс, строка, пара& --& \pageref{Ddotlab}&
+%%\pl\tt \verb|dotlabel|& suffix, string, pair& --& \pageref{Ddotlab}&
+ \small Отметить точку и поместить рядом текст\\\hline
+%% Mark point and place text nearby\\\hline
+\pl\tt \verb|dotlabels|& \small суффикс, номера точек& --& \pageref{Ddotlbs}&
+%%\pl\tt \verb|dotlabels|& suffix, point numbers& --& \pageref{Ddotlbs}&
+ \small Отметить точки {\tt z} их номерами\\\hline
+%% Mark {\tt z} points with their numbers\\\hline
+\bx\tt \verb|drawboxed|& \small список суффиксов& --& \pageref{Ddrbxed}&
+%%\bx\tt \verb|drawboxed|& list of suffixes& --& \pageref{Ddrbxed}&
+ \small Нарисовать именованные рамки и их содержимое\\\hline
+%% Draw the named boxes and their\\
+%%& & & &
+%% contents\\\hline
+\bx\tt \verb|drawboxes|& \small список суффиксов& --& \pageref{Ddrbxes}&
+%%\bx\tt \verb|drawboxes|& list of suffixes& --& \pageref{Ddrbxes}&
+ \small Нарисовать именованные рамки\\\hline
+%% Draw the named boxes\\\hline
+\pl\tt \verb|drawdot|& \small пара& --& \pageref{Ddrawdot}&
+%%\pl\tt \verb|drawdot|& pair& --& \pageref{Ddrawdot}&
+ \small Поставить точку в данном месте\\\hline
+%% Draw a dot at the given point\\\hline
+\pl\tt \verb|drawoptions|& \small опции рисования& --& \pageref{Ddropts}&
+%%\pl\tt \verb|drawoptions|& drawing options& --& \pageref{Ddropts}&
+ \small Установить опции для команд рисования\\\hline
+%% Set options for drawing commands\\\hline
+\bx\tt \verb|drawunboxed|& \small список суффиксов& --& \pageref{Ddrunbx}&
+%%\bx\tt \verb|drawunboxed|& list of suffixes& --& \pageref{Ddrunbx}&
+ \small Рисовать содержимое именованных рамок\\\hline
+%% Draw contents of named boxes\\\hline
+\bx\tt \verb|fixpos|& \small список суффиксов& --& \pageref{Dfixpos}&
+%%\bx\tt \verb|fixpos|& list of suffixes& --& \pageref{Dfixpos}&
+ \small Найти размер и позицию именованных рамок\\\hline
+%% Solve for the size and position of the\\
+%%& & & &
+%% named boxes\\\hline
+\bx\tt \verb|fixsize|& \small список суффиксов& --& \pageref{Dfixsiz}&
+%%\bx\tt \verb|fixsize|& list of suffixes& --& \pageref{Dfixsiz}&
+ \small Найти размер именованных рамок\\\hline
+%% Solve for size of named boxes\\\hline
+\pl\tt \verb|image|& \small строка& picture& \pageref{Dimage}&
+%%\pl\tt \verb|image|& string& picture& \pageref{Dimage}&
+ \small Возвращает рисунок из текста\\\hline
+%% Return picture from text\\\hline
+\pl\tt \verb|incr|& \small числовая переменная& numeric& \pageref{Dincr}&
+%%\pl\tt \verb|incr|& numeric variable& numeric& \pageref{Dincr}&
+ \small Увеличить и возвратить новое значение\\\hline
+%% Increment and return new value\\\hline
+\pl\tt \verb|label|& \small суффикс, картинка, пара& --& \pageref{Dlabel}&
+%%\pl\tt \verb|label|& suffix, picture, pair& --& \pageref{Dlabel}&
+ \small Изобразить рис. возле заданной точки\\\hline
+%% Draw picture near given point\\\hline
+\pl\tt \verb|label|& \small суффикс, строка, пара& --& \pageref{Dlabel}&
+%%\pl\tt \verb|label|& suffix, string, pair& --& \pageref{Dlabel}&
+ \small Поместить текст возле заданной точки\\\hline
+%% Place text near given point\\\hline
+\pl\tt \verb|labels|& \small суффикс, номера точек& --& \pageref{Dlabels}&
+%%\pl\tt \verb|labels|& suffix, point numbers& --& \pageref{Dlabels}&
+ \small Нарисовать числа пар {\tt z}, без точек\\\hline
+%% Draw {\tt z} point numbers; no dots\\\hline
+\pl\tt \verb|max|& \small список чисел& numeric& --&
+%%\pl\tt \verb|max|& list of numerics& numeric& --&
+ \small Найти максимум\\\hline
+%% Find the maximum\\\hline
+\pl\tt \verb|max|& \small список строк& string& --&
+%%\pl\tt \verb|max|& list of strings& string& --&
+ \small Найти словарно последнюю строку\\\hline
+%% Find the lexicographically last string\\\hline
+\pl\tt \verb|min|& \small список чисел& numeric& --&
+%%\pl\tt \verb|min|& list of numerics& numeric& --&
+ \small Найти минимум\\\hline
+%% Find the minimum\\\hline
+\pl\tt \verb|min|& \small список строк& string& --&
+%%\pl\tt \verb|min|& list of strings& string& --&
+ \small Найти словарно первую строку\\\hline
+%% Find the lexicographically first string\\\hline
+\bx\tt \verb|pic|& \small суффикс& picture& \pageref{Dpic}&
+%%\bx\tt \verb|pic|& suffix& picture& \pageref{Dpic}&
+ \small Содержимое рамки, сдвинутое в позицию\\\hline
+%% Box contents shifted into position\\\hline
+\pl\tt \verb|thelabel|& \small суффикс, картинка, пара& picture& \pageref{Dthelab}&
+%%\pl\tt \verb|thelabel|& suffix, picture, pair& picture& \pageref{Dthelab}&
+ \small Картинка, \small сдвинутая как для метки точки\\\hline
+%% Picture shifted as if to label a point\\\hline
+\pl\tt \verb|thelabel|& \small суффикс, строка, пара& picture& \pageref{Dthelab}&
+%%\pl\tt \verb|thelabel|& suffix, string, pair& picture& \pageref{Dthelab}&
+ \small Текст, размещенный как для метки точки\\\hline
+%% text positioned as if to label a point\\\hline
+\pl\tt \verb|z|& \small суффикс& pair& \pageref{Dzconv}&
+%%\pl\tt \verb|z|& suffix& pair& \pageref{Dzconv}&
+ \small Пара ${\tt x}\descr{суффикс},{\tt y}\descr{суффикс})$\\\hline
+%% The pair ${\tt x}\descr{suffix},{\tt y}\descr{suffix})$\\\hline
+\end{tabular}
+$$
+\index{min?\texttt{min}}\index{max?\texttt{max}}%
+\label{pseudotab}
+\end{table}
+
+\clearpage
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{атом} \rightarrow \descr{переменная} \;|\; \descr{аргумент}$\\
+%%$\tt \descr{atom} \rightarrow \descr{variable} \;|\; \descr{argument}$\\
+$\tt \qquad \;|\; \descr{число или дробь}$\\
+%%$\tt \qquad \;|\; \descr{number or fraction}$\\
+$\tt \qquad \;|\; \descr{внутренняя переменная}$\\
+%%$\tt \qquad \;|\; \descr{internal variable}$\\
+$\tt \qquad \;|\; \hbox{\tt (}\descr{выражение}\hbox{\tt )}$\\
+%%$\tt \qquad \;|\; \hbox{\tt (}\descr{expression}\hbox{\tt )}$\\
+$\tt \qquad \;|\; begingroup \descr{список команд} \descr{выражение} endgroup$\\
+%%$\tt \qquad \;|\; begingroup \descr{statement list} \descr{expression} endgroup$\\
+$\tt \qquad \;|\; \descr{оператор 0-уровня}$\\
+%%$\tt \qquad \;|\; \descr{nullary op}$\\
+$\tt \qquad \;|\; btex \descr{команды печати} etex$\\
+%%$\tt \qquad \;|\; btex \descr{typesetting commands} etex$\\
+$\tt \qquad \;|\; \descr{псевдофункция}$\\
+%%$\tt \qquad \;|\; \descr{pseudo function}$\\
+$\tt \descr{первичность} \rightarrow \descr{атом}$\\
+%%$\tt \descr{primary} \rightarrow \descr{atom}$\\
+$\tt \qquad \;|\; \hbox{\tt (}\descr{числовое выражение}\hbox{\tt ,} \descr{числовое выражение}\hbox{\tt )}$\\
+%%$\tt \qquad \;|\; \hbox{\tt (}\descr{numeric expression}\hbox{\tt ,} \descr{numeric expression}\hbox{\tt )}$\\
+$\tt \qquad \;|\; \hbox{\tt (}\descr{числовое выражение}\hbox{\tt ,} \descr{числовое выражение}\hbox{\tt ,} \descr{числовое выражение}\hbox{\tt )}$\\
+%%$\tt \qquad \;|\; \hbox{\tt (}\descr{numeric expression}\hbox{\tt ,} \descr{numeric expression}\hbox{\tt ,} \descr{numeric expression}\hbox{\tt )}$\\
+$\tt \qquad \;|\; \descr{of-оператор} \descr{выражение} of \descr{первичность}$\\
+%%$\tt \qquad \;|\; \descr{of operator} \descr{expression} of \descr{primary}$\\
+$\tt \qquad \;|\; \descr{унарный оператор} \descr{первичность}$\\
+%%$\tt \qquad \;|\; \descr{unary op} \descr{primary}$\\
+$\tt \qquad \;|\; str \descr{суффикс}$\\
+%%$\tt \qquad \;|\; str \descr{suffix}$\\
+$\tt \qquad \;|\; z \descr{суффикс}$\\
+%%$\tt \qquad \;|\; z \descr{suffix}$\\
+$\tt \qquad \;|\; \descr{числовой атом}\hbox{\tt [}\descr{выражение}\hbox{\tt ,}\descr{выражение}\hbox{\tt ]}$\\
+%%$\tt \qquad \;|\; \descr{numeric atom}\hbox{\tt [}\descr{expression}\hbox{\tt ,}\descr{expression}\hbox{\tt ]}$\\
+$\tt \qquad \;|\; \descr{операция скалярного умножения} \descr{первичность}$\\
+%%$\tt \qquad \;|\; \descr{scalar multiplication op} \descr{primary}$\\
+$\tt \descr{вторичность} \rightarrow \descr{первичность}$\\
+%%$\tt \descr{secondary} \rightarrow \descr{primary}$\\
+$\tt \qquad \;|\; \descr{вторичность} \descr{первичный бинарный оператор} \descr{первичность}$\\
+%%$\tt \qquad \;|\; \descr{secondary} \descr{primary binop} \descr{primary}$\\
+$\tt \qquad \;|\; \descr{вторичность} \descr{трансформация}$\\
+%%$\tt \qquad \;|\; \descr{secondary} \descr{transformer}$\\
+$\tt \descr{третичность} \rightarrow \descr{вторичность}$\\
+%%$\tt \descr{tertiary} \rightarrow \descr{secondary}$\\
+$\tt \qquad \;|\; \descr{третичность} \descr{вторичный бинарный оператор} \descr{вторичность}$\\
+%%$\tt \qquad \;|\; \descr{tertiary} \descr{secondary binop} \descr{secondary}$\\
+$\tt \descr{подвыражение} \rightarrow \descr{третичность}$\\
+%%$\tt \descr{subexpression} \rightarrow \descr{tertiary}$\\
+$\tt \qquad \;|\; \descr{выражение-путь} \descr{соединение путей} \descr{узел пути}$\\
+%%$\tt \qquad \;|\; \descr{path expression} \descr{path join} \descr{path knot}$\\
+$\tt \descr{выражение} \rightarrow \descr{подвыражение}$\\
+%%$\tt \descr{expression} \rightarrow \descr{subexpression}$\\
+$\tt \qquad \;|\; \descr{выражение} \descr{третичный бинарный оператор} \descr{третичность}$\\
+%%$\tt \qquad \;|\; \descr{expression} \descr{tertiary binop} \descr{tertiary}$\\
+$\tt \qquad \;|\; \descr{подвыражение пути} \descr{указатель направления}$\\
+%%$\tt \qquad \;|\; \descr{path subexpression} \descr{direction specifier}$\\
+$\tt \qquad \;|\; \descr{подвыражение пути} \descr{соединение путей} cycle$\\
+%%$\tt \qquad \;|\; \descr{path subexpression} \descr{path join} cycle$\\
+$\tt $\\
+%%$\tt $\\
+$\tt \descr{узел пути} \rightarrow \descr{третичность}$\\
+%%$\tt \descr{path knot} \rightarrow \descr{tertiary}$\\
+$\tt \descr{соединение путей} \rightarrow -{}-$\\
+%%$\tt \descr{path join} \rightarrow --$\\
+$\tt \qquad \;|\; \descr{указатель направления} \descr{базовое соединение путей} \descr{указатель направления}$\\
+%%$\tt \qquad \;|\; \descr{direction specifier} \descr{basic path join} \descr{direction specifier}$\\
+$\tt \descr{указатель направления} \rightarrow \descr{пусто}$\\
+%%$\tt \descr{direction specifier} \rightarrow \descr{empty}$\\
+$\tt \qquad \;|\; \{{curl \descr{числовое выражение}\}}$\\
+%%$\tt \qquad \;|\; \char`\{curl \descr{numeric expression}\char`\}$\\
+$\tt \qquad \;|\; \{{\descr{выражение-пара}\}}$\\
+%%$\tt \qquad \;|\; \char`\{\descr{pair expression}\char`\}$\\
+$\tt \qquad \;|\; \{{\descr{числовое выражение}\hbox{\tt ,}\descr{числовое выражение}\}}$\\
+%%$\tt \qquad \;|\; \char`\{\descr{numeric expression}\hbox{\tt ,}\descr{numeric expression}\char`\}$\\
+$\tt \descr{базовое соединение путей} \rightarrow \hbox{\tt ..} \;|\; \hbox{\tt ...} \;|\; \hbox{\tt ..}\descr{напряжение}\hbox{\tt ..} \;|\; \hbox{\tt ..}\descr{управление}\hbox{\tt ..}$\\
+%%$\tt \descr{basic path join} \rightarrow \hbox{\tt ..} \;|\; \hbox{\tt ...} \;|\; \hbox{\tt ..}\descr{tension}\hbox{\tt ..} \;|\; \hbox{\tt ..}\descr{controls}\hbox{\tt ..}$\\
+$\tt \descr{напряжение} \rightarrow tension \descr{числовая первичность}$\\
+%%$\tt \descr{tension} \rightarrow tension \descr{numeric primary}$\\
+$\tt \qquad \;|\; tension \descr{числовая первичность} and \descr{числовая первичность}$\\
+%%$\tt \qquad \;|\; tension \descr{numeric primary} and \descr{numeric primary}$\\
+$\tt \descr{управление} \rightarrow controls \descr{первичность-пара}$\\
+%%$\tt \descr{controls} \rightarrow controls \descr{pair primary}$\\
+$\tt \qquad \;|\; controls \descr{первичность-пара} and \descr{первичность-пара}$\\
+%%$\tt \qquad \;|\; controls \descr{pair primary} and \descr{pair primary}$\\
+$\tt $\\
+%%$\tt $\\
+$\tt \descr{аргумент} \rightarrow \descr{символически знак}$\\
+%%$\tt \descr{argument} \rightarrow \descr{symbolic token}$\\
+$\tt \descr{число или дробь} \rightarrow \descr{число}\hbox{\tt /}\descr{число}$\\
+%%$\tt \descr{number or fraction} \rightarrow \descr{number}\hbox{\tt /}\descr{number}$\\
+$\tt \qquad \;|\; \descr{число, за которым нет `\hbox{\tt /}\tdescr{число}'}$\\
+%%$\tt \qquad \;|\; \descr{number not followed by `\hbox{\tt /}\tdescr{number}'}$\\
+$\tt \descr{операция скалярного умножения} \rightarrow + \;|\; -$\\
+%%$\tt \descr{scalar multiplication op} \rightarrow + \;|\; -$\\
+$\tt \qquad \;|\; \descr{`\tdescr{число или дробь}', за которым нет `\tdescr{операции сложения}\tdescr{число}'}$
+%%$\tt \qquad \;|\; \descr{`\tdescr{number or fraction}' not followed by `\tdescr{add op}\tdescr{number}'}$
+\end{ctabbing}
+\caption{Часть 1 синтаксиса выражений}
+%%\caption{Part 1 of the syntax for expressions}
+\index{выражение?\tdescr{выражение}}\index{оператор 0?\tdescr{оператор 0-уровня}}\index{of operator?\tdescr{of-оператор}}%
+\index{узел пути?\tdescr{узел пути}}\index{первичность?\tdescr{первичность}}\index{первичный binop?\tdescr{первичный бинарный оператор}}%
+\index{вторичность?\tdescr{вторичность}}\index{вторичный binop?\tdescr{вторичный бинарный оператор}}\index{суффикс?\tdescr{суффикс}}%
+\index{третичность?\tdescr{третичность}}\index{третичный binop?\tdescr{третичный бинарный оператор}}\index{унарный op?\tdescr{унарный оператор}}%
+%%\index{expression?\tdescr{expression}}\index{nullary op?\tdescr{nullary op}}\index{of operator?\tdescr{of operator}}%
+%%\index{path knot?\tdescr{path knot}}\index{primary?\tdescr{primary}}\index{primary binop?\tdescr{primary binop}}%
+%%\index{secondary?\tdescr{secondary}}\index{secondary binop?\tdescr{secondary binop}}\index{suffix?\tdescr{suffix}}%
+%%\index{tertiary?\tdescr{tertiary}}\index{tertiary binop?\tdescr{tertiary binop}}\index{unary op?\tdescr{unary op}}%
+\label{syexpr1}
+\end{figure}
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{трансформация} \rightarrow rotated \descr{числовая первичность}$\\
+%%$\tt \descr{transformer} \rightarrow rotated \descr{numeric primary}$\\
+$\tt \qquad \;|\; scaled \descr{числовая первичность}$\\
+%%$\tt \qquad \;|\; scaled \descr{numeric primary}$\\
+$\tt \qquad \;|\; shifted \descr{первичность-пара}$\\
+%%$\tt \qquad \;|\; shifted \descr{pair primary}$\\
+$\tt \qquad \;|\; slanted \descr{числовая первичность}$\\
+%%$\tt \qquad \;|\; slanted \descr{numeric primary}$\\
+$\tt \qquad \;|\; transformed \descr{трансформация-первичность}$\\
+%%$\tt \qquad \;|\; transformed \descr{transform primary}$\\
+$\tt \qquad \;|\; xscaled \descr{числовая первичность}$\\
+%%$\tt \qquad \;|\; xscaled \descr{numeric primary}$\\
+$\tt \qquad \;|\; yscaled \descr{числовая первичность}$\\
+%%$\tt \qquad \;|\; yscaled \descr{numeric primary}$\\
+$\tt \qquad \;|\; zscaled \descr{первичность-пара}$\\
+%%$\tt \qquad \;|\; zscaled \descr{pair primary}$\\
+$\tt \qquad \;|\; reflectedabout\hbox{\tt (}\descr{выражение-пара}\hbox{\tt ,} \descr{выражение-пара}\hbox{\tt )}$\\
+%%$\tt \qquad \;|\; reflectedabout\hbox{\tt (}\descr{pair expression}\hbox{\tt ,} \descr{pair expression}\hbox{\tt )}$\\
+$\tt \qquad \;|\; rotatedaround\hbox{\tt (}\descr{выражение-пара}\hbox{\tt ,} \descr{выражение-пара}\hbox{\tt )}$\\
+%%$\tt \qquad \;|\; rotatedaround\hbox{\tt (}\descr{pair expression}\hbox{\tt ,} \descr{numeric expression}\hbox{\tt )}$\\
+$\tt $\\
+%%$\tt $\\
+$\tt \descr{оператор 0-уровня} \rightarrow false \;|\; normaldeviate \;|\; nullpen \;|\; nullpicture \;|\; pencircle$\\
+%%$\tt \descr{nullary op} \rightarrow false \;|\; normaldeviate \;|\; nullpen \;|\; nullpicture \;|\; pencircle$\\
+$\tt \qquad \;|\; true \;|\; whatever$\\
+$\tt \descr{унарный оператор} \rightarrow \descr{тип}$\\
+%%$\tt \descr{unary op} \rightarrow \descr{type}$\\
+$\tt \qquad \;|\; abs \;|\; angle \;|\; arclength \;|\; ASCII \;|\; bbox \;|\; blackpart \;|\; bluepart \;|\; bot \;|\; bounded$\\
+$\tt \qquad \;|\; ceiling \;|\; center \;|\; char \;|\; clipped \;|\; colormodel \;|\; cosd \;|\; cyanpart \;|\; cycle$\\
+$\tt \qquad \;|\; dashpart \;|\; decimal \;|\; dir \;|\; floor \;|\; filled \;|\; fontpart \;|\; fontsize$\\
+$\tt \qquad \;|\; greenpart \;|\; greypart \;|\; hex \;|\; inverse \;|\; known \;|\; length \;|\; lft \;|\; llcorner$\\
+$\tt \qquad \;|\; lrcorner\;|\; magentapart \;|\; makepath \;|\; makepen \;|\; mexp \;|\; mlog \;|\; not \;|\; oct \;|\; odd$\\
+$\tt \qquad \;|\; pathpart \;|\; penpart \;|\; readfrom \;|\; redpart \;|\; reverse \;|\; round \;|\; rt \;|\; sind \;|\; sqrt$\\
+$\tt \qquad \;|\; stroked \;|\; textpart \;|\; textual \;|\; top \;|\; ulcorner$\\
+$\tt \qquad \;|\; uniformdeviate \;|\; unitvector \;|\; unknown \;|\; urcorner \;|\; xpart \;|\; xxpart$\\
+$\tt \qquad \;|\; xypart \;|\; yellowpart \;|\; ypart \;|\; yxpart \;|\; yypart$\\
+$\tt \descr{тип} \rightarrow boolean \;|\; cmykcolor \;|\; color \;|\; numeric \;|\; pair$\\
+%%$\tt \descr{type} \rightarrow boolean \;|\; cmykcolor \;|\; color \;|\; numeric \;|\; pair$\\
+$\tt \qquad \;|\; path \;|\; pen \;|\; picture \;|\; rgbcolor \;|\; string \;|\; transform$\\
+$\tt \descr{первичный бинарный оператор} \rightarrow \hbox{\tt *} \;|\; \hbox{\tt /} \;|\; \hbox{\tt **} \;|\; and$\\
+%%$\tt \descr{primary binop} \rightarrow \hbox{\tt *} \;|\; \hbox{\tt /} \;|\; \hbox{\tt **} \;|\; and$\\
+$\tt \qquad \;|\; dotprod \;|\; div \;|\; infont \;|\; mod$\\
+$\tt \descr{вторичный бинарный оператор} \rightarrow + \;|\; - \;|\; ++ \;|\; +-+ \;|\; or$\\
+%%$\tt \descr{secondary binop} \rightarrow + \;|\; - \;|\; ++ \;|\; +-+ \;|\; or$\\
+$\tt \qquad \;|\; intersectionpoint \;|\; intersectiontimes$\\
+$\tt \descr{третичный бинарный оператор} \rightarrow \hbox{\tt \&} \;|\; \hbox{\verb|<|} \;|\; \hbox{\verb|<=|} \;|\; \hbox{\verb|<>|} \;|\; \hbox{\tt =} \;|\; \hbox{\verb|>|} \;|\; \hbox{\verb|>=|}$\\
+%%$\tt \descr{tertiary binop} \rightarrow \hbox{\tt \&} \;|\; \hbox{\verb|<|} \;|\; \hbox{\verb|<=|} \;|\; \hbox{\verb|<>|} \;|\; \hbox{\tt =} \;|\; \hbox{\verb|>|} \;|\; \hbox{\verb|>=|}$\\
+$\tt \qquad \;|\; cutafter \;|\; cutbefore$\\
+$\tt \descr{of-оператор} \rightarrow arctime \;|\; direction \;|\; directiontime \;|\; directionpoint$\\
+%%$\tt \descr{of operator} \rightarrow arctime \;|\; direction \;|\; directiontime \;|\; directionpoint$\\
+$\tt \qquad \;|\; penoffset \;|\; point \;|\; postcontrol \;|\; precontrol \;|\; subpath$\\
+$\tt \qquad \;|\; substring$\\
+$\tt $\\
+$\tt \descr{переменная} \rightarrow \descr{этикетка}\descr{суффикс}$\\
+%%$\tt \descr{variable} \rightarrow \descr{tag}\descr{suffix}$\\
+$\tt \descr{суффикс} \rightarrow \descr{пусто} \;|\; \descr{суффикс}\descr{индекс} \;|\; \descr{суффикс}\descr{этикетка}$\\
+%%$\tt \descr{suffix} \rightarrow \descr{empty} \;|\; \descr{suffix}\descr{subscript} \;|\; \descr{suffix}\descr{tag}$\\
+$\tt \qquad \;|\; \descr{параметр-суффикс}$\\
+%%$\tt \qquad \;|\; \descr{suffix parameter}$\\
+$\tt \descr{индекс} \rightarrow \descr{число} \;|\; \hbox{\tt [}\descr{числовое выражение}\hbox{\tt ]}$\\
+%%$\tt \descr{subscript} \rightarrow \descr{number} \;|\; \hbox{\tt [}\descr{numeric expression}\hbox{\tt ]}$\\
+$\tt $\\
+%%$\tt $\\
+$\tt \descr{внутренняя переменная} \rightarrow ahangle \;|\; ahlength \;|\; bboxmargin$\\
+%%$\tt \descr{internal variable} \rightarrow ahangle \;|\; ahlength \;|\; bboxmargin$\\
+$\tt \qquad \;|\; charcode \;|\; day \;|\; defaultcolormodel \;|\; defaultpen \;|\; defaultscale$\\
+$\tt \qquad \;|\; labeloffset \;|\; linecap \;|\; linejoin \;|\; miterlimit \;|\; month$\\
+$\tt \qquad \;|\; pausing \;|\; prologues \;|\; showstopping \;|\; time \;|\; tracingoutput$\\
+$\tt \qquad \;|\; tracingcapsules \;|\; tracingchoices \;|\; tracingcommands$\\
+$\tt \qquad \;|\; tracingequations \;|\; tracinglostchars \;|\; tracingmacros$\\
+$\tt \qquad \;|\; tracingonline \;|\; tracingrestores \;|\; tracingspecs$\\
+$\tt \qquad \;|\; tracingstats \;|\; tracingtitles \;|\; truecorners$\\
+$\tt \qquad \;|\; warningcheck \;|\; year$\\
+$\tt \qquad \;|\; \descr{символический знак, определенный {\tt newinternal}}$
+%%$\tt \qquad \;|\; \descr{symbolic token defined by {\tt newinternal}}$
+\end{ctabbing}
+\caption{Часть 2 синтаксиса выражений}
+%%\caption{Part 2 of the syntax for expressions}
+\index{оператор 0?\tdescr{оператор 0-уровня}}\index{of operator?\tdescr{of-оператор}}\index{первичный binop?\tdescr{первичный бинарный оператор}}%
+\index{вторичный binop?\tdescr{вторичный бинарный оператор}}\index{индекс?\tdescr{индекс}}\index{суффикс?\tdescr{суффикс}}%
+\index{третичный binop?\tdescr{третичный бинарный оператор}}\index{унарный op?\tdescr{унарный оператор}}%
+%%\index{nullary op?\tdescr{nullary op}}\index{of operator?\tdescr{of operator}}\index{primary binop?\tdescr{primary binop}}%
+%%\index{secondary binop?\tdescr{secondary binop}}\index{subscript?\tdescr{subscript}}\index{suffix?\tdescr{suffix}}%
+%%\index{tertiary binop?\tdescr{tertiary binop}}\index{unary op?\tdescr{unary op}}%
+\label{syexpr2}
+\end{figure}
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{псевдофункция} \rightarrow min\hbox{\tt (}\descr{список выражений}\hbox{\tt )}$\\
+%%$\tt \descr{pseudo function} \rightarrow min\hbox{\tt (}\descr{expression list}\hbox{\tt )}$\\
+$\tt \qquad \;|\; max\hbox{\tt (}\descr{список выражений}\hbox{\tt )}$\\
+%%$\tt \qquad \;|\; max\hbox{\tt (}\descr{expression list}\hbox{\tt )}$\\
+$\tt \qquad \;|\; incr\hbox{\tt (}\descr{числовая переменная}\hbox{\tt )}$\\
+%%$\tt \qquad \;|\; incr\hbox{\tt (}\descr{numeric variable}\hbox{\tt )}$\\
+$\tt \qquad \;|\; decr\hbox{\tt (}\descr{числовая переменная}\hbox{\tt )}$\\
+%%$\tt \qquad \;|\; decr\hbox{\tt (}\descr{numeric variable}\hbox{\tt )}$\\
+$\tt \qquad \;|\; dashpattern\hbox{\tt (}\descr{список on\hbox{\tt /}off}\hbox{\tt )}$\\
+%%$\tt \qquad \;|\; dashpattern\hbox{\tt (}\descr{on\hbox{\tt /}off list}\hbox{\tt )}$\\
+$\tt \qquad \;|\; interpath\hbox{\tt (}\descr{числовое выражение}\hbox{\tt ,} \descr{выражение-путь}\hbox{\tt ,} \descr{выражение-путь}\hbox{\tt )}$\\
+%%$\tt \qquad \;|\; interpath\hbox{\tt (}\descr{numeric expression}\hbox{\tt ,} \descr{path expression}\hbox{\tt ,} \descr{path expression}\hbox{\tt )}$\\
+$\tt \qquad \;|\; buildcycle\hbox{\tt (}\descr{список выражений-путей}\hbox{\tt )}$\\
+%%$\tt \qquad \;|\; buildcycle\hbox{\tt (}\descr{path expression list}\hbox{\tt )}$\\
+$\tt \qquad \;|\; thelabel\descr{суффикс метки}\hbox{\tt (}\descr{выражение}\hbox{\tt ,} \descr{выражение-пара}\hbox{\tt )}$\\
+%%$\tt \qquad \;|\; thelabel\descr{label suffix}\hbox{\tt (}\descr{expression}\hbox{\tt ,} \descr{pair expression}\hbox{\tt )}$\\
+$\tt \descr{список выражений-путей} \rightarrow \descr{выражение-путь}$\\
+%%$\tt \descr{path expression list} \rightarrow \descr{path expression}$\\
+$\tt \qquad \;|\; \descr{список выражений-путей}\hbox{\tt ,} \descr{выражение-путь}$\\
+%%$\tt \qquad \;|\; \descr{path expression list}\hbox{\tt ,} \descr{path expression}$\\
+$\tt \descr{список on\hbox{\tt /}off} \rightarrow \descr{список on\hbox{\tt /}off}\descr{пункт on\hbox{\tt /}off} \;|\; \descr{пункт on\hbox{\tt /}off}$\\
+%%$\tt \descr{on\hbox{\tt /}off list} \rightarrow \descr{on\hbox{\tt /}off list}\descr{on\hbox{\tt /}off clause} \;|\; \descr{on\hbox{\tt /}off clause}$\\
+$\tt \descr{пункт on\hbox{\tt /}off} \rightarrow on \descr{числовая третичность} \;|\; off \descr{числовая третичность}$
+%%$\tt \descr{on\hbox{\tt /}off clause} \rightarrow on \descr{numeric tertiary} \;|\; off \descr{numeric tertiary}$
+\end{ctabbing}
+\caption{Синтаксис макросов, похожих на функции}
+%%\caption{The syntax for function-like macros}
+\index{label suffix?\tdescr{суффикс метки}}%
+%%\index{label suffix?\tdescr{label suffix}}%
+\label{sypseudo}
+\end{figure}
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{логическое выражение} \rightarrow \descr{выражение}$\\
+%%$\tt \descr{boolean expression} \rightarrow \descr{expression}$\\
+$\tt \descr{выражение-cmyk-цвет } \rightarrow \descr{выражение}$\\
+%%$\tt \descr{cmykcolor expression} \rightarrow \descr{expression}$\\
+$\tt \descr{выражение-цвет} \rightarrow \descr{выражение}$\\
+%%$\tt \descr{color expression} \rightarrow \descr{expression}$\\
+$\tt \descr{числовой атом} \rightarrow \descr{атом}$\\
+%%$\tt \descr{numeric atom} \rightarrow \descr{atom}$\\
+$\tt \descr{числовое выражение} \rightarrow \descr{выражение}$\\
+%%$\tt \descr{numeric expression} \rightarrow \descr{expression}$\\
+$\tt \descr{числовая первичность} \rightarrow \descr{первичность}$\\
+%%$\tt \descr{numeric primary} \rightarrow \descr{primary}$\\
+$\tt \descr{числовая третичность} \rightarrow \descr{третичность}$\\
+%%$\tt \descr{numeric tertiary} \rightarrow \descr{tertiary}$\\
+$\tt \descr{числовая переменная} \rightarrow \descr{переменная} \;|\; \descr{внутренняя переменная}$\\
+%%$\tt \descr{numeric variable} \rightarrow \descr{variable} \;|\; \descr{internal variable}$\\
+$\tt \descr{выражение-пара} \rightarrow \descr{выражение}$\\
+%%$\tt \descr{pair expression} \rightarrow \descr{expression}$\\
+$\tt \descr{пара-первичность} \rightarrow \descr{первичность}$\\
+%%$\tt \descr{pair primary} \rightarrow \descr{primary}$\\
+$\tt \descr{выражение-путь} \rightarrow \descr{выражение}$\\
+%%$\tt \descr{path expression} \rightarrow \descr{expression}$\\
+$\tt \descr{подвыражение-путь} \rightarrow \descr{подвыражение}$\\
+%%$\tt \descr{path subexpression} \rightarrow \descr{subexpression}$\\
+$\tt \descr{выражение-перо} \rightarrow \descr{выражение}$\\
+%%$\tt \descr{pen expression} \rightarrow \descr{expression}$\\
+$\tt \descr{выражение-картинка} \rightarrow \descr{выражение}$\\
+%%$\tt \descr{picture expression} \rightarrow \descr{expression}$\\
+$\tt \descr{переменная-картинка} \rightarrow \descr{переменная}$\\
+%%$\tt \descr{picture variable} \rightarrow \descr{variable}$\\
+$\tt \descr{выражение-rgb-цвет} \rightarrow \descr{выражение}$\\
+%%$\tt \descr{rgbcolor expression} \rightarrow \descr{expression}$\\
+$\tt \descr{строковое выражение} \rightarrow \descr{выражение}$\\
+%%$\tt \descr{string expression} \rightarrow \descr{expression}$\\
+$\tt \descr{параметр-суффикс} \rightarrow \descr{параметр}$\\
+%%$\tt \descr{suffix parameter} \rightarrow \descr{parameter}$\\
+$\tt \descr{трансформация-первичность} \rightarrow \descr{первичность}$
+%%$\tt \descr{transform primary} \rightarrow \descr{primary}$
+\end{ctabbing}
+\caption{Различные правила, нужные для завершения НФБН}
+%%\caption{Miscellaneous productions needed to complete the BNF}
+\label{sytypexpr}
+\end{figure}
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{программа} \rightarrow \descr{список метакоманд} end$\\
+%%$\tt \descr{program} \rightarrow \descr{statement list} end$\\
+$\tt \descr{список метакоманд} \rightarrow \descr{пусто} \;|\; \descr{список метакоманд} \hbox{\tt ;} \descr{метакоманда}$\\
+%%$\tt \descr{statement list} \rightarrow \descr{empty} \;|\; \descr{statement list} \hbox{\tt ;} \descr{statement}$\\
+$\tt \descr{метакоманда} \rightarrow \descr{пусто}$\\
+%%$\tt \descr{statement} \rightarrow \descr{empty}$\\
+$\tt \qquad \;|\; \descr{уравнение} \;|\; \descr{присваивание}$\\
+%%$\tt \qquad \;|\; \descr{equation} \;|\; \descr{assignment}$\\
+$\tt \qquad \;|\; \descr{декларация} \;|\; \descr{определение макроса}$\\
+%%$\tt \qquad \;|\; \descr{declaration} \;|\; \descr{macro definition}$\\
+$\tt \qquad \;|\; \descr{блок} \;|\; \descr{псевдопроцедура}$\\
+%%$\tt \qquad \;|\; \descr{compound} \;|\; \descr{pseudo procedure}$\\
+$\tt \qquad \;|\; \descr{команда}$\\
+%%$\tt \qquad \;|\; \descr{command}$\\
+$\tt \descr{блок} \rightarrow begingroup \descr{список метакоманд} endgroup$\\
+%%$\tt \descr{compound} \rightarrow begingroup \descr{statement list} endgroup$\\
+$\tt \qquad \;|\; beginfig\hbox{\tt (}\descr{числовое выражение}\hbox{\tt );} \descr{список метакоманд}\hbox{\tt ;} endfig$\\
+%%$\tt \qquad \;|\; beginfig\hbox{\tt (}\descr{numeric expression}\hbox{\tt );} \descr{statement list}\hbox{\tt ;} endfig$\\
+$\tt $\\
+%%$\tt $\\
+$\tt \descr{уравнение} \rightarrow \descr{выражение} \hbox{\tt =} \descr{правая часть}$\\
+%%$\tt \descr{equation} \rightarrow \descr{expression} \hbox{\tt =} \descr{right-hand side}$\\
+$\tt \descr{присваивание} \rightarrow \descr{переменная} \hbox{\tt :=} \descr{правая часть}$\\
+%%$\tt \descr{assignment} \rightarrow \descr{variable} \hbox{\tt :=} \descr{right-hand side}$\\
+$\tt \qquad \;|\; \descr{внутренняя переменная} \hbox{\tt :=} \descr{правая часть}$\\
+%%$\tt \qquad \;|\; \descr{internal variable} \hbox{\tt :=} \descr{right-hand side}$\\
+$\tt \descr{правая часть} \rightarrow \descr{выражение} \;|\; \descr{уравнение} \;|\; \descr{присваивание}$\\
+%%$\tt \descr{right-hand side} \rightarrow \descr{expression} \;|\; \descr{equation} \;|\; \descr{assignment}$\\
+$\tt $\\
+%%$\tt $\\
+$\tt \descr{декларация} \rightarrow \descr{тип} \descr{список декларации}$\\
+%%$\tt \descr{declaration} \rightarrow \descr{type} \descr{declaration list}$\\
+$\tt \descr{список декларации} \rightarrow \descr{обобщение переменной}$\\
+%%$\tt \descr{declaration list} \rightarrow \descr{generic variable}$\\
+$\tt \qquad \;|\; \descr{список декларации}\hbox{\tt ,} \descr{обобщение переменной}$\\
+%%$\tt \qquad \;|\; \descr{declaration list}\hbox{\tt ,} \descr{generic variable}$\\
+$\tt \descr{обобщение переменной} \rightarrow \descr{символический знак} \descr{обобщение суффикса}$\\
+%%$\tt \descr{generic variable} \rightarrow \descr{symbolic token} \descr{generic suffix}$\\
+$\tt \descr{обобщение суффикса} \rightarrow \descr{пусто} \;|\; \descr{обобщение суффикса} \descr{этикетка}$\\
+%%$\tt \descr{generic suffix} \rightarrow \descr{empty} \;|\; \descr{generic suffix} \descr{tag}$\\
+$\tt \qquad \;|\; \descr{обобщение суффикса} \hbox{\tt []}$\\
+%%$\tt \qquad \;|\; \descr{generic suffix} \hbox{\tt []}$\\
+$\tt $\\
+%%$\tt $\\
+$\tt \descr{определение макроса} \rightarrow \descr{заголовок макроса} \hbox{\tt =} \descr{текст замены} enddef$\\
+%%$\tt \descr{macro definition} \rightarrow \descr{macro heading} \hbox{\tt =} \descr{replacement text} enddef$\\
+$\tt \descr{заголовок макроса} \rightarrow def \descr{символический знак} \descr{отделенная часть} \descr{неотделенная часть}$\\
+%%$\tt \descr{macro heading} \rightarrow def \descr{symbolic token} \descr{delimited part} \descr{undelimited part}$\\
+$\tt \qquad \;|\; vardef \descr{обобщение переменной} \descr{отделенная часть} \descr{неотделенная часть}$\\
+%%$\tt \qquad \;|\; vardef \descr{generic variable} \descr{delimited part} \descr{undelimited part}$\\
+$\tt \qquad \;|\; vardef \descr{обобщение переменной} \hbox{\verb|@#|} \descr{отделенная часть} \descr{неотделенная часть}$\\
+%%$\tt \qquad \;|\; vardef \descr{generic variable} \hbox{\verb|@#|} \descr{delimited part} \descr{undelimited part}$\\
+$\tt \qquad \;|\; \descr{определение бинарности} \descr{параметр} \descr{символический знак} \descr{параметр}$\\
+%%$\tt \qquad \;|\; \descr{binary def} \descr{parameter} \descr{symbolic token} \descr{parameter}$\\
+$\tt \descr{отделенная часть} \rightarrow \descr{пусто}$\\
+%%$\tt \descr{delimited part} \rightarrow \descr{empty}$\\
+$\tt \qquad \;|\; \descr{отделенная часть}\hbox{\tt (}\descr{тип параметра} \descr{параметры-знаки}\hbox{\tt )}$\\
+%%$\tt \qquad \;|\; \descr{delimited part}\hbox{\tt (}\descr{parameter type} \descr{parameter tokens}\hbox{\tt )}$\\
+$\tt \descr{тип параметра} \rightarrow expr \;|\; suffix \;|\; text$\\
+%%$\tt \descr{parameter type} \rightarrow expr \;|\; suffix \;|\; text$\\
+$\tt \descr{параметры-знаки} \rightarrow \descr{параметр} \;|\; \descr{параметры-знаки}\hbox{\tt ,} \descr{параметр}$\\
+%%$\tt \descr{parameter tokens} \rightarrow \descr{parameter} \;|\; \descr{parameter tokens}\hbox{\tt ,} \descr{parameter}$\\
+$\tt \descr{параметр} \rightarrow \descr{символический знак}$\\
+%%$\tt \descr{parameter} \rightarrow \descr{symbolic token}$\\
+$\tt \descr{неотделенная часть} \rightarrow \descr{пусто}$\\
+%%$\tt \descr{undelimited part} \rightarrow \descr{empty}$\\
+$\tt \qquad \;|\; \descr{тип параметра} \descr{параметр}$\\
+%%$\tt \qquad \;|\; \descr{parameter type} \descr{parameter}$\\
+$\tt \qquad \;|\; \descr{уровень приоритета} \descr{параметр}$\\
+%%$\tt \qquad \;|\; \descr{precedence level} \descr{parameter}$\\
+$\tt \qquad \;|\; expr \descr{параметр} of \descr{параметр}$\\
+%%$\tt \qquad \;|\; expr \descr{parameter} of \descr{parameter}$\\
+$\tt \descr{уровень приоритета} \rightarrow primary \;|\; secondary \;|\; tertiary$\\
+%%$\tt \descr{precedence level} \rightarrow primary \;|\; secondary \;|\; tertiary$\\
+$\tt \descr{определение бинарности} \rightarrow primarydef \;|\; secondarydef \;|\; tertiarydef$\\
+%%$\tt \descr{binary def} \rightarrow primarydef \;|\; secondarydef \;|\; tertiarydef$\\
+$\tt $\\
+%%$\tt $\\
+$\tt \descr{псевдопроцедура} \rightarrow drawoptions\hbox{\tt (}\descr{список опций}\hbox{\tt )}$\\
+%%$\tt \descr{pseudo procedure} \rightarrow drawoptions\hbox{\tt (}\descr{option list}\hbox{\tt )}$\\
+$\tt \qquad \;|\; label\descr{суффикс метки}\hbox{\tt (}\descr{выражение}\hbox{\tt ,} \descr{выражение-пара}\hbox{\tt )}$\\
+%%$\tt \qquad \;|\; label\descr{label suffix}\hbox{\tt (}\descr{expression}\hbox{\tt ,} \descr{pair expression}\hbox{\tt )}$\\
+$\tt \qquad \;|\; dotlabel\descr{суффикс метки}\hbox{\tt (}\descr{выражение}\hbox{\tt ,} \descr{выражение-пара}\hbox{\tt )}$\\
+%%$\tt \qquad \;|\; dotlabel\descr{label suffix}\hbox{\tt (}\descr{expression}\hbox{\tt ,} \descr{pair expression}\hbox{\tt )}$\\
+$\tt \qquad \;|\; labels\descr{суффикс метки}\hbox{\tt (}\descr{список номеров точек}\hbox{\tt )}$\\
+%%$\tt \qquad \;|\; labels\descr{label suffix}\hbox{\tt (}\descr{point number list}\hbox{\tt )}$\\
+$\tt \qquad \;|\; dotlabels\descr{суффикс метки}\hbox{\tt (}\descr{список номеров точек}\hbox{\tt )}$\\
+%%$\tt \qquad \;|\; dotlabels\descr{label suffix}\hbox{\tt (}\descr{point number list}\hbox{\tt )}$\\
+$\tt \descr{список номеров точек} \rightarrow \descr{суффикс} \;|\; \descr{список номеров точек}\hbox{\tt ,} \descr{суффикс}$\\
+%%$\tt \descr{point number list} \rightarrow \descr{suffix} \;|\; \descr{point number list}\hbox{\tt ,} \descr{suffix}$\\
+$\tt \descr{суффикс метки} \rightarrow \descr{пусто} \;|\; lft \;|\; rt \;|\; top \;|\; bot \;|\; ulft \;|\; urt \;|\; llft \;|\; lrt$
+%%$\tt \descr{label suffix} \rightarrow \descr{empty} \;|\; lft \;|\; rt \;|\; top \;|\; bot \;|\; ulft \;|\; urt \;|\; llft \;|\; lrt$
+\end{ctabbing}
+\caption{Полный синтаксис программ MetaPost}
+%%\caption{Overall syntax for MetaPost programs}
+\index{обобщенная переменная?\tdescr{обобщенная переменная}}\index{label suffix?\tdescr{суффикс метки}}\index{текст замены?\tdescr{текст замены}}%
+%%\index{suffix?\tdescr{суффикс}}%
+%%\index{generic variable?\tdescr{generic variable}}\index{label suffix?\tdescr{label suffix}}\index{replacement text?\tdescr{replacement text}}%
+%%\index{suffix?\tdescr{suffix}}%
+\label{syprog}
+\end{figure}
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{команда} \rightarrow clip \descr{переменная-картинка} to \descr{выражение-путь}$\\
+%%$\tt \descr{command} \rightarrow clip \descr{picture variable} to \descr{path expression}$\\
+$\tt \qquad \;|\; interim \descr{внутренняя переменная} \hbox{\tt :=} \descr{правая часть}$\\
+%%$\tt \qquad \;|\; interim \descr{internal variable} \hbox{\tt :=} \descr{right-hand side}$\\
+$\tt \qquad \;|\; let \descr{символический знак} \hbox{\tt =} \descr{символический знак}$\\
+%%$\tt \qquad \;|\; let \descr{symbolic token} \hbox{\tt =} \descr{symbolic token}$\\
+$\tt \qquad \;|\; newinternal \descr{список символических знаков}$\\
+%%$\tt \qquad \;|\; newinternal \descr{symbolic token list}$\\
+$\tt \qquad \;|\; pickup \descr{выражение}$\\
+%%$\tt \qquad \;|\; pickup \descr{expression}$\\
+$\tt \qquad \;|\; randomseed \hbox{\tt :=} \descr{числовое выражение}$\\
+%%$\tt \qquad \;|\; randomseed \hbox{\tt :=} \descr{numeric expression}$\\
+$\tt \qquad \;|\; save \descr{список символических знаков}$\\
+%%$\tt \qquad \;|\; save \descr{symbolic token list}$\\
+$\tt \qquad \;|\; setbounds \descr{переменная-картинка} to \descr{выражение-путь}$\\
+%%$\tt \qquad \;|\; setbounds \descr{picture variable} to \descr{path expression}$\\
+$\tt \qquad \;|\; shipout \descr{выражение-картинка}$\\
+%%$\tt \qquad \;|\; shipout \descr{picture expression}$\\
+$\tt \qquad \;|\; special \descr{строковое выражение}$\\
+%%$\tt \qquad \;|\; special \descr{string expression}$\\
+$\tt \qquad \;|\; write \descr{строковое выражение} to \descr{строковое выражение}$\\
+%%$\tt \qquad \;|\; write \descr{string expression} to \descr{string expression}$\\
+$\tt \qquad \;|\; \descr{команда addto}$\\
+%%$\tt \qquad \;|\; \descr{addto command}$\\
+$\tt \qquad \;|\; \descr{команда рисования}$\\
+%%$\tt \qquad \;|\; \descr{drawing command}$\\
+$\tt \qquad \;|\; \descr{команда метрики шрифта}$\\
+%%$\tt \qquad \;|\; \descr{font metric command}$\\
+$\tt \qquad \;|\; \descr{команда-сообщение}$\\
+%%$\tt \qquad \;|\; \descr{message command}$\\
+$\tt \qquad \;|\; \descr{команда show}$\\
+%%$\tt \qquad \;|\; \descr{show command}$\\
+$\tt \qquad \;|\; \descr{команда трассировки}$\\
+%%$\tt \qquad \;|\; \descr{tracing command}$\\
+$\tt $\\
+%%$\tt $\\
+$\tt \descr{команда show} \rightarrow show \descr{список выражений}$\\
+%%$\tt \descr{show command} \rightarrow show \descr{expression list}$\\
+$\tt \qquad \;|\; showvariable \descr{список символических знаков}$\\
+%%$\tt \qquad \;|\; showvariable \descr{symbolic token list}$\\
+$\tt \qquad \;|\; showtoken \descr{список символических знаков}$\\
+%%$\tt \qquad \;|\; showtoken \descr{symbolic token list}$\\
+$\tt \qquad \;|\; showdependencies$\\
+%%$\tt \qquad \;|\; showdependencies$\\
+$\tt $\\
+%%$\tt $\\
+$\tt \descr{список символических знаков} \rightarrow \descr{символический знак}$\\
+%%$\tt \descr{symbolic token list} \rightarrow \descr{symbolic token}$\\
+$\tt \qquad \;|\; \descr{символический знак}\hbox{\tt ,} \descr{список символических знаков}$\\
+%%$\tt \qquad \;|\; \descr{symbolic token}\hbox{\tt ,} \descr{symbolic token list}$\\
+$\tt \descr{список выражений} \rightarrow \descr{выражение} \;|\; \descr{список выражений}\hbox{\tt ,} \descr{выражение}$\\
+%%$\tt \descr{expression list} \rightarrow \descr{expression} \;|\; \descr{expression list}\hbox{\tt ,} \descr{expression}$\\
+$\tt $\\
+%%$\tt $\\
+$\tt \descr{команда addto} \rightarrow$\\
+%%$\tt \descr{addto command} \rightarrow$\\
+$\tt \qquad addto \descr{переменная-картинка} also \descr{выражение-картинка} \descr{список опций}$\\
+%%$\tt \qquad addto \descr{picture variable} also \descr{picture expression} \descr{option list}$\\
+$\tt \qquad \;|\; addto \descr{переменная-картинка} contour \descr{выражение-путь} \descr{список опций}$\\
+%%$\tt \qquad \;|\; addto \descr{picture variable} contour \descr{path expression} \descr{option list}$\\
+$\tt \qquad \;|\; addto \descr{переменная-картинка} doublepath \descr{выражение-путь} \descr{список опций}$\\
+%%$\tt \qquad \;|\; addto \descr{picture variable} doublepath \descr{path expression} \descr{option list}$\\
+$\tt \descr{список опций} \rightarrow \descr{пусто} \;|\; \descr{опция рисования} \descr{список опций}$\\
+%%$\tt \descr{option list} \rightarrow \descr{empty} \;|\; \descr{drawing option} \descr{option list}$\\
+$\tt \descr{опция рисования} \rightarrow withcolor \descr{выражение-цвет}$\\
+%%$\tt \descr{drawing option} \rightarrow withcolor \descr{color expression}$\\
+$\tt \qquad \;|\; withrgbcolor \descr{выражение-rgb-цвет} \;|\; withcmykcolor \descr{выражение-cmyk-цвет}$\\
+%%$\tt \qquad \;|\; withrgbcolor \descr{rgbcolor expression} \;|\; withcmykcolor \descr{cmykcolor expression}$\\
+$\tt \qquad \;|\; withgreyscale \descr{числовое выражение} \;|\; withoutcolor$\\
+%%$\tt \qquad \;|\; withgreyscale \descr{numeric expression} \;|\; withoutcolor$\\
+$\tt \qquad \;|\; withprescript \descr{строковое выражение} \;|\; withpostscript \descr{строковое выражение}$\\
+%%$\tt \qquad \;|\; withprescript \descr{string expression} \;|\; withpostscript \descr{string expression}$\\
+$\tt \qquad \;|\; withpen \descr{выражение-перо} \;|\; dashed \descr{выражение-картинка}$\\
+%%$\tt \qquad \;|\; withpen \descr{pen expression} \;|\; dashed \descr{picture expression}$\\
+$\tt $\\
+%%$\tt $\\
+$\tt \descr{команда рисования} \rightarrow draw \descr{выражение-картинка} \descr{список опций}$\\
+%%$\tt \descr{drawing command} \rightarrow draw \descr{picture expression} \descr{option list}$\\
+$\tt \qquad \;|\; \descr{тип заполнения} \descr{выражение-путь} \descr{список опций}$\\
+%%$\tt \qquad \;|\; \descr{fill type} \descr{path expression} \descr{option list}$\\
+$\tt \descr{тип заполнения} \rightarrow fill \;|\; draw \;|\; filldraw \;|\; unfill \;|\; undraw \;|\; unfilldraw$\\
+%%$\tt \descr{fill type} \rightarrow fill \;|\; draw \;|\; filldraw \;|\; unfill \;|\; undraw \;|\; unfilldraw$\\
+$\tt \qquad \;|\; drawarrow \;|\; drawdblarrow \;|\; cutdraw$\\
+%%$\tt \qquad \;|\; drawarrow \;|\; drawdblarrow \;|\; cutdraw$\\
+$\tt $\\
+%%$\tt $\\
+$\tt \descr{команда-сообщение} \rightarrow errhelp \descr{строковое выражение}$\\
+%%$\tt \descr{message command} \rightarrow errhelp \descr{string expression}$\\
+$\tt \qquad \;|\; errmessage \descr{строковое выражение}$\\
+%%$\tt \qquad \;|\; errmessage \descr{string expression}$\\
+$\tt \qquad \;|\; filenametemplate \descr{строковое выражение}$\\
+%%$\tt \qquad \;|\; filenametemplate \descr{string expression}$\\
+$\tt \qquad \;|\; message \descr{строковое выражение}$\\
+%%$\tt \qquad \;|\; message \descr{string expression}$\\
+$\tt $\\
+%%$\tt $\\
+$\tt \descr{команда трассировки} \rightarrow tracingall \;|\; loggingall \;|\; tracingnone$
+%%$\tt \descr{tracing command} \rightarrow tracingall \;|\; loggingall \;|\; tracingnone$
+\end{ctabbing}
+\caption{Синтаксис команд}
+%%\caption{The syntax for commands}
+\index{список опций?\tdescr{список опций}}\index{переменная-картинка?\tdescr{переменная-картинка}}%
+%%\index{option list?\tdescr{option list}}\index{picture variable?\tdescr{picture variable}}%
+\label{sycmds}
+
+% is this really true? in practice, in real implementations?
+%\bigskip
+%By the way, the default for \ttindex{randomseed} is, in effect,
+%$\textsl{day} + \textsl{time}*\epsilon$. Unfortunately, \textsl{time}
+%is in minutes.
+\end{figure}
+
+\begin{figure}[htp]
+\begin{ctabbing}
+$\tt \descr{проверка if} \rightarrow if \descr{логическое выражение} \hbox{\tt :} \descr{сбалансированные знаки} \descr{альтернативы} fi$\\
+%%$\tt \descr{if test} \rightarrow if \descr{boolean expression} \hbox{\tt :} \descr{balanced tokens} \descr{alternatives} fi$\\
+$\tt \descr{альтернативы} \rightarrow \descr{пусто}$\\
+%%$\tt \descr{alternatives} \rightarrow \descr{empty}$\\
+$\tt \qquad \;|\; else\hbox{\tt :} \descr{сбалансированные знаки}$\\
+%%$\tt \qquad \;|\; else\hbox{\tt :} \descr{balanced tokens}$\\
+$\tt \qquad \;|\; elseif \descr{логическое выражение} \hbox{\tt :} \descr{сбалансированные знаки} \descr{альтернативы}$\\
+%%$\tt \qquad \;|\; elseif \descr{boolean expression} \hbox{\tt :} \descr{balanced tokens} \descr{alternatives}$\\
+$\tt $\\
+$\tt \descr{цикл} \rightarrow \descr{заголовок цикла}\hbox{\tt :} \descr{тело цикла} endfor$\\
+%%$\tt \descr{loop} \rightarrow \descr{loop header}\hbox{\tt :} \descr{loop text} endfor$\\
+$\tt \descr{заголовок цикла} \rightarrow for \descr{символический знак} \hbox{\tt =} \descr{прогрессия}$\\
+%%$\tt \descr{loop header} \rightarrow for \descr{symbolic token} \hbox{\tt =} \descr{progression}$\\
+$\tt \qquad \;|\; for \descr{символический знак} \hbox{\tt =} \descr{список for}$\\
+%%$\tt \qquad \;|\; for \descr{symbolic token} \hbox{\tt =} \descr{for list}$\\
+$\tt \qquad \;|\; for \descr{символический знак} \hbox{\tt within} \descr{выражение-картинка}$\\
+%%$\tt \qquad \;|\; for \descr{symbolic token} \hbox{\tt within} \descr{picture expression}$\\
+$\tt \qquad \;|\; forsuffixes \descr{символический знак} \hbox{\tt =} \descr{список суффиксов}$\\
+%%$\tt \qquad \;|\; forsuffixes \descr{symbolic token} \hbox{\tt =} \descr{suffix list}$\\
+$\tt \qquad \;|\; forever$\\
+%%$\tt \qquad \;|\; forever$\\
+$\tt \descr{прогрессия} \rightarrow \descr{числовое выражение} upto \descr{числовое выражение}$\\
+%%$\tt \descr{progression} \rightarrow \descr{numeric expression} upto \descr{numeric expression}$\\
+$\tt \qquad \;|\; \descr{числовое выражение} downto \descr{числовое выражение}$\\
+%%$\tt \qquad \;|\; \descr{numeric expression} downto \descr{numeric expression}$\\
+$\tt \qquad \;|\; \descr{числовое выражение} step \descr{числовое выражение} until \descr{числовое выражение} $\\
+%%$\tt \qquad \;|\; \descr{numeric expression} step \descr{numeric expression} until \descr{numeric expression} $\\
+$\tt \descr{список for} \rightarrow \descr{выражение} \;|\; \descr{список for}\hbox{\tt ,} \descr{выражение}$\\
+%%$\tt \descr{for list} \rightarrow \descr{expression} \;|\; \descr{for list}\hbox{\tt ,} \descr{expression}$\\
+$\tt \descr{список суффиксов} \rightarrow \descr{суффикс} \;|\; \descr{список суффиксов}\hbox{\tt ,} \descr{суффикс}$
+%%$\tt \descr{suffix list} \rightarrow \descr{suffix} \;|\; \descr{suffix list}\hbox{\tt ,} \descr{suffix}$
+\end{ctabbing}
+\caption{Синтаксис для условий и циклов}
+%%\caption{The syntax for conditionals and loops}
+\index{сбалансированные знаки?\tdescr{сбалансированные знаки}}\index{суффикс?\tdescr{суффикс}}%
+%%\index{balanced tokens?\tdescr{balanced tokens}}\index{suffix?\tdescr{suffix}}%
+\label{sycondloop}
+\end{figure}
+
+\clearpage
+
+\let\topfraction=\svtopfrac % restore values from the start of this appendix
+\let\textfraction=\svtxtfrac
+\setcounter{topnumber}{\value{svtopnum}}
+\setcounter{totalnumber}{\value{svtotnum}}
+
+\section{MetaPost и \MF}
+%%\section{MetaPost Versus \MF}
+\label{MPvsMF}
+
+Из-за того, что языки \MF\index{metafont?\MF} и MetaPost имеют так много
+общего, пользователи-эксперты \MF\ возможно захотят пропустить большую
+часть объяснений из этого документа и сконцентрироваться на уникальных
+концепциях MetaPost.
+%%Since the \MF\index{metafont?\MF} and MetaPost languages have so much in
+%%common, expert users of \MF\ will want to skip most of the explanations
+%%in this document and concentrate on concepts that are unique to
+%%MetaPost.
+Сравнения в этом приложение приводятся для помощи экспертам, хорошо
+знакомым с {\sl The\ \MF book}, а также другим пользователям, что
+хотят получить пользу из более детальных объяснений работы Кнута \cite{kn:c}.
+%%The comparisons in this appendix are intended to help experts
+%%that are familiar with {\sl The\ \MF book} as well as other users that
+%%want to benefit from Knuth's more detailed explanations \cite{kn:c}.
+
+Вследствие того, что \MF\ предназначен для изготовления шрифтов \TeX,
+он имеет ряд примитивов для генерации
+{\tt tfm}\index{tfm file?{\tt tfm}-файл}\index{файлы!tfm?{\tt tfm}}-файлов,
+нужных \TeX\ для измерения
+символов, информации об отступах, лигатурах\index{лигатуры} и
+кернинге\index{кернинг}.
+%%Since \MF\ is intended for making \TeX\ fonts, it has a number of
+%%primitives for generating the {\tt tfm}\index{tfm file?{\tt tfm}
+%%file}\index{files!tfm?{\tt tfm}} files that \TeX\ needs for character
+%%dimensions, spacing information, ligatures\index{ligatures} and
+%%kerning\index{kerning}.
+MetaPost может также использоваться для генерации шрифтов и он
+также имеет примитивы \MF\ для создания {\tt tfm}-файлов.
+%%MetaPost can also be used for generating fonts,
+%%and it also has \MF's primitives for making {\tt tfm} files.
+Они перечисляются в таблице~\ref{tfmprim}.
+%%These are listed in Table~\ref{tfmprim}.
+Их объяснения могут быть найдены в документации \MF\ \cite{kn:c,kn:mf3}.
+%%Explanations can be found in the \MF\
+%%documentation \cite{kn:c,kn:mf3}.
+
+\begin{table}[htp]
+$$\begin{tabular}{|l|l|} \hline
+команды& {\tt charlist}, {\tt extensible},
+%%commands& {\tt charlist}, {\tt extensible},
+ {\tt fontdimen}, {\tt headerbyte} \\
+ & {\tt kern}, {\tt ligtable} \\ \hline
+операторы лигатурных& \verb!::!, \verb!=:!, \verb!=:|!, \verb!=:|>!,
+%%ligtable operators& \verb!::!, \verb!=:!, \verb!=:|!, \verb!=:|>!,
+ \verb!|=:!, \verb!|=:>!, \\
+таблиц& \verb!|=:|!, \verb!|=:|>!, \verb!|=:|>>!,
+%% & \verb!|=:|!, \verb!|=:|>!, \verb!|=:|>>!,
+ \verb!||:! \\ \hline
+внутренние переменные\index{внутренние переменные}\index{переменные!внутренние}&
+%%internal variables\index{internal variables}\index{variables!internal}&
+ {\tt boundarychar}, {\tt chardp},
+ {\tt charext}, {\tt charht}, \\
+ & {\tt charic}, {\tt charwd},
+ {\tt designsize}, {\tt fontmaking} \\ \hline
+другие операторы& {\tt charexists} \\ \hline
+%%other operators& {\tt charexists} \\ \hline
+\end{tabular}
+$$
+\caption{Примитивы MetaPost для создания {\tt tfm}-файлов.}
+%%\caption{MetaPost primitives for making {\tt tfm} files.}
+\label{tfmprim}
+\end{table}
+
+Даже хотя MetaPost имеет примитивы для генерации шрифтов, многие
+такие примитивы и внутренние переменные, которые входят в Plain
+\MF\index{metafont?\MF}, не определены в Plain MetaPost\index{макросы Plain}.
+%%Even though MetaPost has the primitives for generating fonts, many of
+%%the font-making primitives and internal variables that are part of Plain
+%%\MF\index{metafont?\MF} are not defined in Plain MetaPost\index{Plain
+%%macros}.
+Вместо этого имеется отдельный макропакет {\tt
+mfplain}\index{mfplain?\texttt{mfplain}}, определяющий макросы,
+требуемые для возможности обработать через MetaPost шрифты Computer Modern
+Кнута, --- они показаны в таблице~\ref{mfponly} \cite{kn:e}.
+%%Instead, there is a separate macro package called {\tt
+%%mfplain}\index{mfplain?\texttt{mfplain}} that defines the macros
+%%required to allow MetaPost to process Knuth's Computer Modern fonts as
+%%shown in Table~\ref{mfponly} \cite{kn:e}.
+Для загрузки этих макросов поставьте ``\verb|&mfplain|'' перед именем
+входного файла.
+%%To load these macros, put
+%%``\verb|&mfplain|'' before the name of the input file.
+Это может быть сделано по приглашению {\tt **} после вызова интерпретатора
+MetaPost без аргументов или в командной строке,
+например\footnote{Синтаксис командной строки зависит от системы. Кавычки нужны
+в большинстве систем Unix для защиты специальных символов, подобных {\tt\&}.},
+%%This can be done
+%%at the {\tt **} prompt after invoking the MetaPost interpreter with no
+%%arguments, or on a command line that looks something like
+%%this:\footnote{Command line syntax is system dependent. Quotes are
+%%needed on most Unix systems to protect special characters like
+%%{\tt\&}.}
+$$ \hbox{\verb|mpost '&mfplain' cmr10|} $$
+%%$$ \hbox{\verb|mpost '&mfplain' cmr10|} $$
+Командой, аналогичной \MF-команде
+%%The analog of a \MF\ command line like
+$$ \hbox{\verb|mf '\mode=lowres; mag=1.2; input cmr10'|,} $$
+%%$$ \hbox{\verb|mf '\mode=lowres; mag=1.2; input cmr10'|} $$
+будет
+%%is
+$$ \hbox{\verb|mpost '&mfplain \mode=lowres; mag=1.2; input cmr10'|} $$
+%%$$ \hbox{\verb|mpost '&mfplain \mode=lowres; mag=1.2; input cmr10'|} $$
+Результат --- это множество файлов PostScript\index{PostScript}, по одному
+на каждый символ шрифта.
+%%The result is a set of PostScript\index{PostScript} files, one for each
+%%character in the font.
+Потребуется некоторое редактирование для их соединения в загружаемый PostScript
+Type 3 шрифт~\cite{ad:red2}..
+%%Some editing would be required in order to
+%%merge them into a downloadable Type~3 PostScript font~\cite{ad:red2}.
+
+\begin{table}[htp]
+$$
+\renewcommand{\FancyVerbFormatLine}[1]{\hbox{#1}\strut}
+\begin{tabular}{|l|} \hline
+\multicolumn 1{|c|}
+{Определены в пакете {\tt mfplain}} \\ \hline
+%%{Defined in the {\tt mfplain} package} \\ \hline
+\begin{verbatim}
+beginchar font_identifier
+blacker font_normal_shrink
+capsule_def font_normal_space
+change_width font_normal_stretch
+define_blacker_pixels font_quad
+define_corrected_pixels font_size
+define_good_x_pixels font_slant
+define_good_y_pixels font_x_height
+define_horizontal_corrected_pixels italcorr
+define_pixels labelfont
+define_whole_blacker_pixels makebox
+define_whole_pixels makegrid
+define_whole_vertical_blacker_pixels maketicks
+define_whole_vertical_pixels mode_def
+endchar mode_setup
+extra_beginchar o_correction
+extra_endchar proofrule
+extra_setup proofrulethickness
+font_coding_scheme rulepen
+font_extra_space smode
+\end{verbatim}
+ \\ \hline
+\multicolumn 1{|c|}
+{Определены как пустые операции в пакете {\tt mfplain}}\\ \hline
+%%{Defined as no-ops in the {\tt mfplain} package}\\ \hline
+\begin{verbatim}
+cullit proofoffset
+currenttransform screenchars
+gfcorners screenrule
+grayfont screenstrokes
+hround showit
+imagerules slantfont
+lowres_fix titlefont
+nodisplays unitpixel
+notransforms vround
+openit
+\end{verbatim}
+ \\ \hline
+\end{tabular}
+\renewcommand{\FancyVerbFormatLine}[1]{#1}
+$$
+\caption{Макросы и внутренние переменные, определенные только в пакете {\tt mfplain}.}
+%%\caption{Macros and internal variables defined only in the {\tt mfplain}
+%%package.}
+\label{mfponly}
+\end{table}
+
+Другим ограничением пакета {\tt mfplain} является то, что определенные
+переменные из Plain \MF\index{metafont?\MF} не могут получить разумных
+определений в MetaPost.
+%%Another limitation of the {\tt mfplain} package is that certain internal
+%%variables from Plain \MF\index{metafont?\MF} cannot be given reasonable
+%%MetaPost definitions.
+Среди них {\tt displaying}, {\tt
+currentwindow}, \verb|screen_rows| и \verb|screen_cols|, которые зависят
+от способности \MF\ изображать рисунки на экране компьютера.
+%%These include {\tt displaying}, {\tt
+%%currentwindow}, \verb|screen_rows|, and \verb|screen_cols| which depend
+%%on \MF's ability to display images on the computer screen.
+Кроме того, \verb|pixels_per_inch| является неуместным из-за того, что MetaPost
+использует фиксированные единицы пунктов PostScript\index{PostScript!пункт}\index{пункт!PostScript}.
+%%In addition,
+%%\verb|pixels_per_inch| is irrelevant since MetaPost uses fixed units of
+%%PostScript\index{PostScript!point}\index{point!PostScript} points.
+
+Основания того, что некоторые макросы и внутренние переменные\index{внутренние
+переменные}\index{переменные!внутренние} ничего не значат в MetaPost в том,
+что примитивные команды \MF\ {\tt cull}, {\tt display}, {\tt
+openwindow}, {\tt numspecial} и {\tt totalweight} не реализованы в
+MetaPost.
+%%The reason why some macros and internal variables\index{internal
+%%variables}\index{variables!internal} are not meaningful in MetaPost is
+%%that \MF\ primitive commands {\tt cull}, {\tt display}, {\tt
+%%openwindow}, {\tt numspecial} and {\tt totalweight} are not implemented
+%%in MetaPost.
+Также не реализованы ряд внутренних переменных и
+\tdescr{опция рисования} {\tt withweight}.
+%%Also not implemented are a number of internal variables as
+%%well as the \tdescr{drawing option} {\tt withweight}.
+Далее следует полный список внутренних переменных, чьи примитивные
+\MF-значения не имеют смысла в MetaPost:
+%%Here is a
+%%complete listing of the internal variables whose primitive meanings in
+%%\MF\ do not make sense in MetaPost:
+$$\begin{verbatim}
+autorounding fillin proofing tracingpens xoffset
+chardx granularity smoothing turningcheck yoffset
+chardy hppp tracingedges vppp
+\end{verbatim}
+$$
+
+Есть еще примитив \MF, имеющий несколько иное значение в MetaPost.
+%%There is also one \MF\ primitive that has a slightly different meaning in
+%%MetaPost.
+Оба языка допускают команду в форме\index{special?\texttt{special}}\label{Dspecl}
+$$ {\tt special}\, \descr{строковое выражение} \hbox{\tt; }, $$
+но \MF\ копирует строку в свой выходной файл ``обобщенного шрифта'', тогда как
+MetaPost интерпретирует строку как последовательность команд PostScript\index{PostScript},
+которые помещаются в начало следующего выходного файла
+%%Both languages allow statements of the
+%%form\index{special?\texttt{special}}\label{Dspecl}
+%%$$ {\tt special}\, \descr{string expression} \hbox{\tt;} $$
+%%but \MF\ copies the string into its ``generic font'' output file, while
+%%MetaPost interprets the string as a sequence of PostScript\index{PostScript}
+%%commands that are to be placed at the beginning of the next output file.
+
+В этом рассмотрении стоит заметить, что линейки в материале \TeX,
+включаемом через {\tt btex..etex}, в MetaPost округляются до правильного
+числа пикселов, согласно правилам преобразования
+PostScript\index{PostScript!правила преобразования}~\cite{ad:red2}.
+%%In this regard, it is worth mentioning that rules in \TeX\ material
+%%included via {\tt btex..etex} in MetaPost are rounded to the correct
+%%number of pixels according to PostScript\index{PostScript!conversion rules}
+%%conversion rules~\cite{ad:red2}.
+В \MF линейки напрямую не генерируются, а просто включаются в
+special-команды и интерпретируются позже другими программами, такими
+как {\tt gftodvi}\index{gftodvi?\ttt{gftodvi}}, поэтому здесь нет
+никаких преобразований.
+%%In \MF, rules are not generated
+%%directly, but simply included in specials and interpreted later by
+%%other programs, such as {\tt gftodvi}\index{gftodvi?\ttt{gftodvi}},
+%%so there is no special conversion.
+
+Все другие различия между \MF\ и MetaPost --- это возможности, которые
+можно найти только в MetaPost.
+%%All the other differences between \MF\ and MetaPost are features found
+%%only in MetaPost.
+Они перечислены в таблице~\ref{mponly}.
+%%These are listed in Table~\ref{mponly}.
+Единственными командами, которые не обсуждались в предыдущих разделах и которые
+есть в этой таблице, являются
+\verb|extra_beginfig|\index{extra_beginfig?\texttt{extra\_beginfig}}\label{Dxbfig},
+\verb|extra_endfig|\index{extra_endfig?\texttt{extra\_endfig}}\label{Dxefig}
+и {\tt mpxbreak}.
+%%The only
+%%commands listed in this table that the preceding sections do not discuss
+%%are
+%%\verb|extra_beginfig|\index{extra_beginfig?\texttt{extra\_beginfig}}\label{Dxbfig},
+%%\verb|extra_endfig|\index{extra_endfig?\texttt{extra\_endfig}}\label{Dxefig},
+%%and {\tt mpxbreak}.
+Первые две --- это строки, содержащие дополнительные команды для обработки в
+соответственно {\tt
+beginfig}\index{beginfig?\texttt{beginfig}} и {\tt
+endfig}\index{endfig?\texttt{endfig}}, --- они подобны \verb|extra_beginchar| и
+\verb|extra_endchar|, обрабатываемым в {\tt beginchar} и {\tt endchar}.
+%%The first two are strings that contain extra
+%%commands to be processed by {\tt
+%%beginfig}\index{beginfig?\texttt{beginfig}} and {\tt
+%%endfig}\index{endfig?\texttt{endfig}} just as \verb|extra_beginchar| and
+%%\verb|extra_endchar| are processed by {\tt beginchar} and {\tt endchar}.
+Файл {\tt boxes.mp}\index{boxes.mp?\texttt{boxes.mp}} использует эти
+возможности.
+%%(The file {\tt boxes.mp}\index{boxes.mp?\texttt{boxes.mp}} uses these
+%%features).
+
+Другой новой возможностью, приведенной в таблице~\ref{mponly}, является
+{\tt mpxbreak}\index{mpxbreak?\texttt{mpxbreak}}.
+%%The other new feature listed in Table~\ref{mponly} not listed in the
+%%index is {\tt mpxbreak}\index{mpxbreak?\texttt{mpxbreak}}.
+Она используется для разделения блоков транслированных команд
+\TeX\index{TeX?\TeX} или troff\index{troff} в
+{\tt mpx}\index{файлы!mpx?{\tt mpx}}-файлах.
+%%This is used
+%%to separate blocks of translated \TeX\index{TeX?\TeX} or
+%%troff\index{troff} commands in {\tt mpx}\index{files!mpx?{\tt mpx}}
+%%files.
+Она не должна затрагивать пользователей, т.к. {\tt mpx}-файлы
+генерируются автоматически.
+%%It should be of no concern to users since {\tt mpx} files are
+%%generated automatically.
+
+\begin{table}
+\centering
+\begin{tabular}{|c|}\hline
+Примитивы MetaPost, отсутствующие в \MF\\\hline
+%%MetaPost primitives not found in \MF\\\hline
+\begin{minipage}[b]{.75\linewidth}\ttfamily
+\begin{multicols}{3}
+blackpart\\
+bluepart\\
+bounded\\
+btex\\
+clip\\
+clipped\\
+closefrom\\
+cmykcolor\\
+color\\
+colormodel\\
+cyanpart\\
+dashed\\
+dashpart\\
+defaultcolormodel\\
+etex\\
+filenametemplate\\
+filled\\
+fontmapfile\\
+fontmapline\\
+fontpart\\
+fontsize\\
+for within\\
+greenpart\\
+greypart\\
+infont\\
+linecap\\
+linejoin\\
+llcorner\\
+lrcorner\\
+magentapart\\
+miterlimit\\
+mpprocset\\
+mpxbreak\\
+pathpart\\
+penpart\\
+prologues\\
+readfrom\\
+redpart\\
+restoreclipcolor\\
+rgbcolor\\
+setbounds\\
+stroked\\
+textpart\\
+textual\\
+tracinglostchars\\
+troffmode\\
+truecorners\\
+ulcorner\\
+urcorner\\
+verbatimtex\\
+withcmykcolor\\
+withcolor\\
+withgreyscale\\
+withoutcolor\\
+withpostscript\\
+withprescript\\
+withrgbcolor\\
+write to\\
+yellowpart
+\end{multicols}
+\end{minipage}\\\hline
+
+Переменные и макросы, определенные только в Plain MetaPost\\\hline
+%%Variables and Macros defined only in Plain MetaPost\\\hline
+\begin{minipage}[b]{.75\linewidth}\ttfamily
+\begin{multicols}{3}
+ahangle\\
+ahlength\\
+background\\
+bbox\\
+bboxmargin\\
+beginfig\\
+beveled\\
+black\\
+blue\\
+buildcycle\\
+butt\\
+center\\
+cutafter\\
+cutbefore\\
+cuttings\\
+dashpattern\\
+defaultfont\\
+defaultpen\\
+defaultscale\\
+dotlabel\\
+dotlabels\\
+drawarrow\\
+drawdblarrow\\
+drawoptions\\
+endfig\\
+EOF\\
+evenly\\
+extra\_beginfig\\
+extra\_endfig\\
+green\\
+image\\
+label\\
+labeloffset\\
+mitered\\
+red\\
+rounded\\
+squared\\
+thelabel\\
+white
+\end{multicols}
+\end{minipage}\\\hline
+\end{tabular}
+\caption{Макросы и внутренние переменные, определенные только в MetaPost, --- их нет в \MF.}
+%%\caption{Macros and internal variables defined in MetaPost but not \MF.}
+\label{mponly}
+\end{table}
+
+
+\bibliographystyle{plain}
+\bibliography{mpman-ru}
+
+
+\printindex
+
+
+\end{document}
+
+% Copyright 1990 - 1995 by AT&T Bell Laboratories.
+% Updated 2006 by Taco Hoekwater, Karl Berry, and others.
+
+% Permission to use, copy, modify, and distribute this software
+% and its documentation for any purpose and without fee is hereby
+% granted, provided that the above copyright notice appear in all
+% copies and that both that the copyright notice and this
+% permission notice and warranty disclaimer appear in supporting
+% documentation, and that the names of AT&T Bell Laboratories or
+% any of its entities not be used in advertising or publicity
+% pertaining to distribution of the software without specific,
+% written prior permission.
+
+% AT&T disclaims all warranties with regard to this software,
+% including all implied warranties of merchantability and fitness.
+% In no event shall AT&T be liable for any special, indirect or
+% consequential damages or any damages whatsoever resulting from
+% loss of use, data or profits, whether in an action of contract,
+% negligence or other tortious action, arising out of or in
+% connection with the use or performance of this software.
+
+% In addition, John Hobby, the original author of MetaPost and this
+% manual, makes the following requests:
+% - I request that it remain clear that I am the author of
+% "A User's Manual for MetaPost" and "Drawing Graphs with MetaPost".
+% - I request to be consulted before significant changes are made.
diff --git a/Master/texmf-dist/doc/metapost/mpman-ru/mpman.ist b/Master/texmf-dist/doc/metapost/mpman-ru/mpman.ist
new file mode 100644
index 00000000000..9238679ce08
--- /dev/null
+++ b/Master/texmf-dist/doc/metapost/mpman-ru/mpman.ist
@@ -0,0 +1,4 @@
+% MakeIndex style file for MetaPost doc, by John Hobby. Public domain.
+
+% @ is a valid character in some entries
+actual '?' % ? instead of @