\listfiles \RequirePackage{ifpdf} \ifpdf \ifnum\pdftexversion<140 \else \pdfminorversion=5 \pdfobjcompresslevel=1% Use compressed object streams. \fi \RequirePackage{cmap} \fi \documentclass{article} % article is NOT the original style \usepackage[T1]{fontenc} \usepackage{lmodern} \usepackage{textcomp} \usepackage{mflogo} \usepackage{makeidx} \usepackage{fancyvrb} \usepackage{ctabbing} \RecustomVerbatimEnvironment{verbatim}{BVerbatim}{baseline=c} \usepackage{graphics} \usepackage[textwidth=6in,textheight=8.65in]{geometry} \usepackage{multicol} \usepackage{ltxtable} \newcommand\descr[1]{{\langle\hbox{\rm#1}\rangle}} \newcommand\invisgap{\nobreak\hskip0pt\relax} \newcommand\tdescr[1]{$\langle$\invisgap{\rm#1}\invisgap$\rangle$} \newcommand\Ignore[1]{} % For fooling delatex so spell will work \newcommand\mathcenter[1]{\vcenter{\hbox{#1}}} \makeindex \author{John D. Hobby} \title{Drawing Boxes with {MetaPost}} \date{} \newcommand\myabstract{% This paper describes a package for drawing boxes of different shapes. The \texttt{boxes} package has been implemented as an extension to the MetaPost graphics language and is a mandatory part of every MetaPost installation.} \newcommand\mykeywords{% typesetting; graphs; MetaPost} \usepackage[rgb,x11names]{xcolor}% Optimize for screen reading. \usepackage{hyperxmp} \usepackage{hyperref} \hypersetup{ pdftitle={Drawing Boxes with MetaPost}, pdfauthor={John D. Hobby and the MetaPost development team}, pdfkeywords={typesetting, boxes, MetaPost, TeX} } \hypersetup{ pdfstartview={XYZ null null null},% Zoom factor is determined by viewer. colorlinks, linkcolor=RoyalBlue3, urlcolor=Chocolate4, citecolor=SpringGreen3 } \usepackage[all]{hypcap} \ifpdf \pdfmapfile{=cm2lm.map}% replace CM by LM in figures \else \DeclareGraphicsExtensions{.mps} \DeclareGraphicsRule{mps}{eps}{*}{} \usepackage{breakurl} \fi \begin{document} \maketitle \begin{abstract} \myabstract \end{abstract} \ifx\keywords\undefined \else \begin{keywords} \mykeywords \end{keywords} \fi \setlength{\columnsep}{2.5em} \begin{multicols}{2} \tableofcontents \end{multicols} \section{Introduction} \label{intro} This document describes auxiliary macros not included in Plain MetaPost that make it convenient to do things that {\it pic} is good at \cite{ke:pic}. What follows is a description of how to use the macros contained in the file {\tt boxes.mp}\index{boxes.mp?\texttt{boxes.mp}}. 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. 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. The {\tt input} command looks first in the current directory and then in the special macro directory. Users interested in writing macros may want to look at the {\tt boxes.mp} file in this directory. 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}}, 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. \section{Rectangular Boxes} \label{rectbox} \mbox{}% Start paragraph. \index{variables!box|(}% \index{box variables|see{variables, box}}% % 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.} 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 )} $$ 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. For the command {\tt boxit.bb(pic)}, the box name is {\tt bb} and the contents of the box is the picture {\tt pic}. 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. 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. 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}. 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. If no such equations are given, macros such as {\tt drawboxed} can detect this and give default values. The default values for {\tt dx} and {\tt dy} variables are controlled by the internal variables\index{internal variables|see{variables, internal}}\index{variables!internal} {\tt defaultdx}\index{defaultdx?\texttt{defaultdx}}\label{Ddefaultdx} and {\tt defaultdy}\index{defaultdy?\texttt{defaultdy}}\label{Ddefaultdy}.% % \index{variables!box|)} \begin{figure}[htp] $$ \includegraphics{mpboxes-48.mps} $$ \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} If $b$ represents a box name, {\tt drawboxed($b$)} draws the rectangular boundary of box~$b$ and then the contents of the box. 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} $$ 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. 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$. Figure~\ref{fig49} shows a practical example including some arrows drawn with {\tt cutafter bpath} \tdescr{box name}. It is instructive to compare Figure~\ref{fig49} to the similar figure in the pic manual \cite{ke:pic}. 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. 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{mpboxes-49.mps}}} $$ \caption{MetaPost code and the corresponding figure} \label{fig49} \end{figure} For example, the second line of input for the above figure contains $$ \hbox{\tt boxjoin(a.se=b.sw; a.ne=b.nw)} $$ 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}. This yields $$ \hbox{\tt a.se=ni.sw; a.ne=ni.nw} $$ The next pair of boxes is box~{\tt ni} and box~{\tt di}. This time the implicitly generated equations are $$ \hbox{\tt ni.se=di.sw; ni.ne=di.nw} $$ This process continues until a new {\tt boxjoin}\index{boxjoin?\texttt{boxjoin}} is given. 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. 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. 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. 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}. 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. 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. 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. 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. 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. 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. 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. There is also a {\tt drawboxes}\index{drawboxes?\texttt{drawboxes}}\label{Ddrbxes} macro that draws just the bounding rectangles. 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}. This is like calling {\tt boxit} with an empty picture. 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. \section{Circular and Oval Boxes} \label{circbox} Circular and oval boxes are a lot like rectangular boxes except for the shape of the bounding path. 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}. \mbox{}% Start paragraph. \index{variables!box|(}% % 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. 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}. 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}.% % \index{variables!box|)} \begin{figure}[htp] $$ \includegraphics{mpboxes-50.mps} $$ \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} 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. 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{variables!internal} {\tt circmargin}\label{Dcmargin}. 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{mpboxes-51.mps}} $$ \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} \mbox{}% Start paragraph. \index{variables!box|(}% % A full example of {\tt circleit} boxes appears in Figure~\ref{fig52}. 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)|}. $$ 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. Otherwise, the macros select an oval big enough to contain the given picture with the safety margin {\tt circmargin}\index{circmargin?\texttt{circmargin}}.% % \index{variables!box|)} \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{mpboxes-52.mps}}} $$ \caption{MetaPost code and the corresponding figure} \label{fig52} \end{figure} \appendix \section{Reference manual} \label{refman} Tables~\ref{pseudotab} to~\ref{ivartab} summarize macros, box variables and internal variables provided by the \texttt{boxes} package. \begin{table}[hp] \centering \caption{\strut Function-Like Macros} \label{pseudotab} \begin{tabular}[t]{|>{\ttfamily}l|l|l|r|>{\arraybackslash}p{2.5in}|} \hline \multicolumn1{|c}{Name}& \multicolumn1{|c}{Arguments}& \multicolumn1{|c}{Result}& \multicolumn1{|c}{Page}& \multicolumn1{|c|}{Explanation}\\ \hline \hline boxit\index{boxit?\texttt{boxit}}& suffix, picture& --& \pageref{Dboxit}& Define a box containing the picture\\\hline boxit\index{boxit?\texttt{boxit}}& suffix, string& --& \pageref{Dsboxit}& Define a box containing text\\\hline boxit\index{boxit?\texttt{boxit}}& suffix, \tdescr{empty}& --& \pageref{Deboxit}& Define an empty box\\\hline boxjoin\index{boxjoin?\texttt{boxjoin}}& equations& --& \pageref{Dbxjoin}& Give equations for connecting boxes\\\hline bpath\index{bpath?\texttt{bpath}}& suffix& path& \pageref{Dbpath}& A box's bounding circle or rectangle\\\hline circleit\index{circleit?\texttt{circleit}}& suffix, picture& --& \pageref{Dcircit}& Put picture in a circular box\\\hline circleit\index{circleit?\texttt{circleit}}& suffix, picture& --& \pageref{Dcircit}& Put a string in a circular box\\\hline circleit\index{circleit?\texttt{circleit}}& suffix, \tdescr{empty}& --& \pageref{Dcircit}& Define an empty circular box\\\hline drawboxed\index{drawboxed?\texttt{drawboxed}}& list of suffixes& --& \pageref{Ddrbxed}& Draw the named boxes and their contents\\\hline drawboxes\index{drawboxes?\texttt{drawboxes}}& list of suffixes& --& \pageref{Ddrbxes}& Draw the named boxes\\\hline drawunboxed\index{drawunboxed?\texttt{drawunboxed}}& list of suffixes& --& \pageref{Ddrunbx}& Draw contents of named boxes\\\hline fixpos\index{fixpos?\texttt{fixpos}}& list of suffixes& --& \pageref{Dfixpos}& Solve for the size and position of the named boxes\\\hline fixsize\index{fixsize?\texttt{fixsize}}& list of suffixes& --& \pageref{Dfixsiz}& Solve for size of named boxes\\\hline pic\index{pic?\texttt{pic}}& suffix& picture& \pageref{Dpic}& Box contents shifted into position\\\hline \end{tabular} \end{table} \begin{table}[hp] \centering \caption{\strut Box variables} \label{boxvartab} \index{variables!box} \begin{tabular}[t]{|>{\ttfamily $\descr{box name}$.}l|>{\arraybackslash}p{2in}|c|} \hline \multicolumn1{|c|}{Variable}& \multicolumn1{c|}{Explanation}& Validity\\ \hline \hline c ¢er point &\\ n &top center point &\\ s &bottom center point &\\ w ¢er left point &\\ e ¢er right point &\\ nw &top left corner &\texttt{boxit} only\\ ne &top right corner &\texttt{boxit} only\\ sw &bottom left corner &\texttt{boxit} only\\ se &bottom right corner &\texttt{boxit} only\\ dx &horizontal clearance &\\ dy &vertical clearance &\\ off &actual location of box contents &\\ \hline \end{tabular} \end{table} \begin{table}[hp] \centering \caption{\strut Internal variables with numeric values} \label{ivartab} \index{variables!internal} \begin{tabular}[t]{|>{\ttfamily}l|r|>{\arraybackslash}p{3.5in}|} \hline \multicolumn1{|c}{Name}& \multicolumn1{|c}{Page}& \multicolumn1{|c|}{Explanation}\\ \hline \hline circmargin\index{circmargin?\texttt{circmargin}}& \pageref{Dcmargin}& clearance around contents of a circular or oval box\\\hline defaultdx\index{defaultdx?\texttt{defaultdx}}& \pageref{Ddefaultdx}& usual horizontal space around box contents (default 3{\tt bp})\\\hline defaultdy\index{defaultdy?\texttt{defaultdy}}& \pageref{Ddefaultdy}& usual vertical space around box contents (default 3{\tt bp})\\\hline \end{tabular} \end{table} \bibliographystyle{plain} \bibliography{mpboxes} \printindex \end{document} % Copyright 1990 - 1995 by AT&T Bell Laboratories. % 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. %%% Local Variables: %%% mode: latex %%% TeX-PDF-mode: t %%% TeX-master: t %%% End: