[BACK]Return to metapost.trm CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gnuplot / term

Annotation of OpenXM_contrib/gnuplot/term/metapost.trm, Revision 1.1.1.1

1.1       maekawa     1: /*
                      2:  * $Id: metapost.trm,v 1.5.2.4 1999/09/16 16:05:21 lhecking Exp $
                      3:  */
                      4:
                      5: /* GNUPLOT - metapost.trm */
                      6:
                      7: /*[
                      8:  * Copyright 1990 - 1993, 1998
                      9:  *
                     10:  * Permission to use, copy, and distribute this software and its
                     11:  * documentation for any purpose with or without fee is hereby granted,
                     12:  * provided that the above copyright notice appear in all copies and
                     13:  * that both that copyright notice and this permission notice appear
                     14:  * in supporting documentation.
                     15:  *
                     16:  * Permission to modify the software is granted, but not the right to
                     17:  * distribute the complete modified source code.  Modifications are to
                     18:  * be distributed as patches to the released version.  Permission to
                     19:  * distribute binaries produced by compiling modified sources is granted,
                     20:  * provided you
                     21:  *   1. distribute the corresponding source modifications from the
                     22:  *    released version in the form of a patch file along with the binaries,
                     23:  *   2. add special version identification to distinguish your version
                     24:  *    in addition to the base release version number,
                     25:  *   3. provide your name and address as the primary contact for the
                     26:  *    support of your modified version, and
                     27:  *   4. retain our contact information in regard to use of the base
                     28:  *    software.
                     29:  * Permission to distribute the released version of the source code along
                     30:  * with corresponding source modifications in the form of a patch file is
                     31:  * granted with same provisions 2 through 4 for binary distributions.
                     32:  *
                     33:  * This software is provided "as is" without express or implied warranty
                     34:  * to the extent permitted by applicable law.
                     35: ]*/
                     36:
                     37: /* 1999/04/22
                     38:  *                     GNUPLOT -- metapost.trm
                     39:  *
                     40:  *                     This terminal driver supports:
                     41:  *                             Metapost Commands
                     42:  *
                     43:  * Based on metafont.trm, written by
                     44:  *             Pl Hedne
                     45:  *             Trondheim, Norway
                     46:  *             Pal.Hedne@termo.unit.no;
                     47:  *             with improvements by Carsten Steger
                     48:  *
                     49:  * and pstricks.trm, written by
                     50:  *             David Kotz and Raymond Toy
                     51:  *
                     52:  * Adapted to metapost by:
                     53:  *             Daniel H. Luecking <luecking@comp.uark.edu> and
                     54:  *             L Srinivasa Mohan <mohan@chemeng.iisc.ernet.in>
                     55:  */
                     56:
                     57: #include "driver.h"
                     58:
                     59: #ifdef TERM_REGISTER
                     60: register_term(mp)
                     61: #endif
                     62:
                     63: #ifdef TERM_PROTO
                     64: TERM_PUBLIC void MP_options __PROTO((void));
                     65: TERM_PUBLIC void MP_init __PROTO((void));
                     66: TERM_PUBLIC void MP_graphics __PROTO((void));
                     67: TERM_PUBLIC void MP_text __PROTO((void));
                     68: TERM_PUBLIC void MP_linetype __PROTO((int linetype));
                     69: TERM_PUBLIC void MP_move __PROTO((unsigned int x, unsigned int y));
                     70: TERM_PUBLIC void MP_point __PROTO((unsigned int x, unsigned int y, int number));
                     71: TERM_PUBLIC void MP_pointsize __PROTO((double size));
                     72: TERM_PUBLIC void MP_linewidth __PROTO((double width));
                     73: TERM_PUBLIC void MP_vector __PROTO((unsigned int ux, unsigned int uy));
                     74: TERM_PUBLIC void MP_arrow __PROTO((unsigned int sx, unsigned int sy,
                     75:                                   unsigned int ex, unsigned int ey,
                     76:                                   TBOOLEAN head));
                     77: TERM_PUBLIC void MP_put_text __PROTO((unsigned int x, unsigned int y, char str[]));
                     78: TERM_PUBLIC int MP_justify_text __PROTO((enum JUSTIFY mode));
                     79: TERM_PUBLIC int MP_text_angle __PROTO((int ang));
                     80: TERM_PUBLIC void MP_reset __PROTO((void));
                     81: TERM_PUBLIC int MP_set_font __PROTO((char *font));
                     82: TERM_PUBLIC void MP_boxfill __PROTO((int style,
                     83:                                     unsigned int x1, unsigned int y1,
                     84:                                     unsigned int width, unsigned int height));
                     85:
                     86: /* 5 inches wide by 3 inches high (default) */
                     87: #define MP_XSIZE 5.0
                     88: #define MP_YSIZE 3.0
                     89:
                     90: /* gnuplot units will be one pixel if printing device has this
                     91:    resolution */
                     92: #define MP_DPI (300)
                     93:
                     94: #define MP_XMAX (MP_XSIZE*MP_DPI)
                     95: #define MP_YMAX (MP_YSIZE*MP_DPI)
                     96:
                     97: #define MP_HTIC (5*MP_DPI/72)  /* nominally 5pt   */
                     98: #define MP_VTIC (5*MP_DPI/72)  /*    "      5pt   */
                     99: #define MP_HCHAR (MP_DPI*53/10/72)     /*    "      5.3pt */
                    100: #define MP_VCHAR (MP_DPI*11/72)        /*    "      11pt  */
                    101: #endif /* TERM_PROTO */
                    102:
                    103: #ifndef TERM_PROTO_ONLY
                    104: #ifdef TERM_BODY
                    105:
                    106: static double MP_xsize = MP_XSIZE;
                    107: static double MP_ysize = MP_YSIZE;
                    108: /* static double MP_xmax = MP_XMAX;
                    109:    static double MP_ymax = MP_YMAX;
                    110:  * unused, for now
                    111:  */
                    112: static int MP_posx;
                    113: static int MP_posy;
                    114: static char MP_fontname[MAX_ID_LEN + 1];
                    115: static double MP_fontsize;
                    116: static double MP_textmag;
                    117: enum JUSTIFY MP_justify = LEFT;
                    118: static int MP_ang = 0;
                    119: static int MP_char_code = 0;
                    120:
                    121: /* number of nodes in an output line so far */
                    122: static int MP_linecount = 1;
                    123:
                    124: /* Number of point types */
                    125: #define MP_POINT_TYPES 10
                    126:
                    127: /* Number of line types */
                    128: #define MP_LINE_TYPES 8
                    129:
                    130: /* are we in the middle of a MP path? */
                    131: static TBOOLEAN MP_inline = FALSE;
                    132: /* colored or dashed lines? */
                    133: static TBOOLEAN MP_color = FALSE;
                    134: static TBOOLEAN MP_solid = FALSE;
                    135:
                    136: /* compatability mode*/
                    137: static TBOOLEAN MP_notex = FALSE;
                    138:
                    139: /* has a font change taken place? */
                    140: static TBOOLEAN MP_fontchanged = FALSE;
                    141:
                    142: /* The old types */
                    143: static int MP_oldline = -2;
                    144:
                    145: /* The old sizes */
                    146: static double MP_oldptsize = 1.0;
                    147: static double MP_oldpen = 1.0;
                    148:
                    149: /* terminate any path in progress */
                    150: static void MP_endline __PROTO((void));
                    151:
                    152: /* max number of path nodes before a newline */
                    153: #define MP_LINEMAX 5
                    154:
                    155: TERM_PUBLIC void
                    156: MP_options()
                    157: {
                    158:     MP_color = FALSE;
                    159:     MP_solid = FALSE;
                    160:     MP_notex = FALSE;
                    161:     MP_fontsize = 10.0;
                    162:     MP_textmag = 1.0;
                    163:     strcpy(MP_fontname, "cmr10");
                    164:     strcpy(default_font, "");  /* output file will store default font info */
                    165:     while (!END_OF_COMMAND) {
                    166:        if (almost_equals(c_token, "m$onochrome")) {
                    167:            MP_color = FALSE;
                    168:            c_token++;
                    169:            continue;
                    170:        }
                    171:        if (almost_equals(c_token, "c$olor") || almost_equals(c_token, "c$olour")) {
                    172:            MP_color = TRUE;
                    173:            c_token++;
                    174:            continue;
                    175:        }
                    176:        if (almost_equals(c_token, "s$olid")) {
                    177:            MP_solid = TRUE;
                    178:            c_token++;
                    179:            continue;
                    180:        }
                    181:        if (almost_equals(c_token, "da$shed")) {
                    182:            MP_solid = FALSE;
                    183:            c_token++;
                    184:            continue;
                    185:        }
                    186:        if (almost_equals(c_token, "n$otex")) {
                    187:            MP_notex = TRUE;
                    188:            strcpy(MP_fontname, "pcrr8r");
                    189:            c_token++;
                    190:            continue;
                    191:        }
                    192:        if (almost_equals(c_token, "t$ex")) {
                    193:            MP_notex = FALSE;
                    194:            c_token++;
                    195:            continue;
                    196:        }
                    197:        if (almost_equals(c_token, "de$fault")) {
                    198:            c_token++;
                    199:            continue;
                    200:        }
                    201:        if (almost_equals(c_token, "m$agnification")) {
                    202:            c_token++;
                    203:            if (!END_OF_COMMAND) {      /* global text scaling */
                    204:                struct value a;
                    205:                MP_textmag = (double) real(const_express(&a));
                    206:            }
                    207:            c_token++;
                    208:            continue;
                    209:        }
                    210:        break;
                    211:     }
                    212:     if (!END_OF_COMMAND && isstring(c_token)) {                /* font name */
                    213:        quote_str(MP_fontname, c_token, MAX_ID_LEN);
                    214:        c_token++;
                    215:     }
                    216:     if (!END_OF_COMMAND) {     /*font size */
                    217:        struct value a;
                    218:        MP_fontsize = (double) real(const_express(&a));
                    219:        c_token++;
                    220:     }
                    221:     /* minimal error recovery: */
                    222:     if (MP_fontsize < 5.0)
                    223:        MP_fontsize = 5.0;
                    224:     if (MP_fontsize > 99.99)
                    225:        MP_fontsize = 99.99;
                    226:
                    227:     term->v_char = (unsigned int) (MP_DPI * MP_fontsize * MP_textmag * 11 / 720);
                    228:     if (MP_notex) {            /* Courier is a little wider than cmtt */
                    229:        term->h_char = (unsigned int) (MP_DPI * MP_fontsize * MP_textmag * 6.0 / 720 + 0.5);
                    230:     } else {
                    231:        term->h_char = (unsigned int) (MP_DPI * MP_fontsize * MP_textmag * 5.3 / 720 + 0.5);
                    232:     }
                    233:     sprintf(term_options, "%s%s%s%s%6.3f \"%s\" %5.2f",
                    234:            MP_color ? "color " : "", MP_solid ? "solid " : "",
                    235:            MP_notex ? "notex " : "", "mag ",
                    236:            MP_textmag, MP_fontname, MP_fontsize);
                    237: }
                    238:
                    239: TERM_PUBLIC void
                    240: MP_init()
                    241: {
                    242:     time_t now;
                    243:     time(&now);
                    244:     MP_posx = MP_posy = 0;
                    245:     fprintf(gpoutfile, "%%GNUPLOT Metapost output: %s\n", asctime(localtime(&now)));
                    246:     fputs("\n\
                    247: defaultmpt:=mpt:=4;\n\
                    248: th:=.6;\n\
                    249: \n\
                    250: def scalepen expr n = pickup pencircle scaled (n*th) enddef;\n\
                    251: def ptsize expr n = mpt:=n*defaultmpt enddef;\n",
                    252:          gpoutfile);
                    253:
                    254:     fprintf(gpoutfile, "\ntextmag:=%6.3f;\n", MP_textmag);
                    255:
                    256:     fputs("\
                    257: vardef makepic(expr str) =\n\
                    258:   if picture str : str scaled textmag\n\
                    259:   % otherwise a string\n\
                    260:   else: str infont defaultfont scaled (defaultscale*textmag)\n\
                    261:   fi\n\
                    262: enddef;\n\
                    263: \n\
                    264: def    infontsize(expr str, size) =\n\
                    265:   infont str scaled (size /    fontsize str)\n\
                    266: enddef;\n",
                    267:          gpoutfile);
                    268:
                    269:     if (MP_notex) {
                    270:        fprintf(gpoutfile, "\n\
                    271: defaultfont:= \"%s\";\n\
                    272: defaultscale := %6.3f/fontsize defaultfont;\n",
                    273:                MP_fontname, MP_fontsize);
                    274:     } else {
                    275:        fputs("\n\
                    276: %font changes\n\
                    277: verbatimtex\n\
                    278:   \\def\\setfont#1#2{%.\n\
                    279:     \\font\\gpfont=#1 at #2pt\n\
                    280:     \\gpfont}\n",
                    281:              gpoutfile);
                    282:
                    283:        fprintf(gpoutfile, "\\setfont{%s}{%5.2f}\netex\n",
                    284:                MP_fontname, MP_fontsize);
                    285:     }
                    286:     fputs("\n\
                    287: color currentcolor; currentcolor=black;\n\
                    288: boolean colorlines,dashedlines;\n",
                    289:          gpoutfile);
                    290:     if (MP_color) {
                    291:        fputs("colorlines:=true;\n", gpoutfile);
                    292:     } else {
                    293:        fputs("colorlines:=false;\n", gpoutfile);
                    294:     }
                    295:     if (MP_solid) {
                    296:        fputs("dashedlines:=false;\n", gpoutfile);
                    297:     } else {
                    298:        fputs("dashedlines:=true;\n", gpoutfile);
                    299:     }
                    300:     fputs("\n\
                    301: def _wc = withpen currentpen withcolor currentcolor enddef;\n\
                    302: def _ac = addto currentpicture enddef;\n\
                    303: def _sms = scaled mpt shifted enddef;\n\
                    304: % drawing point-types\n\
                    305: def gpdraw (expr n, x, y) =\n\
                    306:   if n<0: _ac contour fullcircle _sms (x,y)\n\
                    307:   elseif (n=1) or (n=3):\n\
                    308:     _ac doublepath ptpath[n] _sms (x,y) _wc;\n\
                    309:     _ac doublepath ptpath[n] rotated 90 _sms (x,y) _wc\n\
                    310:   elseif n<6: _ac doublepath ptpath[n] _sms (x,y) _wc\n\
                    311:   else: _ac contour ptpath[n] _sms (x,y) _wc\n\
                    312:   fi\n\
                    313: enddef;\n\
                    314: \n\
                    315: % the point shapes\n\
                    316: path ptpath[];\n\
                    317: %diamond\n\
                    318: ptpath0 = ptpath6 = (-1/2,0)--(0,-1/2)--(1/2,0)--(0,1/2)--cycle;\n\
                    319: % plus sign\n\
                    320: ptpath1 = (-1/2,0)--(1/2,0);\n\
                    321: % square\n\
                    322: ptpath2 = ptpath7 = (-1/2,-1/2)--(1/2,-1/2)--(1/2,1/2)--(-1/2,1/2)--cycle;\n\
                    323: % cross\n\
                    324: ptpath3 := (-1/2,-1/2)--(1/2,1/2);\n\
                    325: % circle:\n\
                    326: ptpath4 = ptpath8:= fullcircle;\n\
                    327: % triangle\n\
                    328: ptpath5 = ptpath9 := (0,1/2)--(-1/2,-1/2)--(1/2,-1/2)--cycle;\n\
                    329: \n\
                    330: def linetype expr n =\n\
                    331:   currentcolor:= if colorlines : col[n] else: black fi;\n\
                    332:   if n = -1 :\n\
                    333:       drawoptions(withcolor currentcolor withpen (currentpen scaled .5));\n\
                    334:   elseif n < 1 :\n\
                    335:     drawoptions(_wc);\n\
                    336:   else :\n\
                    337:     drawoptions( if dashedlines: dashed lt[n] fi _wc);\n\
                    338:   fi\n\
                    339: enddef;\n\
                    340: \n\
                    341: % dash patterns\n\
                    342: picture lt[];\n\
                    343: lt1=dashpattern(on 2 off 2); % dashes\n\
                    344: lt2=dashpattern(on 2 off 2 on 0.2 off 2); %dash-dot\n\
                    345: lt3=lt1 scaled 1.414;\n\
                    346: lt4=lt2 scaled 1.414;\n\
                    347: lt5=lt1 scaled 2;\n\
                    348: lt6:=lt2 scaled 2;\n\
                    349: lt7=dashpattern(on 0.2 off 2); %dots\n\
                    350: \n\
                    351: color col[],cyan, magenta, yellow;\n\
                    352: cyan=blue+green; magenta=red+blue;yellow=green+red;\n\
                    353: col[-2]:=col[-1]:=col0:=black;\n\
                    354: col1:=red;\n\
                    355: col2:=(.2,.2,1); %blue\n\
                    356: col3:=(1,.66,0); %orange\n\
                    357: col4:=.85*green;\n\
                    358: col5:=.9*magenta;\n\
                    359: col6:=0.85*cyan;\n\
                    360: col7:=.85*yellow;\n\
                    361: \n\
                    362: %placing text\n\
                    363: picture GPtext;\n\
                    364: def put_text(expr pic, x, y, r, j) =\n\
                    365:   GPtext:=makepic(pic);\n\
                    366:   GPtext:=GPtext shifted\n\
                    367:     if j = 1: (-(ulcorner GPtext + llcorner GPtext)/2)\n\
                    368:     elseif j = 2: (-center GPtext)\n\
                    369:     else: (-(urcorner GPtext + lrcorner GPtext)/2)\n\
                    370:     fi\n\
                    371:     rotated if r > 0: 90 else: 0 fi;\n\
                    372:   draw GPtext shifted (x,y)\n\
                    373: enddef;\n",
                    374:          gpoutfile);
                    375: }
                    376:
                    377: TERM_PUBLIC void
                    378: MP_graphics()
                    379: {
                    380:     /* initialize "remembered" drawing parameters */
                    381:     MP_oldline = -2;
                    382:     MP_oldpen = 1.0;
                    383:     MP_oldptsize = pointsize;
                    384:     fprintf(gpoutfile, "\nbeginfig(%d);\nw:=%gin;h:=%gin;\n",
                    385:            MP_char_code, MP_xsize, MP_ysize);
                    386:     fprintf(gpoutfile, "a:=w/%d;b:=h/%d;\n", term->xmax, term->ymax);
                    387:     fprintf(gpoutfile, "scalepen 1; ptsize %g;linetype -2;\n", pointsize);
                    388:     MP_char_code++;
                    389: }
                    390:
                    391: TERM_PUBLIC void
                    392: MP_text()
                    393: {
                    394:     if (MP_inline)
                    395:        MP_endline();
                    396:     fputs("endfig;\n", gpoutfile);
                    397: }
                    398:
                    399: TERM_PUBLIC void
                    400: MP_linetype(lt)
                    401: int lt;
                    402: {
                    403:     int linetype = lt;
                    404:     if (linetype >= MP_LINE_TYPES)
                    405:        linetype %= MP_LINE_TYPES;
                    406:     if (MP_inline)
                    407:        MP_endline();
                    408:     if (MP_oldline != linetype) {
                    409:        fprintf(gpoutfile, "linetype %d;\n", linetype);
                    410:        MP_oldline = linetype;
                    411:     }
                    412: }
                    413:
                    414: TERM_PUBLIC void
                    415: MP_move(x, y)
                    416: unsigned int x;
                    417: unsigned int y;
                    418: {
                    419:     if ((x != MP_posx) || (y != MP_posy)) {
                    420:        if (MP_inline)
                    421:            MP_endline();
                    422:        MP_posx = x;
                    423:        MP_posy = y;
                    424:     }                          /* else we seem to be there already */
                    425: }
                    426:
                    427: TERM_PUBLIC void
                    428: MP_point(x, y, pt)
                    429: unsigned int x;
                    430: unsigned int y;
                    431: int pt;
                    432: {
                    433:     int pointtype = pt;
                    434:     if (MP_inline)
                    435:        MP_endline();
                    436:
                    437:     /* Print the shape defined by 'number'; number < 0 means
                    438:        to use a dot, otherwise one of the defined points. */
                    439:
                    440:     if (pointtype >= MP_POINT_TYPES)
                    441:        pointtype %= MP_POINT_TYPES;
                    442:     fprintf(gpoutfile, "gpdraw(%d,%da,%db);\n", pointtype, x, y);
                    443: }
                    444:
                    445: TERM_PUBLIC void
                    446: MP_pointsize(ps)
                    447: double ps;
                    448: {
                    449:     if (MP_oldptsize != ps) {
                    450:        if (MP_inline)
                    451:            MP_endline();
                    452:        fprintf(gpoutfile, "ptsize %g;\n", ps);
                    453:        MP_oldptsize = ps;
                    454:     }
                    455: }
                    456:
                    457:
                    458: TERM_PUBLIC void
                    459: MP_linewidth(lw)
                    460: double lw;
                    461: {
                    462:     if (MP_oldpen != lw) {
                    463:        if (MP_inline)
                    464:            MP_endline();
                    465:        fprintf(gpoutfile, "scalepen %g;\n", lw);
                    466:        MP_oldpen = lw;
                    467:     }
                    468: }
                    469:
                    470:
                    471: TERM_PUBLIC void
                    472: MP_vector(ux, uy)
                    473: unsigned int ux;
                    474: unsigned int uy;
                    475: {
                    476:     if ((ux == MP_posx) && (uy == MP_posy))
                    477:        return;                 /* Zero length line */
                    478:
                    479:     if (MP_inline) {
                    480:        if (MP_linecount++ >= MP_LINEMAX) {
                    481:            fputs("\n", gpoutfile);
                    482:            MP_linecount = 1;
                    483:        }
                    484:     } else {
                    485:        MP_inline = TRUE;
                    486:        fprintf(gpoutfile, "draw (%da,%db)", MP_posx, MP_posy);
                    487:        MP_linecount = 2;
                    488:     }
                    489:     MP_posx = ux;
                    490:     MP_posy = uy;
                    491:     fprintf(gpoutfile, "--(%da,%db)", MP_posx, MP_posy);
                    492: }
                    493:
                    494: static void
                    495: MP_endline()
                    496: {
                    497:     MP_inline = FALSE;
                    498:     fprintf(gpoutfile, ";\n");
                    499: }
                    500:
                    501: TERM_PUBLIC void
                    502: MP_arrow(sx, sy, ex, ey, head)
                    503: unsigned int sx;
                    504: unsigned int sy;
                    505: unsigned int ex;
                    506: unsigned int ey;
                    507: TBOOLEAN head;
                    508: {
                    509:     MP_move(sx, sy);
                    510:     if (head) {
                    511:        fprintf(gpoutfile, "drawarrow (%da,%db)--(%da,%db);\n",
                    512:                sx, sy, ex, ey);
                    513:     } else if ((sx != ex) || (sy != ey)) {
                    514:        fprintf(gpoutfile, "draw (%da,%db)--(%da,%db);\n",
                    515:                sx, sy, ex, ey);
                    516:     }                          /* else: arrow with no length and no head = sound of one hand clapping? */
                    517:     MP_posx = ex;
                    518:     MP_posy = ey;
                    519:
                    520: }
                    521:
                    522: TERM_PUBLIC void
                    523: MP_put_text(x, y, str)
                    524: unsigned int x, y;
                    525: char str[];
                    526: {
                    527:     int i, j = 0;
                    528:     char *text;
                    529:
                    530:     /* ignore empty strings */
                    531:     if (!str || !*str)
                    532:        return;
                    533:
                    534:     /* F***. why do drivers need to modify string args? */
                    535:     text = gp_alloc(strlen(str)+1, "temp string");
                    536:     strcpy(text,str);
                    537:
                    538:     if (MP_inline)
                    539:        MP_endline();
                    540:
                    541:
                    542:     switch (MP_justify) {
                    543:     case LEFT:
                    544:        j = 1;
                    545:        break;
                    546:     case CENTRE:
                    547:        j = 2;
                    548:        break;
                    549:     case RIGHT:
                    550:        j = 3;
                    551:        break;
                    552:     }
                    553:     if (MP_notex) {
                    554:        for (i = 0; i < strlen(text); i++)
                    555:            if (text[i] == '"')
                    556:                text[i] = '\''; /* Replace " with ' */
                    557:        if (MP_fontchanged) {
                    558:            fprintf(gpoutfile, "\
                    559: put_text(\"%s\" infontsize(\"%s\",%5.2f), %da, %db, %d, %d);\n",
                    560:                    text, MP_fontname, MP_fontsize, x, y, MP_ang, j);
                    561:        } else {
                    562:            fprintf(gpoutfile, "put_text(\"%s\", %da, %db, %d, %d);\n",
                    563:                    text, x, y, MP_ang, j);
                    564:        }
                    565:     } else if (MP_fontchanged) {
                    566:        fprintf(gpoutfile, "\
                    567: put_text( btex \\setfont{%s}{%5.2f} %s etex, %da, %db, %d, %d);\n",
                    568:                MP_fontname, MP_fontsize, text, x, y, MP_ang, j);
                    569:     } else {
                    570:        fprintf(gpoutfile, "put_text( btex %s etex, %da, %db, %d, %d);\n",
                    571:                text, x, y, MP_ang, j);
                    572:     }
                    573:
                    574:     free(text);
                    575: }
                    576:
                    577: TERM_PUBLIC int
                    578: MP_justify_text(mode)
                    579: enum JUSTIFY mode;
                    580: {
                    581:     MP_justify = mode;
                    582:     return (TRUE);
                    583: }
                    584:
                    585: TERM_PUBLIC int
                    586: MP_text_angle(ang)
                    587: int ang;
                    588: {
                    589:     /* Metapost code does the conversion */
                    590:     MP_ang = ang;
                    591:     return (TRUE);
                    592: }
                    593:
                    594: TERM_PUBLIC int
                    595: MP_set_font(font)
                    596: char *font;
                    597: {
                    598:     if (*font) {
                    599:        size_t sep = strcspn(font, ",");
                    600:        strncpy(MP_fontname, font, sep);
                    601:        MP_fontname[sep] = NUL;
                    602:        sscanf(&(font[sep + 1]), "%lf", &MP_fontsize);
                    603:        if (MP_fontsize < 5)
                    604:            MP_fontsize = 5.0;
                    605:        if (MP_fontsize >= 100)
                    606:            MP_fontsize = 99.99;
                    607:        /*  */
                    608:        MP_fontchanged = TRUE;
                    609:     } else {
                    610:        MP_fontchanged = FALSE;
                    611:     }
                    612:     return TRUE;
                    613: }
                    614:
                    615:
                    616: TERM_PUBLIC void
                    617: MP_reset()
                    618: {
                    619:     fputs("end.\n", gpoutfile);
                    620: }
                    621:
                    622: TERM_PUBLIC void
                    623: MP_boxfill(sty, x1, y1, wd, ht)
                    624: int sty;
                    625: unsigned int x1, y1, wd, ht;
                    626: {
                    627:     /* for now simply clear box if sty <= 0, do nothing otherwise */
                    628:     if (MP_inline)
                    629:        MP_endline();
                    630:     if (sty <= 0)
                    631:        fprintf(gpoutfile, "\
                    632: fill (%da,%db)--(%da,%db)--(%da,%db)--(%da,%db)--cycle withcolor background;\n",
                    633:                x1, y1, x1 + wd, y1, x1 + wd, y1 + ht, x1, y1 + ht);
                    634: }
                    635:
                    636: #endif /* TERM_BODY */
                    637:
                    638: #ifdef TERM_TABLE
                    639:
                    640: TERM_TABLE_START(mp_driver)
                    641:     "mp", "MetaPost plotting standard",
                    642:     MP_XMAX, MP_YMAX, MP_VCHAR, MP_HCHAR,
                    643:     MP_VTIC, MP_HTIC, MP_options, MP_init, MP_reset,
                    644:     MP_text, null_scale, MP_graphics, MP_move, MP_vector,
                    645:     MP_linetype, MP_put_text, MP_text_angle,
                    646:     MP_justify_text, MP_point, MP_arrow, MP_set_font, MP_pointsize,
                    647:     0, 0, 0, MP_boxfill, MP_linewidth
                    648:     TERM_TABLE_END(mp_driver)
                    649: #undef LAST_TERM
                    650: #define LAST_TERM mp_driver
                    651:
                    652: #endif /* TERM_TABLE */
                    653: #endif /* TERM_PROTO_ONLY */
                    654:
                    655: #ifdef TERM_HELP
                    656: START_HELP(mp)
                    657: "1 mp",
                    658: "?commands set terminal mpost",
                    659: "?set terminal mp",
                    660: "?set term mp",
                    661: "?terminal mp",
                    662: "?term mp",
                    663: "?mp",
                    664: "?metapost",
                    665: "",
                    666: " The `mp` driver produces output intended to be input to the Metapost program.",
                    667: " Running Metapost on the file creates EPS files containing the plots. By",
                    668: " default, Metapost passes all text through TeX.  This has the advantage of",
                    669: " allowing essentially  any TeX symbols in titles and labels.",
                    670: "",
                    671: " The `mp` terminal is selected with a command of the form",
                    672: "    set term mp {color} {solid} {notex} {mag <magsize>} {\"<name>\"} {<size>}",
                    673: " The option `color` causes lines to be drawn in color (on a printer or display",
                    674: " that supports it), `monochrome` (or nothing) selects black lines.  The option",
                    675: " `solid` draws solid lines, while `dashed` (or nothing) selects lines with",
                    676: " different patterns of dashes.  If `solid` is selected but `color` is not,",
                    677: " nearly all lines will be identical.  This may occasionally be useful, so it is",
                    678: " allowed.",
                    679: "",
                    680: " The option `notex` bypasses TeX entirely, therefore no TeX code can be used in",
                    681: " labels under this option.  This is intended for use on old plot files or files",
                    682: " that make frequent use of common characters like `$` and `%` that require",
                    683: " special handling in TeX.",
                    684: "",
                    685: " Changing font sizes in TeX has no effect on the size of mathematics, and there",
                    686: " is no foolproof way to make such a change, except by globally  setting a",
                    687: " magnification factor. This is the purpose of the `magnification` option. It",
                    688: " must be followed by a scaling factor. All text (NOT the graphs) will be scaled",
                    689: " by this factor. Use this if you have math that you want at some size other",
                    690: " than the default 10pt. Unfortunately, all math will be the same size, but see",
                    691: " the discussion below on editing the MP output. `mag` will also work under",
                    692: " `notex` but there seems no point in using it as the font size option (below)",
                    693: " works as well.",
                    694: "",
                    695: " A name in quotes selects the font that will be used when no explicit font is",
                    696: " given in a `set label` or `set title`.  A name recognized by TeX (a TFM file",
                    697: " exists) must be used.  The default is \"cmr10\" unless `notex` is selected,",
                    698: " then it is \"pcrr8r\" (Courier).  Even under `notex`, a TFM file is needed by",
                    699: " Metapost. The file `pcrr8r.tfm` is the name given to Courier in LaTeX's psnfss",
                    700: " package.  If you change the font from the `notex` default, choose a font that",
                    701: " matches the ASCII encoding at least in the range 32-126.  `cmtt10` almost",
                    702: " works, but it has a nonblank character in position 32 (space).",
                    703: "",
                    704: " The size can be any number between 5.0 and 99.99.  If it is omitted, 10.0 is",
                    705: " used.  It is advisable to use `magstep` sizes: 10 times an integer or",
                    706: " half-integer power of 1.2, rounded to two decimals, because those are the most",
                    707: " available sizes of fonts in TeX systems.",
                    708: "",
                    709: " All the options are optional.  If font information is given, it must be at the",
                    710: " end, with size (if present) last.  The size is needed to select a size for the",
                    711: " font, even if the font name includes size information.  For example,",
                    712: " `set term mp \"cmtt12\"` selects cmtt12 shrunk to the default size 10.  This",
                    713: " is probably not what you want or you would have used cmtt10.",
                    714: "",
                    715: " The following common ascii characters need special treatment in TeX:",
                    716: "    $, &, #, %, _;  |, <, >;  ^, ~,  \\, {, and }",
                    717: " The five characters $, #, &, _, and % can simply be escaped, e.g., `\\$`.",
                    718: " The three characters <, >, and | can be wrapped in math mode, e.g., `$<$`.",
                    719: " The remainder require some TeX work-arounds.  Any good book on TeX will give",
                    720: " some guidance.",
                    721: "",
                    722: " If you type your labels inside double quotes, backslashes in TeX code need to",
                    723: " be escaped (doubled). Using single quotes will avoid having to do this, but",
                    724: " then you cannot use `\\n` for line breaks.  As of this writing, version 3.7 of",
                    725: " gnuplot processess titles given in a `plot` command differently than in other",
                    726: " places, and backslashes in TeX commands need to be doubled regardless of the",
                    727: " style of quotes.",
                    728: "",
                    729: " Metapost pictures are typically used in TeX documents.  Metapost deals with",
                    730: " fonts pretty much the same way TeX does, which is different from most other",
                    731: " document preparation programs.  If the picture is included in a LaTeX document",
                    732: " using the graphics package, or in a plainTeX document via epsf.tex, and then",
                    733: " converted to PostScript with dvips (or other dvi-to-ps converter), the text in",
                    734: " the plot will usually be handled correctly.  However, the text may not appear",
                    735: " if you send the Metapost output as-is to a PostScript interpreter.",
                    736: "",
                    737: "2 Metapost Instructions",
                    738: "?commands set terminal mp detailed",
                    739: "?set terminal mp detailed",
                    740: "?set term mp detailed",
                    741: "?mp detailed",
                    742: "?metapost detailed",
                    743: "",
                    744: " - Set your terminal to Metapost, e.g.:",
                    745: "    set terminal mp mono \"cmtt12\" 12",
                    746: "",
                    747: " - Select an output-file, e.g.:",
                    748: "    set output \"figure.mp\"",
                    749: "",
                    750: " - Create your pictures.  Each plot (or multiplot group) will generate a",
                    751: " separate Metapost beginfig...endfig group.  Its default size will be 5 by 3",
                    752: " inches.  You can change the size by saying `set size 0.5,0.5` or whatever",
                    753: " fraction of the default size you want to have.",
                    754: "",
                    755: " - Quit gnuplot.",
                    756: "",
                    757: " - Generate EPS files by running Metapost on the output of gnuplot:",
                    758: "    mpost figure.mp  OR  mp figure.mp",
                    759: " The name of the Metapost program depends on the system, typically `mpost` for",
                    760: " a Unix machine and `mp` on many others.  Metapost will generate one EPS file",
                    761: " for each picture.",
                    762: "",
                    763: " - To include your pictures in your document you can use the graphics package",
                    764: " in LaTeX or epsf.tex in plainTeX:",
                    765: "    \\usepackage{graphics} % LaTeX",
                    766: "    \\input epsf.tex       % plainTeX",
                    767: " If you use a driver other than dvips for converting TeX DVI output to PS, you",
                    768: " may need to add the following line in your LaTeX document:",
                    769: "    \\DeclareGraphicsRule{*}{eps}{*}{}",
                    770: " Each picture you made is in a separate file.  The first picture is in, e.g.,",
                    771: " figure.0, the second in figure.1, and so on....  To place the third picture in",
                    772: " your document, for example, all you have to do is:",
                    773: "    \\includegraphics{figure.2} % LaTeX",
                    774: "    \\epsfbox{figure.2}         % plainTeX",
                    775: "",
                    776: " The advantage, if any, of the mp terminal over a postscript terminal is",
                    777: " editable output.  Considerable effort went into making this output as clean as",
                    778: " possible.  For those knowledgeable in the Metapost language, the default line",
                    779: " types and colors can be changed by editing the arrays `lt[]` and `col[]`.",
                    780: " The choice of solid vs dashed lines, and color vs black lines can be change by",
                    781: " changing the values assigned to the booleans `dashedlines` and `colorlines`.",
                    782: " If the default `tex` option was in effect, global changes to the text of",
                    783: " labels can be achieved by editing the `vebatimtex...etex` block.  In",
                    784: " particular, a LaTeX preamble can be added if desired, and then LaTeX's",
                    785: " built-in size changing commands can be used for maximum flexibility. Be sure",
                    786: " to set the appropriate MP configuration variable to force Metapost to run",
                    787: " LaTeX instead of plainTeX."
                    788: END_HELP(mp)
                    789: #endif /* TERM_HELP */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>