%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % This is DRAWING.TEX v.1.0a revised 1994/01/25 % This contribution is written in LaTeX so that everybody can make a % "pretty printout". % In order to print it you need VERBATIM.STY by Rainer Sch"opf. This % style is available from many archives. % You of course need METAFONT and GFTOPK to generate the pictures. % (Ask your local wizard for help) % DRAWING.MF will be generated when you run this file through % LaTeX the first time. \ifx\selectfont\undefined \documentstyle[verbatim]{article} \else \documentstyle[oldlfont,verbatim]{article} \fi \makeatletter % Read the documentation of verbatim.sty and you will understand % what I am doing. \newif\ifmf@open \mf@openfalse \newwrite\mf@out \def\mfcode{\@bsphack \ifmf@open \else \typeout{Writing "drawing.mf"} \immediate\openout\mf@out\mf@name\relax \global\mf@opentrue \fi \let\do\@makeother\dospecials \catcode`\^^M\active% \def\verbatim@processline{% \immediate\write\mf@out{\the\verbatim@line}}% \verbatim@start} \def\ednmfcode{\@esphack} % We must specify the file name where the METAFONT source is to be % written \def\mf@name{drawing.mf} \let\DW\relax % the font does not exist at the first run % We define a macro which writes into drawing.aux. It is similar % to \mfcode \def\auxwrite{\@bsphack \let\do\@makeother\dospecials \catcode`\^^M\active% \def\verbatim@processline{% \immediate\write\@mainaux{\the\verbatim@line}}% \verbatim@start} \def\ednmfcode{\@esphack} % Now we define \info to be used at the end of the document \def\info{\ifmf@open\immediate\closeout\mf@out\fi \typeout{^^J ==================================================================^^J This was the first run. It created "drawing.mf" and "\jobname.dvi"^^J is useless. Now you have to generate the pictures. You should ask^^J the local wizard to help you with METAFONT. You should invoke it^^J by the command:^^J ^^J >mf &plain mode:=localfont; \string\input\space drawing^^J ^^J where "localfont" should most probably be replaced with another^^J mode depending upon your hardware. METAFONT will generate the^^J metric file "drawing.tfm" and the font file "drawing.XXX" where^^J the extension depends on the mode and METAFONT will tell you.^^J Afterwards you have to call^^J ^^J >gftopk drawing.XXX^^J ^^J Your local wizard will tell you whether you have to move^^J "drawing.tfm" and "drawing.pk" into another directory. Then you^^J run LaTeX again and you will get the document with pictures (it^^J should work even on a PC).^^J Remember that you might need a different font for the screen and^^J the printer.^^J =================================================================^^J Note: If you do not see the whole message on screen, you can find^^J it in "\jobname.log".}} \makeatother % METAFONT logo \newfont{\logo}{logo10} \newfont{\llogo}{logo10 scaled \magstep2} \newfont{\Llogo}{logo10 scaled \magstep3} \def\mf{{\logo META}\-{\logo FONT}} \def\lmf{{\llogo META}\-{\llogo FONT}} \def\Lmf{{\Llogo META}\-{\Llogo FONT}} % We will need hash, therefore we define it. \begingroup \catcode`\#12 \gdef\hash{{\catcode`\#12#}} \endgroup % Page layout \textwidth 16cm \oddsidemargin 0pt \evensidemargin 0pt \marginparwidth 0pt \marginparsep 0pt % Useful macro \def\vs{\vspace{5mm}\par} % Special hack \newif\ifdoc \doctrue % Now the document begins \begin{document} % Now we use a dirty trick to write something to the aux-file \begin{auxwrite} \ifdoc \global\font\DW=drawing \global\let\info\relax \global\let\mfcode\verbatim \global\let\endmfcode\endverbatim \fi \end{auxwrite} %%%%%%%%%%%%%%%%%%%% Read the text from here %%%%%%%%%%%%%%%% \title{Simple drawings with \Lmf}\author{Zden\v{e}k Wagner} \maketitle \section*{Introduction} This contribution explains how to use \mf\ for simple drawings. To make the text shorter, some commands are not described. The reader is kindly asked to look into this source to see how it was done. Nobody can guarantee that \mf\ is exactly what you need. the simple rules say: \begin{itemize} \item Use \TeX\ where \TeX\ is good. \item Use \mf\ where \mf\ is good. \item Use other tools where other tools are good. \end{itemize} Here you can see examples where \mf\ is good. \section*{Why not other packages?} Though it might look strange I prefer explaining it here. The selection of tools is more (or less) a matter of personal taste. But there should be some reasoning behind it. If you want to make simple drawings, you may choose either MFpic or a similar package or directly \mf. In either case you must learn some new commands. However, MFpic supports only a subset of \mf. Later, if you need more complex pictures, you have to learn a new tool. With \mf\ it's a bit easier. You just learn some more commands. It's not a good practice to reject everything what has been done. you can find files with \mf\ macros which can be used in a similar way as \LaTeX\ styles. This can make life much easier. \section*{Principle of \lmf\ pictures} The principle is to make a new font where a picture is some ``character''. When we want to place the picture into the document, we change the font and type appropriate character. If the picture is too large or too complex, it is better to divide it into several characters and overlay them with \verb|\llap| or \verb|\rlap| commands or simply place the characters in the correct order (we will see it later). \section*{Initial commands} It is clever not to use absolute dimensions in the drawings. If we measure everything as a multiple of a unit length, we can easily scale the whole font. The unit length should be specified in sharp units (designated with \hash) which are device independent. We must then convert it into device dependent number of pixels by calling \verb|define_pixels|. To do this, \mf\ must know the properties of the output device. To set everything up, you should call \verb|mode_setup| at the very beginning and supply the correct mode when you call \mf. It may be interesting to see on screen how \mf\ is drawing the picture. It is accomplished by \verb|screenstrokes|. The beginning of \mf\ source file may therefore look as: \begin{mfcode} % This is drawing.mf, an example file % (C) Z. Wagner, 23 Jan 1993, revised 25 Jan 1994 % This file must not be distributed separately. It is an integral % part of drawing.tex. It may be placed at any computer in case % drawing.tex is available at an appropriate directory. mode_setup; u# := 1.0mm#; define_pixels(u); screenstrokes; \end{mfcode} \section*{Assignments and equations} As the title says, \mf\ can solve equations. Thus you can write ($3a$ is a shorthand for $3 * a$) \begin{verbatim} 3a + b = 5; 2a - 3b = 7; \end{verbatim} After reading these equations the values of $a$ and $b$ are fully defined. In the previous section we used \verb|:=| which denotes assignment. If you now say \begin{verbatim} a := 13; \end{verbatim} it will instruct \mf\ to forget whatever value $a$ might have had and assign 13 ti it. In the previous case, when reading the equation $2a - 3b = 7$, \mf\ already knows that $a = (-b + 5)/3$ and these together enable the evaluation of $a$ and $b$. This is the difference between assignments and equations. \section*{Points, coordinates and simple curves} The position of points are specified using Cartesian coordinates. since \mf\ works inside a plane, we need a pair of numbers, namely the x and y coordinates. The \mf\ character is usually defined by many points. It is therefore comfortable to index them. \mf\ uses convention known from programming languages, i.e. the index is placed in square bracket as in z[7k-6]. It would be very tedious to write z[3]. Therefore \mf\ offers a shorthand: one simply types z3. When defining the position of any point, you can either use the pair variable in the equation or you can access the x and y coordinates directly. Thus \begin{verbatim} z3 = (7.3u,-13.4u); \end{verbatim} is equivalent to \begin{verbatim} x3 = 7.3u; y3 = -13.4u; \end{verbatim} whereas $u$ was defined above. Later in the \mf\ definitions we will use commands as $z3 = t[z1,z2]$. This means that z3 lies on the straight line defined by z1 and z2. If $t = 0$, z3 is equivalent to z1. Equivalence between z2 and z3 holds if $t = 1$. In case $t = \frac{1}{2}$, z3 lies in the middle between z2 and z3. \begin{figure}[hbt] \centerline{{\DW A}}\vs \caption{Simple curves}\label{fig:curves} \end{figure} The drawings are composed of Bezier curves. To draw a Bezier curve through z1, z2, z3, we simply write: \begin{verbatim} draw z1..z2..z3; \end{verbatim} Sometimes we need better control. It may be achieved by specifying a direction at one or more points. This was illustrated in fig.~\ref{fig:curves}. The angles are always specified in degrees. Before we write the \mf\ program for the curves, we must say something about other commands. The \verb|beginchar| commands starts the definition of a character. The first parameter says what character it is to be assigned to. The next parameters specify the width, height, and depth (how far below the baseline it should extend), respectively. The dimensions must be given in sharp units unless they are zero. To draw something we must first pickup a pen of appropriate thickness. To make a dot wit a pen, we use \verb|drawdot|. The program for the character ends with \verb|endchar|. Now we can look at it: \begin{mfcode} beginchar("A",50u#,50u#,0); z1 = (5u,3u); z2 = (37u,43u); x3 = 1/3[x2,x1]; y3 = 1/3[y1,y2]; pickup pencircle scaled .4pt; draw z1..z3{dir 45}..z2; draw z1..z3{dir 105}..z2; draw z1..z3{dir -20}..z2; pickup pencircle scaled 2u; drawdot z1; drawdot z2; drawdot z3; endchar; \end{mfcode} The command \verb|flex(z1,z2,z3)| draws a Bezier curves through z1, z2, z3, where the direction at z2 is equal to the slope of the straight line from z1 to z3. Make it as your own exercise. \section*{Changing curvature with tension} Bezier spline is a cubic curve. Therefore, you need four points for full specification. However, every Bezier segment in previous examples was defined only by two endpoints. It means that \mf\ has its own algorithm for finding the remaining two points. If you want to control the curvature, you must have the possibility to influence this algorithm. One way is to use \verb|tension|. You can define tension at any point of any segment. The general syntax is \begin{verbatim} z1..tension a and b..z2 \end{verbatim} If $a = b$, we can simplify this to \begin{verbatim} z1..tension a..z2 \end{verbatim} The simple case \verb|z1..z2| is a shorthand for\footnote{This is not the whole truth but you can live with this small lie. If you wish to know more details, you have to study \mf\-book.} \begin{verbatim} z1..tension 1..z2 \end{verbatim} \begin{figure}[hbt] \centerline{{\DW abc}}\vs \caption{Frame}\label{fig:frame} \end{figure} In the next example, we will need some more definitions. You should already understand the first two lines. The next line defines some parameters which will be used later. Then we declare the array of paths to be drawn, the array of cnt and pen widths which are both numeric variables. Then we assign some values to them. \begin{mfcode} height#=50u#; width#=50u#; define_pixels(height,width); relsh:=.005; tens:=3; path p[]; numeric cnt[], penw[]; penw0=3pt; penw1=1pt; penw2=.3pt; cnt1=.95; cnt2=.92; \end{mfcode} Afterwards we have to specify a number of points and the three curves. We will use a predefined constant $origin$ which means (0,0). To simplify the task we also use loops. The loop starts with the \verb|for| token and carries out the commands up to \verb|endfor| for the specified values of the loop control variable. In the firs loop, when $k = 1$, the inner loop defines points $z20, z21, \ldots, z32$. The token \verb|shifted| means that the point is shifted by the specified vector. The vectors \verb|right|, \verb|left|, \verb|up|, \verb|down|, are the unit vectors in the named direction. The token \verb|scaled| means scaling (multiplication) of the vector. In the equations below it defines the length of the vector. The definition of paths (curves) end with \verb|cycle|. This means that the curve is cyclical. If you say \begin{verbatim} draw z1..z2..z3..z1; \end{verbatim} the curve will most probably have a sharp edge at z1. You must say \begin{verbatim} draw z1..z2..z3..cycle; \end{verbatim} in order to make the curve smooth. \begin{mfcode} z0=origin; z1=(0,height); z2=(width,height); z3=(width,0); z5=.5[z0,z1]; z6=.5[z3,z2]; z7=.64[z0,z5] shifted (right scaled (relsh*width)); z8=.64[z1,z5] shifted (right scaled (relsh*width)); z9=.64[z2,z6] shifted (left scaled (relsh*width)); z10=.64[z3,z6] shifted (left scaled (relsh*width)); z11=.5[z1,z2] shifted (down scaled (relsh*height)); z12=.5[z0,z3] shifted (up scaled (relsh*height)); z13=(.5width,.5height); for k:=1 upto 2: m:=20k; for j:=0 upto 12 : z[j+m]=cnt[k][z13,z[j]]; endfor; endfor; for k:=0 upto 2: m:=20k; p[k]=z[m]..tension tens and 1..z[m+7]..z[m+5]..z[m+8]..tension 1 and tens.. z[m+1]..tension tens and 1..z[m+11]..tension 1 and tens..z[m+2].. tension tens and 1..z[m+9]..z[m+6]..z[m+10]..tension 1 and tens..z[m+3].. tension tens and 1..z[m+12]..tension 1 and tens..cycle; endfor; \end{mfcode} Now we draw the curves. Notice that we used zero widths for the first two characters in order to simplify overlapping (look how fig.~\ref{fig:curves} was done). \begin{mfcode} beginchar ("a",0,height#,0); pickup pencircle scaled penw0; draw p0; endchar; beginchar ("b",0,height#,0); pickup pencircle scaled penw1; draw p1; endchar; beginchar ("c",width#,height#,0); pickup pencircle scaled penw2; draw p2; endchar; \end{mfcode} \section*{Skip this at the first reading} We have made some global definitions which might spoil further work. We therefore undefine the points. It is achieved by assigning \verb|whatever|. It is done here for safety because the examples are extracted from several \mf\ files designed by the author and the global definitions might interfere with something. However, a normal user usually does not need it. \begin{mfcode} for k:=0 upto 60: z[k]=(whatever,whatever); endfor; \end{mfcode} \section*{Scientific graph} Now we make an example of presentation of scientific results. Imagine that we have measured vapour pressures of some chemical species and afterwards we have found the best fit in the form \begin{equation} \log p = A - \frac{B}{t+C}\label{eqn:vap} \end{equation} where $t$ is temperature in degrees Centigrade and $p$ is pressure in kilopascals. Numerical values of parameters $A, B, C$ are defined later in the \mf\ source. \newcommand{\dgC}{$~{\circ}$C} As you can see, the temperature ranges from 60\dgC\ to 90\dgC\ and pressure ranges from 80\,kPa to 170\,kPa. We therefore need some scaling and shift of the origin. A novice might read about \verb|currenttransform| and try to harness it. This, however, has undesirable side-effects and therefore we suggest to avoid it. It is better to use simple linear transform defined with macros. \begin{mfcode} def degC = degCa + degCb enddef; def kPa = kPaa + kPab enddef; \end{mfcode} Now let's examine what happens if we write 75degC. This expression expands to 75degCa + degCb. It's clear how the transform works. We must only emphasize that 75degC is not equal to degC*75 because degC is not a variable but a macro. Now we can start the plot. We specify the dimensions of the character, define the temperature--pressure coordinates of the lower left and upper right corners (\mf\ evaluates degCa, degCb, kPaa, kPab for us) and specify parameters A, B, C and seven experimental points. You will see special variables $w$ and $h$. At the time of reading \verb|beginchar| \mf\ assigns width to $w$, height to $h$ and depth to $d$. All these variables are expressed in pixels rounded to whole numbers. \begin{mfcode} beginchar("B",100u#,99u#,0); origin = (50degC,50kPa); (w,h) = (100degC,200kPa); A = 3194; B = 605; C = 232; z1 = (60degC,80kPa); z2 = (65degC,92kPa); z3 = (70degC,105kPa); z4 = (75degC,119kPa); z5 = (80degC,134kPa); z6 = (85degC,151kPa); z7 = (90degC,170kPa); \end{mfcode} It is tedious to type this by hand but it can be prepared by the program which is used for finding the best fit. In this case the best fit was expressed in a way which can be evaluated with \mf. This is not a frequent situation. The easiest way is to tabulate the best fit in many points (do it with your software and make the output suitable for input to \mf) and connect them with a crooked line. You will use a similar technique as below. The only difference is that you will define the points but we are calculating them. It is of course possible to draw a curve which is not mathematically defined as the best fit. In such a case you should specify a very small number of points and play with directions and tensions. The next part shows that the index expression may even be a real number. \begin{mfcode} for t := 55 step .3 until 95: x[t] = t*degC; y[t] = (mexp(A - 1000/(t+C)*B))*kPa; endfor; pickup pencircle scaled 1.5pt; draw z55 for t:= (55+.3) step .3 until 95: --z[t] endfor; \end{mfcode} \mf\ has some limitation for calculations. Value 4096 is treated as infinity. Greater values can appear in calculations but they must be less that 32768. Therefore, the values $B = 605000$ would cause arithmetic overflow. Due to it we had to modify equation~\ref{eqn:vap}. We have seen another useful feature of \mf. The loop command may even be used in the middle of expression. Here it was used inside the \verb|draw| command. We also want to see the experimental points. We will draw them as squares. \begin{mfcode} pickup pensquare scaled 4u; for k:= 1 upto 7: drawdot z[k]; endfor; \end{mfcode} At last we draw the frame with marks for 75\dgC, 100\,kPa, and 150\,kPa. \begin{mfcode} pickup pensquare scaled .7pt; draw origin--(0,h)--(w,h)--(w,0)--cycle; pickup pencircle scaled .3pt; draw (75degC,0)--(75degC,5u); draw (0,100kPa)--(5u,100kPa); draw (0,150kPa)--(5u,150kPa); endchar; \end{mfcode} Notice that we specified the position of marks in the corresponding units. We could as well use $w/2$ or even $50u$ instead of $75degC$. Such things are, however, too absolute. If you for some reason change the with to $150u\hash$, $50u$ will no longer correspond to 75\dgC. You can change the temperature range to 60\dgC--120\dgC\ and now $w/2$ corresponds to 90\dgC. It is clear that $75degC$ is invariate under such changes. \begin{figure}[hbt] \setlength{\unitlength}{1truemm} \newcommand{\x}{-5} \newcommand{\y}{-6} \begin{picture}(130,120)(-30,-20)\sf \put(0,0){\makebox(100,99)[lb]{{\DW B}}} \put(0,\y){\makebox(4,4)[lt]{50}} \put(48,\y){\makebox(4,4)[t]{75}} \put(96,\y){\makebox(4,4)[tr]{100}} \put(\x,0){\makebox(4,4)[br]{50}} \put(\x,31){\makebox(4,4)[r]{100}} \put(\x,64){\makebox(4,4)[r]{150}} \put(\x,95){\makebox(4,4)[tr]{200}} \put(0,-9){\makebox(90,4)[br]{t\,[\dgC]}} \put(-30,90){\makebox(20,4)[br]{p\,[kPa]}} \end{picture} \caption{Vapour pressure curve}\label{fig:vap} \end{figure} Look how figure~\ref{fig:vap} has been done. It might look horrible but after some practice you will find it easy. \mf\ has more advanced mechanisms which could be harnessed for transfer of dimensions and coordinates. Some macro packages as \verb|incpic.mf| and \verb|incpic.tex| by Old\v{r}ich Ulrych make use of it. But this is for experts (or those who do not care how it works inside). A novice would have hard times to understand it. If you know the mechanism, you cam find your own bugs and you can modify it so that it satisfies your personal needs. The easiest way seems to be the standard \LaTeX' picture environment. To avoid some calculations, we place the origin of the environment into the origin of our graph. All texts are aligned using \verb|\makebox| commands. The dimensions are specified in truemm and truecm. These units remain the same if you change the \verb|\magnification|. It cannot be done in \LaTeX\ but it is used here in case someone would like to incorporate similar concepts into plain \TeX. \section*{More complex examples} This section can be too difficult for novices. We show more advanced macro definitions. If you cannot understand it at the first reading, just skip this chapter and return here after you make several own pictures. However, {\bf do not forget to read the important warning later in this document!} The next part of \mf\ code is best placed at the beginning of the file so that you can fiddle with the parameters. In this example it is placed here in order not to disturb the initial explanation with hard to understand commands. We start with some parameter definitions. Note that two variables are declared as \verb|pair|. \begin{mfcode} pair tieshift, tiedepth; smallcorner = 1.5u; bigcorner = 7.5u; slope = 3; tieshift = down scaled 2.5u; tiedepth = down scaled 4.5u; tv = 3; % this is tension for ties \end{mfcode} We have already seen commands for pen selection. They are quite slow. If we pick up the same pen many times, it is faster to store the pen in some variable using \verb|savepen|. We do that with two different pens.\footnote{It may seem rather useless for two pictures but remember that this example is a small part of a large font.} \begin{mfcode} pickup pencircle scaled 1pt; normalpen := savepen; pickup pencircle scaled .4pt; penfortie := savepen; \end{mfcode} \begin{figure}[hbt] \centerline{{\DW C\hspace{1cm}D}}\vs \caption{Drawings of marquees}\label{fig:marquee} \end{figure} Now we define a macro with parameters. This macro should draw a single segment of a tie. As you can see in fig.~\ref{fig:marquee}, the tie is quite a complicated path. It should be composed of many segments. Therefore there is no semicolon inside the macro definition. \begin{mfcode} def tiebelowline(expr l, r, t, u) = (t[l,r] shifted tieshift)..tension tv and 1.. ((.5[t,u])[l,r] shifted tiedepth)..tension 1 and tv enddef; \end{mfcode} We will need two different round corners. There's another place for macro with parameters. It contains cryptic commands. So we write the macro and explain it below. \begin{mfcode} def roundcorner(expr a, b, c, r) = begingroup save q, w; pair q, w; hide(save __p; path __p; __p = fullcircle scaled r shifted b; q := (a--b) intersectionpoint __p; w := (b--c) intersectionpoint __p; ) a--q{b-a}..{c-b}w--c endgroup enddef; \end{mfcode} This macro should draw a line from $a$ to $c$ where the sharp corner at $b$ is replaced by a part of circle of diameter $r$. the macro uses its own internal variables. Not to spoil other things in our source, we close the calculations into a group. It is similar to \TeX\ groups but the behaviour is slightly different. We must explicitly \verb|save| the variables. After that \mf\ forgets whatever meaning they might have had and then we can define them. similarly as \verb|tie|, macro \verb|roundcorner| expands to a segment of a longer path. Therefore we must hide the calculations so that \mf\ does not see them when constructing the path. This is by saying \verb|hide| and closing the hidden code into parentheses. The hidden code starts with saving \verb|__p| and declaring it as a variable of type \verb|path|. It is then defined to be a circle of diameter $r$ with the centre at point $b$. The next two lines of code calculate the points of intersection of the full circle (path \verb|__p|) with straight lines (\verb|a--b|) and (\verb|b--c|) and assigns them to $q$ and $w$, respectively. now we can construct the segment. We specify directions st $q$ and $w$. Again semicolon does not appear here because it should be used as a part of a longer path. We have said that $w$ contains the width of the character rounded to the whole number of pixels. Now we use it as a variable of type pair. You may wonder why \mf\ does not get confused. The reason is that we did the change inside a group. We saved the old meaning which is automatically restored when \mf\ performs \verb|endgroup|. We are going to draw two similar marquises. They will differ in one parameter only. Therefore we write another macro. First we define some points. These definitions must be global. We will use variable $i$ for some calculations. We adopt a rule that this variable serves as a loop control variable and is not used for any other purpose. Therefore we need not save it. We will see a new token \verb|rotated|. This denotes rotation of the endpoint around origin. Scaling, shift and rotation are transformations. Shift and rotation are not commutative. It means that it is important to apply them in the correct order. In the following macro you can find \begin{verbatim} z[i+10] = right scaled 35u rotated slope shifted z[i]; \end{verbatim} As an exercise change it to\footnote{If you happen to corrupt drawing.mf, do not despair. Just erase drawing.aux and run drawing.tex through {\rm\normalsize\LaTeX}. It will recreate drawing.mf.} \begin{verbatim} z[i+10] = right shifted z[i] scaled 35u rotated slope; \end{verbatim} and look what it makes with the marquise\footnote{Are you really doing the exercise or just reading the text? your own practice will give you much more. Of course you can also try your own pictures.} \begin{mfcode} def Kcxi(expr corner) = z1 = origin; z2 = right scaled 13u rotated -16; z3 = right scaled 13u rotated 16; z4 = right scaled 13u rotated 40; z5 = right scaled 14u rotated 65; z6 = (0,15u); for i := 2 upto 6: z[i+10] = right scaled 35u rotated slope shifted z[i]; endfor; pickup normalpen; draw roundcorner(z1,z2,z12,corner); for i := 3 upto 6: draw roundcorner(z1,z[i],z[i+10],corner)--z[i+9]; endfor; pickup penfortie; draw z1--tiebelowline(z1,z2,0,1/3)..tiebelowline(z1,z2,1/3,2/3) ..tiebelowline(z1,z2,2/3,1).. for i := 1 upto 8: tiebelowline(z2,z12,(i-1)/8,i/8)..endfor z12 shifted tieshift--z12; enddef; \end{mfcode} The forming of the marquises is now easy. We just call the macro with the correct corner. Please notice that those characters have nonzero depths. \begin{mfcode} beginchar("C",50u#,16u#,12u#); Kcxi(smallcorner); endchar; beginchar("D",50u#,16u#,12u#); Kcxi(bigcorner); endchar; \end{mfcode} \section*{Important warning} At the end of the \mf\ code we have to place \begin{mfcode} end \end{mfcode} Semicolon is not required here (but you can use it) because \mf\ ignores everything which might appear after the \verb|end| token. {\bf It is important to place end--of--line character at the last line of code.} If you forget it, \mf\ will award you with a horrible message \begin{verbatim} ! METAFONT capacity exceeded, sorry [buffer size=500]. l.132 end^^?^^?^^?^^?^^?^^?^^?^^?^^?^^?^^?^^?^^?^^?^^?^^?^^?... If you really absolutely need more capacity, you can ask a wizard to enlarge me. \end{verbatim} \section*{Conclusion} We have seen simple examples of drawings produced by \mf. There are plenty of other commands which we have not discussed here. One of them is \verb|fill| which fills in a cyclic path (try to define one and fill it by saying e.g. \begin{verbatim} fill z1..z2..z3..cycle; \end{verbatim} where all points were previously defined). If you master \mf, you can make lots of tricks. I said that MFpic inserts an additional step which slows down the progress when you need to fine tune the curves. From this document it may seem that I did not make any improvement. The truth is that in your life you will not use the \verb|mfcode| environment. It is used in this example to ensure that everything is distributed together. Normally the \mf\ source code is written directly and is not created by running \TeX. I wanted to demonstrate that you have to know relatively small number of \mf\ commands in order to draw simple pictures. If you try this, it will encourage you to study \mf\-book. It is useful although you will probably never design your own letters. It may happen that \mf\ is extremely cumbersome for some particular case. Then you are free to scan an image using your scanner, modify it with e.g. Corel Draw, overlap it with pictures designed with \mf\ and texts written in \TeX, cut and paste it using the functions provided by dvidot or other drivers and polish it by means of {\sl PostScript\/} features. The only limitation is the availability of different soft- and hardware tools and your own invention. \nopagebreak\vspace{1cm}\nopagebreak\par\nopagebreak \begin{flushright}\interlinepenalty10000 Zden\v{e}k Wagner\\ E. H\'ala Laboratory of Thermodynamics\\ Institute of Chemical Process Fundamentals\\ Academy of Sciences of the Czech Republic\\ CZ--165 02 Prague\\[2ex] e--mail: {\tt wagner@csearn.bitnet, wagner@earn.cvut.cz} \end{flushright} \docfalse\info \end{document}