Annotation of OpenXM_contrib/gnuplot/term/tpic.trm, Revision 1.1
1.1 ! maekawa 1: /*
! 2: * $Id: tpic.trm,v 1.19 1998/04/14 00:18:12 drd Exp $
! 3: */
! 4:
! 5: /* GNUPLOT - tpic.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 tpic \specials (version 2.2) for LaTeX.
! 42: *
! 43: * AUTHORS
! 44: * Oh-Yeah? 3 Sep. 1992 (closely following eepic.trm by David Kotz)
! 45: * A. Woo 5 Oct. 1992 (removed ansi prototypes for braindead compilers)
! 46: *
! 47: * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
! 48: *
! 49: */
! 50: /*
! 51: * This file contains the tpic terminal driver for use with LaTeX.
! 52: * This is an alternative to the latex and eepic drivers. You need
! 53: * a printer driver that supports the tpic \specials version 2.2.
! 54: *
! 55: * Comparison with the eepic driver (eepic.trm):
! 56: * Merits
! 57: * - More point and line types
! 58: * - Options to change point size, linewidth, dot & dash intervals
! 59: * - Dotted and dashed lines for high-sample-rate curves (but may
! 60: * depend on tpic (da & dt) implementation of your dvi driver :-)
! 61: * - Overlapped points made fancier by tpic shading facility
! 62: * - Optional comments for trimming figure margins
! 63: * - No need for epic and eepic macros
! 64: * Drawback
! 65: * - You cannot use eepicemu macro for non-tpic-support dvi drivers
! 66: *
! 67: * LATEX must also be defined.
! 68: */
! 69:
! 70:
! 71: /* These parameters can be modified as you like, through options. Say
! 72: "set terminal tpic <pointsize> <linewidth> <interval>". <pointsize>
! 73: and <linewidth> are integers in milli-inches; <interval> is a float
! 74: in inches. If non-positive value is specified, the default (below)
! 75: is chosen.
! 76: */
! 77:
! 78: /*
! 79: * adapted to the new terminal layout by Stefan Bodewig (Dec. 1995)
! 80: */
! 81:
! 82: #include "driver.h"
! 83:
! 84: #ifdef TERM_REGISTER
! 85: register_term(tpic)
! 86: #endif
! 87:
! 88: #ifdef TERM_PROTO
! 89: TERM_PUBLIC void TPIC_options __PROTO((void)); /* get size options */
! 90: TERM_PUBLIC void TPIC_init __PROTO((void));
! 91: TERM_PUBLIC void TPIC_reset __PROTO((void));
! 92: TERM_PUBLIC void TPIC_text __PROTO((void));
! 93: TERM_PUBLIC void TPIC_graphics __PROTO((void));
! 94: TERM_PUBLIC void TPIC_move __PROTO((unsigned int x, unsigned int y));
! 95: TERM_PUBLIC void TPIC_vector __PROTO((unsigned int ux, unsigned int uy));
! 96: TERM_PUBLIC void TPIC_linetype __PROTO((int linetype));
! 97: TERM_PUBLIC void TPIC_put_text __PROTO((unsigned int x, unsigned int y, char *str)); /* ref point and text */
! 98: TERM_PUBLIC int TPIC_text_angle __PROTO((int ang));
! 99: TERM_PUBLIC int TPIC_justify_text __PROTO((enum JUSTIFY mode));
! 100: TERM_PUBLIC void TPIC_point __PROTO((unsigned int x, unsigned int y, int number));
! 101: TERM_PUBLIC void TPIC_arrow __PROTO((unsigned int sx, unsigned int sy, unsigned int ex, unsigned int ey, TBOOLEAN head));
! 102:
! 103: /* tpic \specials unit in inches (1 milli-inch) */
! 104: #define TPIC_UNIT 0.001
! 105:
! 106: /* 5 inches wide by 3 inches high (default) */
! 107: #define TPIC_XMAX (unsigned int) (5 / TPIC_UNIT)
! 108: #define TPIC_YMAX (unsigned int) (3 / TPIC_UNIT)
! 109: #define TPIC_PTS_PER_UNIT (72.27 * TPIC_UNIT)
! 110: #define TPIC_HTIC (unsigned int) ( 5.0 / TPIC_PTS_PER_UNIT) /* 5pt */
! 111: #define TPIC_VTIC (unsigned int) ( 5.0 / TPIC_PTS_PER_UNIT) /* 5pt */
! 112: #define TPIC_HCHAR (unsigned int) ( 5.3 / TPIC_PTS_PER_UNIT) /* 5.3pt */
! 113: #define TPIC_VCHAR (unsigned int) (11.0 / TPIC_PTS_PER_UNIT) /* 11pt */
! 114: #endif /* TERM_PROTO */
! 115:
! 116: #ifndef TERM_PROTO_ONLY
! 117: #ifdef TERM_BODY
! 118: static int tpic_pointsize = 40; /* min point radius (in milli-inches) */
! 119: static int tpic_linewidth = 6; /* min line thickness (in milli-inches) */
! 120: static double tpic_interval = 0.1; /* min dot & dash intervals (in inches) */
! 121:
! 122: /* ARROWS: same code as for LATEX */
! 123: /* figure out the best arrow. in latex.trm */
! 124: void best_latex_arrow __PROTO((int sx, int sy, int ex, int ey, int who, TBOOLEAN head));
! 125:
! 126: /* all prototypes ... */
! 127: static void tpic_startline __PROTO((void)); /* private */
! 128: static void tpic_endline __PROTO((void)); /* private */
! 129: static void tpic_pushpath __PROTO((unsigned int x, unsigned int y)); /* private */
! 130: static void tpic_scanpath __PROTO((void));
! 131: void tpic_diamond __PROTO((int size));
! 132: void tpic_plus __PROTO((int size));
! 133: void tpic_box __PROTO((int size));
! 134: void tpic_times __PROTO((int size));
! 135: void tpic_triangle __PROTO((int size));
! 136: void tpic_star __PROTO((int size));
! 137: void tpic_hexagon __PROTO((int size));
! 138: void tpic_circle __PROTO((int size));
! 139: void tpic_doublecircle __PROTO((int size));
! 140: void tpic_vercircle __PROTO((int size)); /* circle with | */
! 141: void tpic_horcircle __PROTO((int size)); /* circle with - */
! 142: void tpic_pluscircle __PROTO((int size)); /* circle with + */
! 143: void tpic_timescircle __PROTO((int size)); /* circle with times */
! 144: void tpic_starcircle __PROTO((int size)); /* circle with star */
! 145: void tpic_dotcircle __PROTO((int size)); /* circle with dot (black circle) */
! 146: void tpic_diamondcircle __PROTO((int size)); /* circle with black diamond */
! 147: void tpic_boxcircle __PROTO((int size)); /* circle with black box */
! 148: void tpic_trianglecircle __PROTO((int size)); /* circle with black triangle */
! 149: void tpic_hexagoncircle __PROTO((int size)); /* circle with black hexagon */
! 150: void tpic_plustimescircle __PROTO((int size)); /* no more idea ... with plus & times */
! 151: void tpic_abspath __PROTO((unsigned int x, unsigned int y)); /* absolute coord */
! 152: void tpic_path __PROTO((int x, int y));
! 153: void tpic_flush __PROTO((void));
! 154: void tpic_arc __PROTO((int radius)); /* actually, draw a full circle */
! 155: void tpic_shade __PROTO((double grayscale));
! 156: void tpic_pen __PROTO((int thickness));
! 157: void tpic_dottedflush __PROTO((double interval));
! 158: void tpic_dashedflush __PROTO((double interval));
! 159:
! 160: typedef enum {
! 161: tpic_none, tpic_white, tpic_gray, tpic_black
! 162: } tpic_shadestyle;
! 163: typedef enum {
! 164: tpic_nosize, tpic_small, tpic_medium, tpic_large
! 165: } tpic_size;
! 166: typedef void (*tpic_function) __PROTO((int size));
! 167:
! 168: typedef struct {
! 169: tpic_shadestyle shadestyle;
! 170: tpic_size size;
! 171: tpic_function function;
! 172: } tpic_point_info;
! 173:
! 174: /* POINTS */
! 175: static /*GPFAR */ tpic_point_info GPFAR tpic_point[] =
! 176: {
! 177: {tpic_white, tpic_medium, tpic_diamond},
! 178: {tpic_none, tpic_medium, tpic_plus},
! 179: {tpic_white, tpic_medium, tpic_box},
! 180: {tpic_none, tpic_medium, tpic_times},
! 181: {tpic_white, tpic_medium, tpic_triangle},
! 182: {tpic_none, tpic_medium, tpic_star},
! 183: {tpic_white, tpic_small, tpic_circle},
! 184: {tpic_white, tpic_medium, tpic_circle},
! 185: {tpic_white, tpic_large, tpic_circle},
! 186: {tpic_black, tpic_small, tpic_circle},
! 187: {tpic_black, tpic_medium, tpic_circle},
! 188: {tpic_black, tpic_large, tpic_circle},
! 189: {tpic_black, tpic_medium, tpic_diamond},
! 190: {tpic_black, tpic_medium, tpic_box},
! 191: {tpic_black, tpic_medium, tpic_triangle},
! 192: {tpic_white, tpic_medium, tpic_hexagon},
! 193: {tpic_black, tpic_medium, tpic_hexagon},
! 194: {tpic_white, tpic_medium, tpic_doublecircle},
! 195: {tpic_white, tpic_medium, tpic_vercircle},
! 196: {tpic_white, tpic_medium, tpic_horcircle},
! 197: {tpic_white, tpic_medium, tpic_pluscircle},
! 198: {tpic_white, tpic_medium, tpic_timescircle},
! 199: {tpic_white, tpic_medium, tpic_starcircle},
! 200: {tpic_black, tpic_medium, tpic_doublecircle},
! 201: {tpic_white, tpic_medium, tpic_dotcircle},
! 202: {tpic_white, tpic_medium, tpic_diamondcircle},
! 203: {tpic_white, tpic_medium, tpic_boxcircle},
! 204: {tpic_white, tpic_medium, tpic_trianglecircle},
! 205: {tpic_white, tpic_medium, tpic_hexagoncircle},
! 206: {tpic_white, tpic_medium, tpic_plustimescircle}
! 207: };
! 208:
! 209: typedef enum {
! 210: tpic_solid, tpic_dotted, tpic_dashed,
! 211: tpic_dashed_sdot, tpic_dashed_ddot
! 212: } tpic_linestyle;
! 213: typedef struct {
! 214: tpic_size thickness, interval;
! 215: tpic_linestyle linestyle;
! 216: } tpic_line_info;
! 217:
! 218: /* LINES */
! 219: static /*GPFAR */ tpic_line_info GPFAR tpic_line[] =
! 220: {
! 221: {tpic_medium, tpic_nosize, tpic_solid}, /* -2 border */
! 222: {tpic_small, tpic_small, tpic_dashed}, /* -1 axes */
! 223: {tpic_small, tpic_nosize, tpic_solid},
! 224: {tpic_medium, tpic_nosize, tpic_solid},
! 225: {tpic_large, tpic_nosize, tpic_solid},
! 226: {tpic_small, tpic_small, tpic_dotted},
! 227: {tpic_medium, tpic_small, tpic_dotted},
! 228: {tpic_large, tpic_small, tpic_dotted},
! 229: {tpic_small, tpic_small, tpic_dashed},
! 230: {tpic_medium, tpic_small, tpic_dashed},
! 231: {tpic_large, tpic_small, tpic_dashed},
! 232: {tpic_small, tpic_small, tpic_dashed_sdot}, /* dash with single dots */
! 233: {tpic_medium, tpic_small, tpic_dashed_sdot},
! 234: {tpic_large, tpic_small, tpic_dashed_sdot},
! 235: {tpic_small, tpic_small, tpic_dashed_ddot}, /* dash with double dots */
! 236: {tpic_medium, tpic_small, tpic_dashed_ddot},
! 237: {tpic_large, tpic_small, tpic_dashed_ddot},
! 238: {tpic_small, tpic_medium, tpic_dotted},
! 239: {tpic_medium, tpic_medium, tpic_dotted},
! 240: {tpic_large, tpic_medium, tpic_dotted},
! 241: {tpic_small, tpic_medium, tpic_dashed},
! 242: {tpic_medium, tpic_medium, tpic_dashed},
! 243: {tpic_large, tpic_medium, tpic_dashed},
! 244: {tpic_small, tpic_medium, tpic_dashed_sdot},
! 245: {tpic_medium, tpic_medium, tpic_dashed_sdot},
! 246: {tpic_large, tpic_medium, tpic_dashed_sdot},
! 247: {tpic_small, tpic_medium, tpic_dashed_ddot},
! 248: {tpic_medium, tpic_medium, tpic_dashed_ddot},
! 249: {tpic_large, tpic_medium, tpic_dashed_ddot},
! 250: {tpic_small, tpic_large, tpic_dotted},
! 251: {tpic_medium, tpic_large, tpic_dotted},
! 252: {tpic_large, tpic_large, tpic_dotted},
! 253: {tpic_small, tpic_large, tpic_dashed},
! 254: {tpic_medium, tpic_large, tpic_dashed},
! 255: {tpic_large, tpic_large, tpic_dashed},
! 256: {tpic_small, tpic_large, tpic_dashed_sdot},
! 257: {tpic_medium, tpic_large, tpic_dashed_sdot},
! 258: {tpic_large, tpic_large, tpic_dashed_sdot},
! 259: {tpic_small, tpic_large, tpic_dashed_ddot},
! 260: {tpic_medium, tpic_large, tpic_dashed_ddot},
! 261: {tpic_large, tpic_large, tpic_dashed_ddot}
! 262: };
! 263:
! 264: TERM_PUBLIC void TPIC_options()
! 265: { /* get size options */
! 266: struct value a;
! 267: int ptsize, linewidth;
! 268: double interval;
! 269:
! 270: if (!END_OF_COMMAND) {
! 271: ptsize = (int) real(const_express(&a));
! 272: if (ptsize > 0)
! 273: tpic_pointsize = ptsize;
! 274: }
! 275: if (!END_OF_COMMAND) {
! 276: linewidth = (int) real(const_express(&a));
! 277: if (linewidth > 0)
! 278: tpic_linewidth = linewidth;
! 279: }
! 280: if (!END_OF_COMMAND) {
! 281: interval = (double) real(const_express(&a));
! 282: if (interval > 0)
! 283: tpic_interval = interval;
! 284: }
! 285: sprintf(term_options, "%d %d %f", tpic_pointsize, tpic_linewidth,
! 286: tpic_interval);
! 287: }
! 288:
! 289: static unsigned int tpic_posx; /* current position */
! 290: static unsigned int tpic_posy;
! 291: static int tpic_point_types;
! 292: static int tpic_numlines;
! 293:
! 294: TERM_PUBLIC void TPIC_init()
! 295: {
! 296: static char GPFAR tpic1[] = "\
! 297: %% GNUPLOT: LaTeX picture using tpic \\specials\n\
! 298: %% with %d point types and %d line types\n\
! 299: %% Options: pointsize = %d, linewidth = %d, interval = %f\n\
! 300: %% To change above options, say:\n\
! 301: %% set terminal tpic pointsize_value linewidth_value interval_value\n\
! 302: %% (pointsize and linewidth - integers in milli-inches.\n\
! 303: %% interval - a float in inches. If zero is specified, \n\
! 304: %% the default value is chosen.)\n\
! 305: \\setlength{\\unitlength}{%fin}%%\n";
! 306: tpic_point_types = sizeof(tpic_point) / sizeof(tpic_point[0]);
! 307: tpic_numlines = sizeof(tpic_line) / sizeof(tpic_line[0]);
! 308:
! 309: tpic_posx = tpic_posy = 0;
! 310: TPIC_linetype(-1);
! 311: fprintf(gpoutfile, tpic1,
! 312: tpic_point_types, tpic_numlines - 2,
! 313: tpic_pointsize, tpic_linewidth, tpic_interval,
! 314: TPIC_UNIT);
! 315: }
! 316:
! 317: TERM_PUBLIC void TPIC_reset()
! 318: {
! 319: tpic_endline();
! 320: tpic_posx = tpic_posy = 0;
! 321: }
! 322:
! 323: TERM_PUBLIC void TPIC_text()
! 324: {
! 325: tpic_endline();
! 326: fputs("\\end{picture}\n", gpoutfile);
! 327: }
! 328:
! 329: TERM_PUBLIC void TPIC_graphics()
! 330: {
! 331: register struct termentry *t = term;
! 332: int left, right, top, bottom; /* margins */
! 333: static char GPFAR begin[] = "%s\\begin{picture}(%d,%d)(%d,%d)%% %s\n";
! 334:
! 335: fprintf(gpoutfile, begin, "", t->xmax, t->ymax, 0, 0, "");
! 336:
! 337: /* the following is dependent on boundary() function in graphics.c */
! 338: left = TPIC_HCHAR * 12;
! 339: right = TPIC_HCHAR * 2 + TPIC_HTIC;
! 340: bottom = TPIC_VCHAR * 7 / 2 + 1;
! 341: top = TPIC_VCHAR * 5 / 2 - 1;
! 342: fprintf(gpoutfile, begin, "%% ", t->xmax - left, t->ymax, left, 0,
! 343: "trim left margin");
! 344: fprintf(gpoutfile, begin, "%% ", t->xmax - right, t->ymax, 0, 0,
! 345: "trim right margin");
! 346: fprintf(gpoutfile, begin, "%% ", t->xmax - left - right, t->ymax, left, 0,
! 347: "trim left & right margins");
! 348: fprintf(gpoutfile, begin, "%% ", t->xmax, t->ymax - top, 0, 0,
! 349: "trim top margin");
! 350: fprintf(gpoutfile, begin, "%% ", t->xmax, t->ymax - bottom, 0, bottom,
! 351: "trim bottom margin");
! 352: fprintf(gpoutfile, begin, "%% ", t->xmax, t->ymax - top - bottom, 0, bottom,
! 353: "trim top & bottom margins");
! 354:
! 355: fputs("\\footnotesize%\n", gpoutfile);
! 356: }
! 357:
! 358: TERM_PUBLIC void TPIC_move(x, y)
! 359: unsigned int x;
! 360: unsigned int y;
! 361: {
! 362: tpic_endline();
! 363: tpic_posx = x;
! 364: tpic_posy = y;
! 365: }
! 366:
! 367: #define TPIC_LINEMAX 100 /* max value for linecount */
! 368: static TBOOLEAN tpic_inline = FALSE; /* are we in the middle of a line */
! 369: static int tpic_linecount = 0; /* number of points in line so far */
! 370:
! 371: TERM_PUBLIC void TPIC_vector(ux, uy)
! 372: unsigned int ux;
! 373: unsigned int uy;
! 374: {
! 375: if (!tpic_inline) {
! 376: tpic_startline();
! 377: } else if (tpic_linecount >= TPIC_LINEMAX) {
! 378: /* Even though we are in middle of a path, we may start a new path
! 379: command once in a while; if they are too long, latex will choke. */
! 380: tpic_endline();
! 381: tpic_startline();
! 382: }
! 383: tpic_pushpath(ux, uy);
! 384: tpic_posx = ux;
! 385: tpic_posy = uy;
! 386: }
! 387:
! 388: static int tpic_linetype; /* current line type */
! 389:
! 390: static void tpic_startline()
! 391: { /* private */
! 392: int thickness = 1;
! 393:
! 394: tpic_inline = TRUE;
! 395: switch (tpic_line[tpic_linetype + 2].thickness) {
! 396: case tpic_small:
! 397: thickness = tpic_linewidth;
! 398: break;
! 399: case tpic_medium:
! 400: thickness = (int) (tpic_linewidth * 3);
! 401: break;
! 402: case tpic_large:
! 403: thickness = (int) (tpic_linewidth * 5);
! 404: break;
! 405: default:
! 406: break;
! 407: }
! 408: tpic_pen(thickness);
! 409: tpic_linecount = 0;
! 410: tpic_pushpath(tpic_posx, tpic_posy);
! 411: return;
! 412: }
! 413:
! 414: static void tpic_endline()
! 415: { /* private */
! 416: double interval = 1;
! 417:
! 418: if (tpic_inline) {
! 419: tpic_scanpath(); /* draw actually */
! 420: switch (tpic_line[tpic_linetype + 2].interval) {
! 421: case tpic_small:
! 422: interval = tpic_interval;
! 423: break;
! 424: case tpic_medium:
! 425: interval = tpic_interval * 2;
! 426: break;
! 427: case tpic_large:
! 428: interval = tpic_interval * 3;
! 429: break;
! 430: case tpic_nosize:
! 431: break;
! 432: }
! 433: switch (tpic_line[tpic_linetype + 2].linestyle) {
! 434: case tpic_solid:
! 435: tpic_flush();
! 436: break;
! 437: case tpic_dotted:
! 438: tpic_dottedflush(interval);
! 439: break;
! 440: case tpic_dashed:
! 441: tpic_dashedflush(interval);
! 442: break;
! 443: case tpic_dashed_sdot: /* dashed with single dots in between */
! 444: tpic_dashedflush(interval);
! 445: tpic_scanpath(); /* draw again */
! 446: tpic_dottedflush(interval / 2);
! 447: break;
! 448: case tpic_dashed_ddot: /* dashed with double dots in between */
! 449: tpic_dashedflush(interval);
! 450: tpic_scanpath(); /* draw again */
! 451: tpic_dottedflush(interval / 3);
! 452: break;
! 453: }
! 454: tpic_inline = FALSE;
! 455: }
! 456: return;
! 457: }
! 458:
! 459: /* private: stack functions */
! 460: static unsigned int pathpoint[TPIC_LINEMAX][2]; /* point stack */
! 461:
! 462: static void tpic_pushpath(x, y)
! 463: unsigned int x;
! 464: unsigned int y; /* private */
! 465: {
! 466: if (tpic_linecount < TPIC_LINEMAX) {
! 467: pathpoint[tpic_linecount][0] = x;
! 468: pathpoint[tpic_linecount][1] = y;
! 469: tpic_linecount++;
! 470: }
! 471: return;
! 472: }
! 473:
! 474: static void tpic_scanpath()
! 475: {
! 476: int i;
! 477:
! 478: for (i = 0; i < tpic_linecount; i++)
! 479: tpic_abspath(pathpoint[i][0], pathpoint[i][1]);
! 480: return;
! 481: }
! 482:
! 483: TERM_PUBLIC void TPIC_linetype(linetype)
! 484: int linetype;
! 485: {
! 486: tpic_endline();
! 487: if (linetype >= tpic_numlines - 2)
! 488: linetype %= (tpic_numlines - 2);
! 489: tpic_linetype = linetype;
! 490: }
! 491:
! 492: static int tpic_angle = 0; /* 0 = horizontal, 1 = vertical */
! 493: static enum JUSTIFY tpic_justify = LEFT;
! 494:
! 495: TERM_PUBLIC void TPIC_put_text(x, y, str)
! 496: unsigned int x;
! 497: unsigned int y;
! 498: char *str; /* ref point and text */
! 499: {
! 500: char *justify = NULL;
! 501:
! 502: tpic_endline();
! 503: fprintf(gpoutfile, "\\put(%d,%d)", x, y);
! 504:
! 505: if ((str[0] == '{') || (str[0] == '[')) {
! 506: fprintf(gpoutfile, "{\\makebox(0,0)%s}\n", str);
! 507: } else
! 508: switch (tpic_angle) {
! 509: case 0: /* horizontal */
! 510: switch (tpic_justify) {
! 511: case LEFT:
! 512: justify = "[l]";
! 513: break;
! 514: case CENTRE:
! 515: justify = "";
! 516: break;
! 517: case RIGHT:
! 518: justify = "[r]";
! 519: break;
! 520: }
! 521: fprintf(gpoutfile, "{\\makebox(0,0)%s{%s}}\n", justify, str);
! 522: break;
! 523: case 1: /* vertical */
! 524: /* we can't really write text vertically, but will put the ylabel
! 525: centred at the left of the plot, and then we'll make a \shortstack */
! 526: switch (tpic_justify) {
! 527: case LEFT:
! 528: justify = "[lb]";
! 529: break;
! 530: case CENTRE:
! 531: justify = "[l]";
! 532: break;
! 533: case RIGHT:
! 534: justify = "[lt]";
! 535: break;
! 536: }
! 537: fprintf(gpoutfile, "{\\makebox(0,0)%s{\\shortstack{%s}}}\n",
! 538: justify, str);
! 539: break;
! 540: }
! 541: }
! 542:
! 543: TERM_PUBLIC int TPIC_text_angle(ang)
! 544: int ang;
! 545: {
! 546: tpic_angle = ang;
! 547: return (TRUE);
! 548: }
! 549:
! 550: TERM_PUBLIC int TPIC_justify_text(mode)
! 551: enum JUSTIFY mode;
! 552: {
! 553: tpic_justify = mode;
! 554: return (TRUE);
! 555: }
! 556:
! 557: TERM_PUBLIC void TPIC_point(x, y, number)
! 558: unsigned int x;
! 559: unsigned int y;
! 560: int number;
! 561: {
! 562: int size = 0;
! 563:
! 564: TPIC_move(x, y);
! 565:
! 566: /* Print the character defined by 'number'; number < 0 means
! 567: to use a dot, otherwise one of the defined points. */
! 568:
! 569: fprintf(gpoutfile, "\\put(%d,%d){", x, y); /* start putting */
! 570:
! 571: if (number < 0) {
! 572: fprintf(gpoutfile, "\\rule{.1pt}{.1pt}"); /* tiny dot */
! 573: } else {
! 574: number %= tpic_point_types;
! 575: switch (tpic_point[number].shadestyle) {
! 576: case tpic_white:
! 577: tpic_pen(tpic_linewidth); /* set it thin */
! 578: tpic_shade(0.0);
! 579: break;
! 580: case tpic_gray:
! 581: tpic_pen(tpic_linewidth);
! 582: tpic_shade(0.5);
! 583: break;
! 584: case tpic_black:
! 585: tpic_pen(tpic_linewidth);
! 586: tpic_shade(1.0);
! 587: break;
! 588: case tpic_none:
! 589: tpic_pen(tpic_linewidth * 3); /* set it thick */
! 590: break;
! 591: }
! 592: switch (tpic_point[number].size) {
! 593: case tpic_small:
! 594: size = tpic_pointsize;
! 595: break;
! 596: case tpic_medium:
! 597: size = (int) (tpic_pointsize * 1.4142);
! 598: break;
! 599: case tpic_large:
! 600: size = (int) (tpic_pointsize * 2.0);
! 601: break;
! 602: default:
! 603: break;
! 604: }
! 605: (tpic_point[number].function) (size);
! 606: }
! 607:
! 608: fputs("}%%\n", gpoutfile); /* end putting */
! 609: }
! 610:
! 611: TERM_PUBLIC void TPIC_arrow(sx, sy, ex, ey, head)
! 612: unsigned int sx;
! 613: unsigned int sy;
! 614: unsigned int ex;
! 615: unsigned int ey;
! 616: TBOOLEAN head;
! 617: {
! 618: best_latex_arrow(sx, sy, ex, ey, 1, head); /* call latex routine */
! 619: tpic_posx = ex;
! 620: tpic_posy = ey;
! 621: }
! 622:
! 623: /* private: draw points with tpic commands */
! 624:
! 625: void tpic_diamond(size)
! 626: int size;
! 627: {
! 628: size = (int) (size * 1.4142); /* spread by sqrt(2) */
! 629:
! 630: tpic_path(0, size);
! 631: tpic_path(-size, 0);
! 632: tpic_path(0, -size);
! 633: tpic_path(size, 0);
! 634: tpic_path(0, size);
! 635: tpic_flush();
! 636: return;
! 637: }
! 638:
! 639: void tpic_plus(size)
! 640: int size;
! 641: {
! 642: tpic_path(0, size);
! 643: tpic_path(0, -size);
! 644: tpic_flush();
! 645: tpic_path(size, 0);
! 646: tpic_path(-size, 0);
! 647: tpic_flush();
! 648: return;
! 649: }
! 650:
! 651: void tpic_box(size)
! 652: int size;
! 653: {
! 654: tpic_path(size, size);
! 655: tpic_path(-size, size);
! 656: tpic_path(-size, -size);
! 657: tpic_path(size, -size);
! 658: tpic_path(size, size);
! 659: tpic_flush();
! 660: return;
! 661: }
! 662:
! 663: void tpic_times(size)
! 664: int size;
! 665: {
! 666: size = (int) (size / 1.4142); /* reduce by sqrt(2) */
! 667:
! 668: tpic_path(size, size);
! 669: tpic_path(-size, -size);
! 670: tpic_flush();
! 671: tpic_path(size, -size);
! 672: tpic_path(-size, size);
! 673: tpic_flush();
! 674: return;
! 675: }
! 676:
! 677: void tpic_triangle(size)
! 678: int size;
! 679: {
! 680: int x;
! 681:
! 682: size = (int) (size / 1.6119); /* reduce by sqrt(3 * sqrt(3) / 2) */
! 683: x = (int) (size * 1.7321);
! 684:
! 685: tpic_path(0, -size * 2);
! 686: tpic_path(-x, size);
! 687: tpic_path(x, size);
! 688: tpic_path(0, -size * 2);
! 689: tpic_flush();
! 690: return;
! 691: }
! 692:
! 693: void tpic_star(size)
! 694: int size;
! 695: {
! 696: int x;
! 697:
! 698: size = (int) (size / 2); /* reduce by 2 */
! 699: x = (int) (size * 1.7321);
! 700:
! 701: tpic_path(0, size * 2);
! 702: tpic_path(0, -size * 2);
! 703: tpic_flush();
! 704: tpic_path(x, size);
! 705: tpic_path(-x, -size);
! 706: tpic_flush();
! 707: tpic_path(x, -size);
! 708: tpic_path(-x, size);
! 709: tpic_flush();
! 710: return;
! 711: }
! 712:
! 713: void tpic_hexagon(size)
! 714: int size;
! 715: {
! 716: int x;
! 717:
! 718: size = (int) (size / 2); /* reduce by 2 */
! 719: x = (int) (size * 1.7321);
! 720:
! 721: tpic_path(0, size * 2);
! 722: tpic_path(-x, size);
! 723: tpic_path(-x, -size);
! 724: tpic_path(0, -size * 2);
! 725: tpic_path(x, -size);
! 726: tpic_path(x, size);
! 727: tpic_path(0, size * 2);
! 728: tpic_flush();
! 729: return;
! 730: }
! 731:
! 732: void tpic_circle(size)
! 733: int size;
! 734: {
! 735: tpic_arc(size);
! 736: return;
! 737: }
! 738:
! 739: void tpic_doublecircle(size)
! 740: int size;
! 741: {
! 742: tpic_arc(size);
! 743: tpic_shade(0.0);
! 744: tpic_arc(size / 2);
! 745: return;
! 746: }
! 747:
! 748: void tpic_vercircle(size)
! 749: int size; /* circle with | */
! 750: {
! 751: tpic_arc(size);
! 752: tpic_path(0, size);
! 753: tpic_path(0, -size);
! 754: tpic_flush();
! 755: return;
! 756: }
! 757:
! 758: void tpic_horcircle(size)
! 759: int size; /* circle with - */
! 760: {
! 761: tpic_arc(size);
! 762: tpic_path(size, 0);
! 763: tpic_path(-size, 0);
! 764: tpic_flush();
! 765: return;
! 766: }
! 767:
! 768: void tpic_pluscircle(size)
! 769: int size; /* circle with + */
! 770: {
! 771: tpic_arc(size);
! 772: tpic_plus(size);
! 773: return;
! 774: }
! 775:
! 776: void tpic_timescircle(size)
! 777: int size; /* circle with times */
! 778: {
! 779: tpic_arc(size);
! 780: tpic_times(size);
! 781: return;
! 782: }
! 783:
! 784: void tpic_starcircle(size)
! 785: int size; /* circle with star */
! 786: {
! 787: tpic_arc(size);
! 788: tpic_star(size);
! 789: return;
! 790: }
! 791:
! 792: void tpic_dotcircle(size)
! 793: int size; /* circle with dot (black circle) */
! 794: {
! 795: tpic_arc(size);
! 796: tpic_shade(1.0);
! 797: tpic_arc(size / 2);
! 798: return;
! 799: }
! 800:
! 801: void tpic_diamondcircle(size)
! 802: int size; /* not enough? circle with black diamond */
! 803: {
! 804: tpic_arc(size);
! 805: tpic_shade(1.0);
! 806: tpic_diamond((int) (size / 1.5));
! 807: return;
! 808: }
! 809:
! 810: void tpic_boxcircle(size)
! 811: int size; /* need more? circle with black box */
! 812: {
! 813: tpic_arc(size);
! 814: tpic_shade(1.0);
! 815: tpic_box((int) (size / 1.5));
! 816: return;
! 817: }
! 818:
! 819: void tpic_trianglecircle(size)
! 820: int size; /* circle with black triangle */
! 821: {
! 822: tpic_arc(size);
! 823: tpic_shade(1.0);
! 824: tpic_triangle((int) (size / 1.5));
! 825: return;
! 826: }
! 827:
! 828: void tpic_hexagoncircle(size)
! 829: int size; /* how about circle with black hexagon? */
! 830: {
! 831: tpic_arc(size);
! 832: tpic_shade(1.0);
! 833: tpic_hexagon((int) (size / 1.2));
! 834: return;
! 835: }
! 836:
! 837: void tpic_plustimescircle(size)
! 838: int size; /* no more idea ... with plus & times */
! 839: {
! 840: tpic_arc(size);
! 841: tpic_plus(size);
! 842: tpic_times(size);
! 843: return;
! 844: }
! 845:
! 846: /* private: draw lines */
! 847:
! 848: void tpic_abspath(x, y)
! 849: unsigned int x;
! 850: unsigned int y; /* absolute coord */
! 851: {
! 852: fprintf(gpoutfile, "\\put(%u,%u){", x, y); /* start putting */
! 853: tpic_path(0, 0);
! 854: fputs("}%\n", gpoutfile); /* end putting */
! 855: return;
! 856: }
! 857:
! 858: /* private: tpic primitive functions */
! 859:
! 860: void tpic_path(x, y)
! 861: int x;
! 862: int y;
! 863: {
! 864: fprintf(gpoutfile, "\\special{pa %d %d}", x, y);
! 865: return;
! 866: }
! 867:
! 868: void tpic_flush()
! 869: {
! 870: fputs("\\special{fp}%\n", gpoutfile);
! 871: return;
! 872: }
! 873:
! 874: void tpic_arc(radius)
! 875: int radius; /* actually, draw a full circle */
! 876: {
! 877: fprintf(gpoutfile, "\\special{ar 0 0 %d %d 0 7}", radius, radius);
! 878: return;
! 879: }
! 880:
! 881: void tpic_shade(grayscale)
! 882: double grayscale;
! 883: {
! 884: fprintf(gpoutfile, "\\special{sh %f}", grayscale);
! 885: return;
! 886: }
! 887:
! 888: void tpic_pen(thickness)
! 889: int thickness;
! 890: {
! 891: fprintf(gpoutfile, "\\special{pn %d}", thickness);
! 892: return;
! 893: }
! 894:
! 895: void tpic_dottedflush(interval)
! 896: double interval;
! 897: {
! 898: fprintf(gpoutfile, "\\special{dt %f}%%\n", interval);
! 899: return;
! 900: }
! 901:
! 902: void tpic_dashedflush(interval)
! 903: double interval;
! 904: {
! 905: fprintf(gpoutfile, "\\special{da %f}%%\n", interval);
! 906: return;
! 907: }
! 908:
! 909: #endif /* TERM_BODY */
! 910:
! 911: #ifdef TERM_TABLE
! 912:
! 913: TERM_TABLE_START(tpic_driver)
! 914: "tpic", "TPIC -- LaTeX picture environment with tpic \\specials",
! 915: TPIC_XMAX, TPIC_YMAX, TPIC_VCHAR, TPIC_HCHAR,
! 916: TPIC_VTIC, TPIC_HTIC, TPIC_options, TPIC_init, TPIC_reset,
! 917: TPIC_text, null_scale, TPIC_graphics, TPIC_move, TPIC_vector,
! 918: TPIC_linetype, TPIC_put_text, TPIC_text_angle,
! 919: TPIC_justify_text, TPIC_point, TPIC_arrow, set_font_null
! 920: TERM_TABLE_END(tpic_driver)
! 921:
! 922: #undef LAST_TERM
! 923: #define LAST_TERM tpic_driver
! 924:
! 925: #endif /* TERM_TABLE */
! 926: #endif /* TERM_PROTO_ONLY */
! 927:
! 928: #ifdef TERM_HELP
! 929: START_HELP(tpic)
! 930: "1 tpic",
! 931: "?commands set terminal tpic",
! 932: "?set terminal tpic",
! 933: "?set term tpic",
! 934: "?terminal tpic",
! 935: "?term tpic",
! 936: "?tpic",
! 937: " The `tpic` terminal driver supports the LaTeX picture environment with tpic",
! 938: " \\specials. It is an alternative to the `latex` and `eepic` terminal drivers.",
! 939: " Options are the point size, line width, and dot-dash interval.",
! 940: "",
! 941: " Syntax:",
! 942: " set terminal tpic <pointsize> <linewidth> <interval>",
! 943: "",
! 944: " where `pointsize` and `linewidth` are integers in milli-inches and `interval`",
! 945: " is a float in inches. If a non-positive value is specified, the default is",
! 946: " chosen: pointsize = 40, linewidth = 6, interval = 0.1.",
! 947: "",
! 948: " All drivers for LaTeX offer a special way of controlling text positioning:",
! 949: " If any text string begins with '{', you also need to include a '}' at the",
! 950: " end of the text, and the whole text will be centered both horizontally",
! 951: " and vertically by LaTeX. --- If the text string begins with '[', you need",
! 952: " to continue it with: a position specification (up to two out of t,b,l,r),",
! 953: " ']{', the text itself, and finally, '}'. The text itself may be anything",
! 954: " LaTeX can typeset as an LR-box. \\rule{}{}'s may help for best positioning.",
! 955: "",
! 956: " Examples:",
! 957: " About label positioning:",
! 958: " Use gnuplot defaults (mostly sensible, but sometimes not really best):",
! 959: " set title '\\LaTeX\\ -- $ \\gamma $'",
! 960: " Force centering both horizontally and vertically:",
! 961: " set label '{\\LaTeX\\ -- $ \\gamma $}' at 0,0",
! 962: " Specify own positioning (top here):",
! 963: " set xlabel '[t]{\\LaTeX\\ -- $ \\gamma $}'",
! 964: " The other label -- account for long ticlabels:",
! 965: " set ylabel '[r]{\\LaTeX\\ -- $ \\gamma $\\rule{7mm}{0pt}'"
! 966: END_HELP(tpic)
! 967: #endif /* TERM_TABLE */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>