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

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

1.1       maekawa     1: /*
                      2:  * $Id: texdraw.trm,v 1.15 1998/06/18 14:59:26 ddenholm Exp $
                      3:  */
                      4:
                      5: /* GNUPLOT - texdraw.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: /*
                     38:  * This file is included by ../term.c.
                     39:  *
                     40:  * This terminal driver supports:
                     41:  *   The TEXDRAW macros for LaTeX.
                     42:  *
                     43:  * AUTHORS
                     44:  *   Khun Yee Fung. Modified from eepic.trm.
                     45:  *   clipper@csd.uwo.ca
                     46:  *   January 20, 1992
                     47:  *
                     48:  * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
                     49:  *
                     50:  */
                     51:
                     52: /*
                     53:  *  This file contains the texdraw terminal driver, intended for use with the
                     54:  *  texdraw macro package for LaTeX. This is an alternative to the
                     55:  *  latex driver. You need texdraw.sty, and texdraw.tex in the texdraw package.
                     56:  *
                     57:  */
                     58: #include "driver.h"
                     59:
                     60: #ifdef TERM_REGISTER
                     61: register_term(texdraw)
                     62: #endif
                     63:
                     64: #ifdef TERM_PROTO
                     65: TERM_PUBLIC void TEXDRAW_init __PROTO((void));
                     66: TERM_PUBLIC void TEXDRAW_graphics __PROTO((void));
                     67: TERM_PUBLIC void TEXDRAW_text __PROTO((void));
                     68: TERM_PUBLIC void TEXDRAW_linetype __PROTO((int linetype));
                     69: TERM_PUBLIC void TEXDRAW_move __PROTO((unsigned int x, unsigned int y));
                     70: TERM_PUBLIC void TEXDRAW_point __PROTO((unsigned int x, unsigned int y,
                     71:                                        int number));
                     72: TERM_PUBLIC void TEXDRAW_vector __PROTO((unsigned int ux, unsigned int uy));
                     73: TERM_PUBLIC void TEXDRAW_arrow __PROTO((unsigned int sx, unsigned int sy,
                     74:                                        unsigned int ex, unsigned int ey,
                     75:                                        TBOOLEAN head));
                     76: TERM_PUBLIC void TEXDRAW_put_text __PROTO((unsigned int x, unsigned int y,
                     77:                                           char str[]));
                     78: TERM_PUBLIC int TEXDRAW_justify_text __PROTO((enum JUSTIFY mode));
                     79: TERM_PUBLIC int TEXDRAW_text_angle __PROTO((int ang));
                     80: TERM_PUBLIC void TEXDRAW_reset __PROTO((void));
                     81:
                     82: #define TEXDRAW_PTS_PER_INCH (72.27)
                     83: /* resolution of printer we expect to use */
                     84: #define DOTS_PER_INCH (300)
                     85: /* dot size in pt */
                     86: #define TEXDRAW_UNIT (TEXDRAW_PTS_PER_INCH/DOTS_PER_INCH)
                     87:
                     88: /* 5 inches wide by 3 inches high (default) */
                     89: #define TEXDRAW_XMAX (5*DOTS_PER_INCH)
                     90: #define TEXDRAW_YMAX (3*DOTS_PER_INCH)
                     91:
                     92: #define TEXDRAW_HTIC (5*DOTS_PER_INCH/72)      /* (5./TEXDRAW_UNIT) */
                     93: #define TEXDRAW_VTIC (5*DOTS_PER_INCH/72)      /* (5./TEXDRAW_UNIT) */
                     94: #define TEXDRAW_HCHAR (DOTS_PER_INCH*53/10/72) /* (5.3/TEXDRAW_UNIT) */
                     95: #define TEXDRAW_VCHAR (DOTS_PER_INCH*11/72)    /* (11./TEXDRAW_UNIT) */
                     96:
                     97: #define GOT_TEXDRAW_PROTO
                     98: #endif
                     99:
                    100: #ifndef TERM_PROTO_ONLY
                    101: #ifdef TERM_BODY
                    102: static void TEXDRAW_endline __PROTO((void));
                    103: static unsigned int TEXDRAW_posx;
                    104: static unsigned int TEXDRAW_posy;
                    105: enum JUSTIFY TEXDRAW_justify = LEFT;
                    106: enum JUSTIFY TEXDRAW_last_justify = LEFT;
                    107: static int TEXDRAW_angle = 0;
                    108: static float TEXDRAW_scalefactor = 0.2409;
                    109: static double TEXDRAW_xscale = 1.0, TEXDRAW_yscale = 1.0;
                    110:
                    111: /* for DOTS point style */
                    112: #define TEXDRAW_TINY_DOT "\\htext{$\\cdot$}"
                    113:
                    114: /* POINTS */
                    115: #define TEXDRAW_POINT_TYPES 12 /* we supply more point types */
                    116: static char GPFAR *GPFAR TEXDRAW_points[] =
                    117: {
                    118:     "\\rmove(0 4)\\htext{$\\Diamond$}",
                    119:     "\\htext{$+$}",
                    120:     "\\rmove(0 4)\\htext{$\\Box$}",
                    121:     "\\htext{$\\times$}",
                    122:     "\\htext{$\\triangle$}",
                    123:     "\\htext{$\\star$}",
                    124:     "\\lcir r:9",
                    125:     "\\lcir r:12",
                    126:     "\\lcir r:16",
                    127:     "\\fcir f:0.9 r:9",
                    128:     "\\fcir f:0.9 r:12",
                    129:     "\\fcir f:0.9 r:16"
                    130: };
                    131:
                    132: /* LINES */
                    133: #define TEXDRAW_NUMLINES 5     /* number of linetypes below */
                    134: static int TEXDRAW_lines[] =
                    135: {
                    136:     4,                         /* -2 border */
                    137:     3,                         /* -1 axes */
                    138:     3,                         /*  0 solid thin  */
                    139:     4,                         /*  1 solid thick */
                    140:     6,                         /*  2 solid Thick */
                    141: };
                    142:
                    143: /* The line type selected most recently */
                    144: static int TEXDRAW_last_type = 0;
                    145: /* current line type */
                    146: static int TEXDRAW_type;
                    147: /* are we in the middle of a line */
                    148: static TBOOLEAN TEXDRAW_inline = FALSE;
                    149: /* terminate any line in progress */
                    150: static void TEXDRAW_endline __PROTO((void));
                    151: /* number of points in line so far */
                    152: static int TEXDRAW_linecount = 0;
                    153: /* max value for linecount */
                    154: #define TEXDRAW_LINEMAX 5
                    155:
                    156: TERM_PUBLIC void TEXDRAW_init()
                    157: {
                    158:     TEXDRAW_posx = TEXDRAW_posy = 0;
                    159:     TEXDRAW_linetype(-1);
                    160:     fputs("%% GNUPLOT: LaTeX using TEXDRAW macros\n", gpoutfile);
                    161: }
                    162:
                    163: TERM_PUBLIC void TEXDRAW_graphics()
                    164: {
                    165:     static char GPFAR tdg1[] = "\
                    166: \\begin{texdraw}\n\
                    167: \\normalsize\n\
                    168: \\ifx\\pathDEFINED\\relax\\else\\let\\pathDEFINED\\relax\n\
                    169:  \\def\\QtGfr{\\ifx (\\TGre \\let\\YhetT\\cpath\\else\\let\\YhetT\\relax\\fi\\YhetT}\n\
                    170:  \\def\\path (#1 #2){\\move (#1 #2)\\futurelet\\TGre\\QtGfr}\n\
                    171:  \\def\\cpath (#1 #2){\\lvec (#1 #2)\\futurelet\\TGre\\QtGfr}\n\
                    172: \\fi\n\
                    173: \\drawdim pt\n\
                    174: \\setunitscale %2.2f\n\
                    175: \\linewd %d\n\
                    176: \\textref h:L v:C\n";
                    177:     fprintf(gpoutfile, tdg1,
                    178:            TEXDRAW_scalefactor,
                    179:            TEXDRAW_lines[2]);
                    180:     TEXDRAW_last_type = 0;
                    181:     TEXDRAW_type = 0;
                    182: }
                    183:
                    184: TERM_PUBLIC void TEXDRAW_text()
                    185: {
                    186:     TEXDRAW_endline();
                    187:     fputs("\\end{texdraw}\n", gpoutfile);
                    188: }
                    189:
                    190: TERM_PUBLIC void TEXDRAW_linetype(linetype)
                    191: int linetype;
                    192: {
                    193:     TEXDRAW_endline();
                    194:
                    195:     if (linetype >= TEXDRAW_NUMLINES - 2)
                    196:        linetype %= (TEXDRAW_NUMLINES - 2);
                    197:
                    198:     TEXDRAW_type = linetype;
                    199: }
                    200:
                    201: TERM_PUBLIC void TEXDRAW_move(x, y)
                    202: unsigned int x, y;
                    203: {
                    204:     TEXDRAW_endline();
                    205:
                    206:     TEXDRAW_posx = x;
                    207:     TEXDRAW_posy = y;
                    208: }
                    209:
                    210: TERM_PUBLIC void TEXDRAW_point(x, y, number)
                    211: unsigned int x, y;
                    212: int number;
                    213: {
                    214:     TEXDRAW_move(x, y);
                    215:
                    216:     /* Print the character defined by 'number'; number < 0 means
                    217:      * to use a dot, otherwise one of the defined points. */
                    218:     fprintf(gpoutfile, "\\move (%d %d)\n",
                    219:            (int) ((double) x * TEXDRAW_xscale),
                    220:            (int) ((double) y * TEXDRAW_yscale));
                    221:     if (TEXDRAW_last_justify != CENTRE) {
                    222:        fprintf(gpoutfile, "\\textref h:C v:C ");
                    223:        TEXDRAW_last_justify = CENTRE;
                    224:     }
                    225:     fprintf(gpoutfile, "%s\n",
                    226:            (number < 0 ?
                    227:             TEXDRAW_TINY_DOT :
                    228:             TEXDRAW_points[number % TEXDRAW_POINT_TYPES]));
                    229: }
                    230:
                    231: TERM_PUBLIC void TEXDRAW_vector(ux, uy)
                    232: unsigned int ux, uy;
                    233: {
                    234:     if (!TEXDRAW_inline) {
                    235:        TEXDRAW_inline = TRUE;
                    236:
                    237:        /* Start a new line. This depends on line type */
                    238:        if (TEXDRAW_type != TEXDRAW_last_type) {
                    239:            if (TEXDRAW_lines[TEXDRAW_type + 2] != TEXDRAW_lines[TEXDRAW_last_type + 2])
                    240:                fprintf(gpoutfile, "\\linewd %d\n", TEXDRAW_lines[TEXDRAW_type + 2]);
                    241:            TEXDRAW_last_type = TEXDRAW_type;
                    242:        }
                    243:        fprintf(gpoutfile, "\\path (%d %d)",
                    244:                (int) ((double) TEXDRAW_posx * TEXDRAW_xscale),
                    245:                (int) ((double) TEXDRAW_posy * TEXDRAW_yscale));
                    246:        TEXDRAW_linecount = 1;
                    247:     } else {
                    248:        /* Even though we are in middle of a path,
                    249:         * we may want to start a new path command.
                    250:         * If they are too long then latex will choke.
                    251:         */
                    252:        if (TEXDRAW_linecount++ >= TEXDRAW_LINEMAX) {
                    253:            fputs("\n\\cpath ", gpoutfile);
                    254:            TEXDRAW_linecount = 1;
                    255:        }
                    256:     }
                    257:     fprintf(gpoutfile, "(%d %d)",
                    258:            (int) ((double) ux * TEXDRAW_xscale),
                    259:            (int) ((double) uy * TEXDRAW_yscale));
                    260:     TEXDRAW_posx = ux;
                    261:     TEXDRAW_posy = uy;
                    262: }
                    263:
                    264: static void TEXDRAW_endline()
                    265: {
                    266:     if (TEXDRAW_inline) {
                    267:        putc('\n', gpoutfile);
                    268:        TEXDRAW_inline = FALSE;
                    269:     }
                    270: }
                    271:
                    272: TERM_PUBLIC void TEXDRAW_arrow(sx, sy, ex, ey, head)
                    273: unsigned int sx, sy, ex, ey;
                    274: TBOOLEAN head;
                    275: {
                    276:     char text;
                    277:
                    278:     if (head)
                    279:        text = 'a';
                    280:     else
                    281:        text = 'l';
                    282:     fprintf(gpoutfile, "\\move (%d %d)\\%cvec (%d %d)",
                    283:            (int) ((double) sx * TEXDRAW_xscale),
                    284:            (int) ((double) sy * TEXDRAW_yscale),
                    285:            text,
                    286:            (int) ((double) ex * TEXDRAW_xscale),
                    287:            (int) ((double) ey * TEXDRAW_yscale));
                    288:     TEXDRAW_posx = ex;
                    289:     TEXDRAW_posy = ey;
                    290: }
                    291:
                    292: TERM_PUBLIC void TEXDRAW_put_text(x, y, str)
                    293: unsigned int x, y;             /* reference point of string */
                    294: char str[];                    /* the text */
                    295: {
                    296:     char text;
                    297:
                    298:     TEXDRAW_endline();
                    299:
                    300:     fprintf(gpoutfile, "\\move (%d %d)",
                    301:            (int) ((double) x * TEXDRAW_xscale),
                    302:            (int) ((double) y * TEXDRAW_yscale));
                    303:
                    304:     if (!TEXDRAW_angle)
                    305:        text = 'h';
                    306:     else
                    307:        text = 'v';
                    308:
                    309:     if (TEXDRAW_last_justify != TEXDRAW_justify) {
                    310:        TEXDRAW_last_justify = TEXDRAW_justify;
                    311:        if (TEXDRAW_justify == LEFT)
                    312:            fputs("\\textref h:L v:C ", gpoutfile);
                    313:        else if (TEXDRAW_justify == CENTRE)
                    314:            fputs("\\textref h:C v:C ", gpoutfile);
                    315:        else if (TEXDRAW_justify == RIGHT)
                    316:            fputs("\\textref h:R v:C ", gpoutfile);
                    317:     }
                    318:     fprintf(gpoutfile, "\\%ctext{%s}\n", text, str);
                    319: }
                    320:
                    321:
                    322: TERM_PUBLIC int TEXDRAW_justify_text(mode)
                    323: enum JUSTIFY mode;
                    324: {
                    325:     TEXDRAW_justify = mode;
                    326:     return (TRUE);
                    327: }
                    328:
                    329: TERM_PUBLIC int TEXDRAW_text_angle(ang)
                    330: int ang;
                    331: {
                    332:     TEXDRAW_angle = ang;
                    333:     return (TRUE);
                    334: }
                    335:
                    336: TERM_PUBLIC void TEXDRAW_reset()
                    337: {
                    338:     TEXDRAW_endline();
                    339:     TEXDRAW_posx = TEXDRAW_posy = 0;
                    340: }
                    341:
                    342: #endif /* TERM_BODY */
                    343:
                    344: #ifdef TERM_TABLE
                    345:
                    346: TERM_TABLE_START(texdraw_driver)
                    347:     "texdraw",
                    348:     "LaTeX texdraw environment",
                    349:     TEXDRAW_XMAX, TEXDRAW_YMAX, TEXDRAW_VCHAR, TEXDRAW_HCHAR,
                    350:     TEXDRAW_VTIC, TEXDRAW_HTIC, options_null, TEXDRAW_init, TEXDRAW_reset,
                    351:     TEXDRAW_text, null_scale, TEXDRAW_graphics, TEXDRAW_move, TEXDRAW_vector,
                    352:     TEXDRAW_linetype, TEXDRAW_put_text, TEXDRAW_text_angle,
                    353:     TEXDRAW_justify_text, TEXDRAW_point, TEXDRAW_arrow, set_font_null
                    354: TERM_TABLE_END(texdraw_driver)
                    355:
                    356: #undef LAST_TERM
                    357: #define LAST_TERM texdraw_driver
                    358:
                    359: #endif /* TERM_TABLE */
                    360:
                    361: #endif /* TERM_PROTO_ONLY */
                    362:
                    363: #ifdef TERM_HELP
                    364: START_HELP(texdraw)
                    365: "1 texdraw",
                    366: "?commands set terminal texdraw",
                    367: "?set terminal texdraw",
                    368: "?set term texdraw",
                    369: "?terminal texdraw",
                    370: "?term texdraw",
                    371: "?texdraw",
                    372: " The `texdraw` terminal driver supports the LaTeX texdraw environment.  It is",
                    373: " intended for use with \"texdraw.sty\" and \"texdraw.tex\" in the texdraw package.",
                    374: "",
                    375: " It has no options."
                    376: END_HELP(texdraw)
                    377: #endif /* TERM_HELP */

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