Annotation of OpenXM_contrib/gnuplot/term/epslatex.trm, Revision 1.1
1.1 ! ohara 1: /*
! 2: * $Id: epslatex.trm,v 1.1.2.4 2002/01/26 19:05:34 lhecking Exp $
! 3: */
! 4:
! 5: /* GNUPLOT - epslatex.trm */
! 6:
! 7: /*[
! 8: * Copyright 2000
! 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 terminal driver supports:
! 39: * epslatex
! 40: */
! 41:
! 42: /* Written by Gregor Thalhammer
! 43: * you'll find a lot of similarities with the pslatex, postscript and pstricks terminal drivers
! 44: */
! 45:
! 46: #include "driver.h"
! 47:
! 48: #ifdef TERM_REGISTER
! 49: register_term(epslatex)
! 50: #endif
! 51:
! 52: #ifdef TERM_PROTO
! 53: TERM_PUBLIC void EPSL_options __PROTO((void));
! 54: TERM_PUBLIC void EPSL_init __PROTO((void));
! 55: TERM_PUBLIC void EPSL_graphics __PROTO((void));
! 56: TERM_PUBLIC void EPSL_text __PROTO((void));
! 57: TERM_PUBLIC void EPSL_reset __PROTO((void));
! 58: TERM_PUBLIC void EPSL_linetype __PROTO((int linetype));
! 59: TERM_PUBLIC void EPSL_move __PROTO((unsigned int x, unsigned int y));
! 60: TERM_PUBLIC void EPSL_vector __PROTO((unsigned int x, unsigned int y));
! 61: TERM_PUBLIC void EPSL_arrow __PROTO((unsigned int xstart, unsigned int ystart, unsigned int xend, unsigned int yend, TBOOLEAN head));
! 62: TERM_PUBLIC void EPSL_put_text __PROTO((unsigned int x, unsigned int y, char *str));
! 63: TERM_PUBLIC int EPSL_text_angle __PROTO((int ang));
! 64: TERM_PUBLIC int EPSL_justify_text __PROTO((enum JUSTIFY mode));
! 65: TERM_PUBLIC void EPSL_point __PROTO((unsigned int x, unsigned int y, int number));
! 66: TERM_PUBLIC int EPSL_set_font __PROTO((char *font));
! 67: TERM_PUBLIC void EPSL_fillbox __PROTO((int style, unsigned int x1, unsigned int y1, unsigned int width, unsigned int height));
! 68: TERM_PUBLIC void EPSL_linewidth __PROTO((double linewidth));
! 69: TERM_PUBLIC void EPSL_pointsize __PROTO((double ptsize));
! 70:
! 71: #ifdef PM3D
! 72: /* Not needed --- PS terminal version reused:
! 73: TERM_PUBLIC int EPSL_make_palette __PROTO((t_sm_palette *));
! 74: TERM_PUBLIC void EPSL_previous_palette __PROTO((void));
! 75: TERM_PUBLIC void EPSL_set_color __PROTO((double));
! 76: */
! 77: TERM_PUBLIC void EPSL_filled_polygon __PROTO((int, gpiPoint *));
! 78: #endif
! 79:
! 80: #define EPSL_SC (50) /* scale is 1pt = 10 units */
! 81: /* changed to 50, but gs now renders terribly slowly to display (x11alpha) !! */
! 82: #define EPSL_POINT_TYPES 8 /* never used! */
! 83: #define EPSL_XOFF 72 /* page offset in pts */
! 84: #define EPSL_YOFF 72
! 85: #define EPSL_XMAX (5*72*EPSL_SC) /* default plot size 5*3 inch */
! 86: #define EPSL_YMAX (3*72*EPSL_SC)
! 87: #define EPSL_XLAST (EPSL_XMAX - 1)
! 88: #define EPSL_YLAST (EPSL_YMAX - 1)
! 89: #define EPSL_VTIC (6.0*EPSL_SC)
! 90: #define EPSL_HTIC (6.0*EPSL_SC)
! 91: #define EPSL_POINTSIZE (2.0*EPSL_SC)
! 92: #define EPSL_LW (0.4*EPSL_SC) /* linewidth = 0.4 pts */
! 93: #define EPSL_VCHAR (11*EPSL_SC) /* default is 11 point characters */
! 94: #define EPSL_HCHAR (11*EPSL_SC*5/10)
! 95:
! 96: #endif /* TERM_PROTO */
! 97:
! 98: #ifndef TERM_PROTO_ONLY
! 99:
! 100: #ifdef TERM_BODY
! 101:
! 102: #define EPSL_FLUSH_PATH \
! 103: if (EPSL_path_count) {fputs("Gpstroke\n",gpoutfile); EPSL_path_count = 0; EPSL_relative_ok = FALSE;}
! 104:
! 105: /* From version.c */
! 106: extern char gnuplot_version[];
! 107: extern char gnuplot_patchlevel[];
! 108:
! 109: static char EPSL_font[MAX_ID_LEN + 1] = "default"; /* name of font */
! 110: static int EPSL_fontsize = 11; /* size of font in pts */
! 111:
! 112: static TBOOLEAN EPSL_color = FALSE; /* don't use colors */
! 113: static TBOOLEAN EPSL_solid = FALSE; /* use solid lines */
! 114:
! 115: static int EPSL_path_count = 0; /* count of lines in path */
! 116: static int EPSL_ang = 0; /* text angle */
! 117:
! 118: static enum JUSTIFY EPSL_justify = LEFT; /* text is flush left */
! 119: /* static int x = 0; */
! 120:
! 121: /* for testing */
! 122: /*
! 123: char GPFAR * GPFAR EPSL_header[] = {"(prolog.ps) run\n", NULL};
! 124: */
! 125:
! 126: char GPFAR *GPFAR EPSL_header[] = {
! 127: " /hpt hpt_ def \n",
! 128: " /vpt vpt_ def \n",
! 129: " /Gppointsize_ 1 def \n",
! 130: " /Gplinewidth_ 1 def \n",
! 131: " \n",
! 132: " /ArrowDict 25 dict def \n",
! 133: " \n",
! 134: " /M /moveto load def \n",
! 135: " /L /lineto load def \n",
! 136: " /R /rmoveto load def \n",
! 137: " /V /rlineto load def \n",
! 138: " /ED { exch def} bind def \n",
! 139: " \n",
! 140: " /Atan {/atan load stopped {pop pop 0} if } def \n",
! 141: " /Div {dup 0 eq { pop } { div } ifelse } def \n",
! 142: " /Pyth {dup mul exch dup mul add sqrt} def \n",
! 143: " \n",
! 144: " %Sizes \n",
! 145: " /Gpsetlinewidth \n",
! 146: " { \n",
! 147: " dup \n",
! 148: " % /Gplinewidth_ ED %save \n",
! 149: " Gplinewidth mul setlinewidth \n",
! 150: " } def \n",
! 151: " \n",
! 152: " /Gpsetpointsize \n",
! 153: " { \n",
! 154: " dup \n",
! 155: " /Gppointsize_ ED %save \n",
! 156: " dup \n",
! 157: " vpt_ mul /vpt ED \n",
! 158: " hpt_ mul /hpt ED \n",
! 159: " } def \n",
! 160: " \n",
! 161: " %Color \n",
! 162: " /SetHsbColor { Color {sethsbcolor} {pop pop pop} ifelse } def \n",
! 163: " /SetCmykColor { Color {setcmykcolor} {pop pop pop pop} ifelse } def \n",
! 164: " /SimpleSetColor {6 div 1 1 SetHsbColor} def \n",
! 165: " /Black {0 0 0 0 SetCmykColor} def \n",
! 166: " /Red {0 SimpleSetColor} def \n",
! 167: " /Blue {1 1 0 0 SetCmykColor} def \n",
! 168: " /Cyan {1 0 0 0 SetCmykColor} def \n",
! 169: " /Magenta {0 1 0 0 SetCmykColor} def \n",
! 170: " \n",
! 171: " %Stroking \n",
! 172: " /PathLength@ % z = z + sqrt{(x-xlast)^2 + (y-ylast)^2} \n",
! 173: " { \n",
! 174: " /z \n",
! 175: " z \n",
! 176: " y ylast sub \n",
! 177: " x xlast sub \n",
! 178: " Pyth \n",
! 179: " add \n",
! 180: " def \n",
! 181: " /ylast y def \n",
! 182: " /xlast x def \n",
! 183: " } def \n",
! 184: " \n",
! 185: " /PathLength \n",
! 186: " { \n",
! 187: " flattenpath \n",
! 188: " /z 0 def \n",
! 189: " { %move \n",
! 190: " /ystart ED \n",
! 191: " /xstart ED \n",
! 192: " /xlast xstart def \n",
! 193: " /ylast ystart def \n",
! 194: " } \n",
! 195: " { %line \n",
! 196: " /y ED \n",
! 197: " /x ED \n",
! 198: " PathLength@ \n",
! 199: " } \n",
! 200: " { %curve \n",
! 201: " } \n",
! 202: " { %close \n",
! 203: " /x xstart def \n",
! 204: " /y ystart def \n",
! 205: " PathLength@ \n",
! 206: " } \n",
! 207: " /pathforall load \n",
! 208: " stopped {pop pop pop pop} if \n",
! 209: " z \n",
! 210: " } def \n",
! 211: " \n",
! 212: " %dotsep DotLine \n",
! 213: " /DotLine \n",
! 214: " { \n",
! 215: " PathLength /b ED \n",
! 216: " /z ED \n",
! 217: " /y currentlinewidth def \n",
! 218: " /z y z add def \n",
! 219: " [ 0 b b z Div round Div dup 0 le { pop 1 } if] 0 setdash \n",
! 220: " 1 setlinecap \n",
! 221: " } def \n",
! 222: " \n",
! 223: " /DashLine \n",
! 224: " { \n",
! 225: " PathLength /b ED \n",
! 226: " /x ED \n",
! 227: " /y ED \n",
! 228: " /z y x add def \n",
! 229: " b y sub z Div round z mul y add b exch Div \n",
! 230: " dup \n",
! 231: " y mul /y ED \n",
! 232: " x mul /x ED \n",
! 233: " x 0 gt y 0 gt and \n",
! 234: " { [ y x ] 0 } \n",
! 235: " { [ 1 0 ] 0 } \n",
! 236: " ifelse \n",
! 237: " setdash \n",
! 238: " } def \n",
! 239: " \n",
! 240: " /DashLineTwo \n",
! 241: " { \n",
! 242: " PathLength /b ED \n",
! 243: " /u ED \n",
! 244: " /v ED \n",
! 245: " /x ED \n",
! 246: " /y ED \n",
! 247: " /z y x add u add v add def \n",
! 248: " b y sub z Div round z mul y add b exch Div \n",
! 249: " dup \n",
! 250: " y mul /y ED \n",
! 251: " x mul /x ED \n",
! 252: " x 0 gt y 0 gt and \n",
! 253: " { [ y x v u] 0 } \n",
! 254: " { [ 1 0 ] 0 } \n",
! 255: " ifelse \n",
! 256: " setdash \n",
! 257: " } def \n",
! 258: " \n",
! 259: " \n",
! 260: " /DotLineStroke \n",
! 261: " { \n",
! 262: " gsave \n",
! 263: " Dashed {currentlinewidth 2 mul DotLine} if \n",
! 264: " stroke \n",
! 265: " grestore \n",
! 266: " } def \n",
! 267: " \n",
! 268: " /SolidLineStroke \n",
! 269: " { \n",
! 270: " gsave \n",
! 271: " [] 0 setdash \n",
! 272: " stroke \n",
! 273: " grestore \n",
! 274: " } def \n",
! 275: " \n",
! 276: " /DashLineStroke \n",
! 277: " { \n",
! 278: " gsave \n",
! 279: " Dashed {Gplinewidth 8 mul Gplinewidth 5 mul DashLine} if \n",
! 280: " stroke \n",
! 281: " grestore \n",
! 282: " } def \n",
! 283: " \n",
! 284: " /DashDotLineStroke \n",
! 285: " { \n",
! 286: " gsave \n",
! 287: " Dashed {Gplinewidth 8 mul Gplinewidth 5 mul 0 Gplinewidth 5 mul DashLineTwo} if \n",
! 288: " stroke \n",
! 289: " grestore \n",
! 290: " } def \n",
! 291: " \n",
! 292: " /DashShortLineStroke \n",
! 293: " { \n",
! 294: " gsave \n",
! 295: " Dashed {Gplinewidth 4 mul dup DashLine} if \n",
! 296: " stroke \n",
! 297: " grestore \n",
! 298: " } def \n",
! 299: " \n",
! 300: " /ArrowHead \n",
! 301: " { \n",
! 302: " currentlinewidth mul add dup 2 div /w ED \n",
! 303: " mul dup /h ED \n",
! 304: " mul /a ED \n",
! 305: " w neg h moveto \n",
! 306: " 0 0 L \n",
! 307: " w h L \n",
! 308: " w neg a neg rlineto \n",
! 309: " gsave fill grestore \n",
! 310: " } def \n",
! 311: " \n",
! 312: " %/DrawArrowHead {1 dup scale 0.2 1.4 50 3 ArrowHead} def \n",
! 313: " %%%%% \n",
! 314: " %inset length dim num \n",
! 315: " %arrowwidth = dim + num*linewidth \n",
! 316: " %arrowlength = length*arrowwidth \n",
! 317: " %arrowinset = width * inset \n",
! 318: " \n",
! 319: " /DrawArrowHead {0.2 1.4 Gplinewidth 3 mul 4 ArrowHead} def \n",
! 320: " \n",
! 321: " /Arrow \n",
! 322: " { \n",
! 323: " currentpoint \n",
! 324: " 4 2 roll \n",
! 325: " ArrowDict \n",
! 326: " begin \n",
! 327: " /@mtrx matrix currentmatrix def \n",
! 328: " gsave \n",
! 329: " 2 copy translate \n",
! 330: " 2 index sub neg exch \n",
! 331: " 3 index sub exch Atan \n",
! 332: " rotate \n",
! 333: " newpath \n",
! 334: " DrawArrowHead \n",
! 335: " @mtrx setmatrix \n",
! 336: " currentpoint \n",
! 337: " grestore \n",
! 338: " end %ArrowDicht \n",
! 339: " lineto \n",
! 340: " Gpstroke \n",
! 341: " } def \n",
! 342: " \n",
! 343: " %axis \n",
! 344: " /LTa \n",
! 345: " { \n",
! 346: " Gpstroke \n",
! 347: " newpath \n",
! 348: " 0 setgray \n",
! 349: " /Gpstroke {DotLineStroke newpath} def \n",
! 350: " } def \n",
! 351: " \n",
! 352: " %border \n",
! 353: " /LTb \n",
! 354: " { \n",
! 355: " Gpstroke \n",
! 356: " newpath \n",
! 357: " 0 setgray \n",
! 358: " /Gpstroke {SolidLineStroke newpath} def \n",
! 359: " } def \n",
! 360: " \n",
! 361: " /LT0 \n",
! 362: " { \n",
! 363: " Gpstroke \n",
! 364: " newpath \n",
! 365: " Red \n",
! 366: " /Gpstroke {SolidLineStroke newpath} def \n",
! 367: " } def \n",
! 368: " \n",
! 369: " /LT1 \n",
! 370: " { \n",
! 371: " Gpstroke \n",
! 372: " newpath \n",
! 373: " Blue \n",
! 374: " /Gpstroke {DashLineStroke newpath} def \n",
! 375: " } def \n",
! 376: " \n",
! 377: " /LT2 \n",
! 378: " { \n",
! 379: " Gpstroke \n",
! 380: " newpath \n",
! 381: " Cyan \n",
! 382: " /Gpstroke {DashShortLineStroke newpath} def \n",
! 383: " } def \n",
! 384: " \n",
! 385: " /LT3 \n",
! 386: " { \n",
! 387: " Gpstroke \n",
! 388: " newpath \n",
! 389: " Magenta \n",
! 390: " /Gpstroke {DashDotLineStroke newpath} def \n",
! 391: " } def \n",
! 392: " \n",
! 393: " /Pnt \n",
! 394: " { \n",
! 395: " gsave \n",
! 396: " [] 0 setdash \n",
! 397: " 1 setlinecap \n",
! 398: " Gplinewidth Gppointsize_ mul setlinewidth \n",
! 399: " M \n",
! 400: " 0 0 V \n",
! 401: " stroke \n",
! 402: " grestore \n",
! 403: " } def \n",
! 404: " \n",
! 405: " /DiaPath \n",
! 406: " { \n",
! 407: " [] 0 setdash \n",
! 408: " Gplinewidth setlinewidth \n",
! 409: " 2 copy \n",
! 410: " newpath \n",
! 411: " vpt add moveto \n",
! 412: " hpt neg vpt neg rlineto \n",
! 413: " hpt vpt neg rlineto \n",
! 414: " hpt vpt rlineto \n",
! 415: " hpt neg vpt rlineto \n",
! 416: " closepath \n",
! 417: " } def \n",
! 418: " \n",
! 419: " /Dia \n",
! 420: " { \n",
! 421: " gsave \n",
! 422: " DiaPath \n",
! 423: " stroke \n",
! 424: " grestore \n",
! 425: " } def \n",
! 426: " \n",
! 427: " /DaF \n",
! 428: " { \n",
! 429: " gsave \n",
! 430: " DiaPath \n",
! 431: " fill \n",
! 432: " grestore \n",
! 433: " } def \n",
! 434: " \n",
! 435: " /Crc \n",
! 436: " { \n",
! 437: " gsave \n",
! 438: " [] 0 setdash \n",
! 439: " Gplinewidth setlinewidth \n",
! 440: " newpath \n",
! 441: " vpt 0.85 mul 0 360 arc \n",
! 442: " closepath \n",
! 443: " stroke \n",
! 444: " grestore \n",
! 445: " } def \n",
! 446: " \n",
! 447: " \n",
! 448: " /Crs \n",
! 449: " { \n",
! 450: " gsave \n",
! 451: " [] 0 setdash \n",
! 452: " Gplinewidth setlinewidth \n",
! 453: " 0 setlinecap \n",
! 454: " newpath \n",
! 455: " vpt sub \n",
! 456: " moveto \n",
! 457: " 0 vpt 2 mul rlineto \n",
! 458: " hpt vpt neg rmoveto \n",
! 459: " hpt 2 mul neg 0 rlineto \n",
! 460: " stroke \n",
! 461: " grestore \n",
! 462: " } def \n",
! 463: " \n",
! 464: " /CrX \n",
! 465: " { \n",
! 466: " gsave \n",
! 467: " translate \n",
! 468: " 45 rotate \n",
! 469: " 0 0 Crs \n",
! 470: " grestore \n",
! 471: " } def \n",
! 472: " \n",
! 473: " /CcF \n",
! 474: " { \n",
! 475: " gsave \n",
! 476: " [] 0 setdash \n",
! 477: " Gplinewidth setlinewidth \n",
! 478: " newpath \n",
! 479: " vpt 0.85 mul 0 360 arc \n",
! 480: " closepath \n",
! 481: " fill \n",
! 482: " grestore \n",
! 483: " } def \n",
! 484: " \n",
! 485: " /Box \n",
! 486: " { \n",
! 487: " gsave \n",
! 488: " translate \n",
! 489: " 45 rotate \n",
! 490: " 0 0 DiaPath \n",
! 491: " stroke \n",
! 492: " grestore \n",
! 493: " } def \n",
! 494: " \n",
! 495: " /BxF \n",
! 496: " { \n",
! 497: " gsave \n",
! 498: " translate \n",
! 499: " 45 rotate \n",
! 500: " 0 0 DiaPath \n",
! 501: " fill \n",
! 502: " grestore \n",
! 503: " } def \n",
! 504: " \n",
! 505: " /Gpstroke {stroke} def \n",
! 506: " 1 setlinecap \n",
! 507: " 1 setlinejoin \n",
! 508: NULL
! 509: };
! 510:
! 511: static int EPSL_pen_x, EPSL_pen_y;
! 512: static int EPSL_taken;
! 513: static int EPSL_linetype_last;
! 514: static TBOOLEAN EPSL_relative_ok;
! 515: static char *EPSL_texfilename = NULL;
! 516: static FILE *EPSL_texfile;
! 517:
! 518: TERM_PUBLIC void
! 519: EPSL_options()
! 520: {
! 521: if (!END_OF_COMMAND) { /* set all options to their default values */
! 522: if (almost_equals(c_token, "d$efault")) {
! 523: EPSL_color = FALSE;
! 524: EPSL_solid = FALSE;
! 525: strcpy(EPSL_font, "default");
! 526: EPSL_fontsize = 11;
! 527: term->v_char = (unsigned int) (EPSL_fontsize * EPSL_SC);
! 528: term->h_char = (unsigned int) (EPSL_fontsize * EPSL_SC * 5 / 10);
! 529: c_token++;
! 530: }
! 531: }
! 532:
! 533: if (!END_OF_COMMAND) {
! 534: if (almost_equals(c_token, "m$onochrome")) {
! 535: EPSL_color = FALSE;
! 536: c_token++;
! 537: } else if (almost_equals(c_token, "c$olor")
! 538: || almost_equals(c_token, "c$olour")) {
! 539: EPSL_color = TRUE;
! 540: c_token++;
! 541: }
! 542: }
! 543:
! 544: if (!END_OF_COMMAND) {
! 545: if (almost_equals(c_token, "so$lid")) {
! 546: EPSL_solid = TRUE;
! 547: c_token++;
! 548: } else if (almost_equals(c_token, "da$shed")) {
! 549: EPSL_solid = FALSE;
! 550: c_token++;
! 551: }
! 552: }
! 553:
! 554: if (!END_OF_COMMAND && isstring(c_token)) {
! 555: quote_str(EPSL_font, c_token, MAX_ID_LEN);
! 556: c_token++;
! 557: }
! 558:
! 559: if (!END_OF_COMMAND) {
! 560: /* We have font size specified */
! 561: struct value a;
! 562: EPSL_fontsize = (int) real(const_express(&a));
! 563: term->v_char = (unsigned int) (EPSL_fontsize * EPSL_SC);
! 564: term->h_char = (unsigned int) (EPSL_fontsize * EPSL_SC * 5 / 10);
! 565: }
! 566:
! 567: sprintf(default_font, "%s,%d", EPSL_font, EPSL_fontsize); /* 'default_font' declared in set.c */
! 568:
! 569: sprintf(term_options, "%s %s \"%s\" %d",
! 570: EPSL_color ? "color" : "monochrome",
! 571: EPSL_solid ? "solid" : "dashed",
! 572: EPSL_font, EPSL_fontsize);
! 573: }
! 574:
! 575:
! 576: /* the init fn for the epslatex driver */
! 577: TERM_PUBLIC void
! 578: EPSL_init()
! 579: {
! 580: char *dotIndex=NULL;
! 581: char *name;
! 582:
! 583: /* Why is EPSL_header global, and psi1, psi2 not? */
! 584:
! 585: static char GPFAR psi1[] = "%%%%Creator: gnuplot %s patchlevel %s\n\
! 586: %%%%CreationDate: %s";
! 587: static char GPFAR psi2[] = "%%%%EndComments\n\
! 588: /Gpdict 100 dict def\n\
! 589: Gpdict begin\n\
! 590: /Color %s def\n\
! 591: /Dashed %s def\n\
! 592: /Gplinewidth %.3f def\n\
! 593: /hpt_ %.3f def\n\
! 594: /vpt_ %.3f def\n";
! 595:
! 596: time_t now;
! 597:
! 598: unsigned int xmin_t, ymin_t, xmax_t, ymax_t;
! 599: int i;
! 600: term->xmax = EPSL_XMAX;
! 601: term->ymax = EPSL_YMAX;
! 602: xmin_t = EPSL_XMAX * xoffset / (EPSL_SC);
! 603: xmax_t = EPSL_XMAX * (xsize + xoffset) / (EPSL_SC);
! 604: ymin_t = EPSL_YMAX * yoffset / (EPSL_SC);
! 605: ymax_t = EPSL_YMAX * (yoffset + ysize) / (EPSL_SC);
! 606:
! 607: fputs("%%!PS-Adobe-3.0 EPSF-3.0\n", gpoutfile);
! 608: if (outstr)
! 609: fprintf(gpoutfile, "%%%%Title: (%s)\n", outstr);
! 610: time(&now);
! 611: fprintf(gpoutfile, psi1, gnuplot_version, gnuplot_patchlevel, asctime(localtime(&now)));
! 612:
! 613: fprintf(gpoutfile, "%%%%BoundingBox: %d %d %d %d\n",
! 614: EPSL_XOFF + xmin_t, EPSL_XOFF + ymin_t,
! 615: EPSL_XOFF + xmax_t, EPSL_YOFF + ymax_t);
! 616:
! 617: fprintf(gpoutfile, psi2,
! 618: EPSL_color ? "true" : "false",
! 619: EPSL_solid ? "false" : "true",
! 620: (double) EPSL_LW, (double) EPSL_POINTSIZE, (double) EPSL_POINTSIZE);
! 621:
! 622: for (i = 0; EPSL_header[i] != NULL; i++)
! 623: fprintf(gpoutfile, "%s", EPSL_header[i]);
! 624:
! 625: fputs("end\n%%%%EndProlog\n", gpoutfile);
! 626:
! 627: EPSL_texfile = NULL;
! 628:
! 629: if (outstr && (dotIndex = strrchr(outstr, '.'))) {
! 630: /* assume file name is ending in ".eps" */
! 631: if (EPSL_texfilename)
! 632: free(EPSL_texfilename);
! 633: EPSL_texfilename = gp_alloc(dotIndex - outstr + 5, "epslatex texfilename");
! 634: if (EPSL_texfilename) {
! 635: /* including . */
! 636: safe_strncpy(EPSL_texfilename, outstr, dotIndex - outstr + 2);
! 637: strcpy(EPSL_texfilename + (dotIndex - outstr) + 1, "tex");
! 638: if ((EPSL_texfile = fopen(EPSL_texfilename, "w")) == (FILE *) NULL) {
! 639: fprintf(stderr, "Cannot open tex file %s for output\n", EPSL_texfilename);
! 640: }
! 641: } else {
! 642: fprintf(stderr, "Cannot make LaTeX file name from %s\nTurning off LaTeX output\n", outstr);
! 643: }
! 644: }
! 645: if (EPSL_texfile) {
! 646: name = gp_alloc(dotIndex - outstr + 1, "epslatex temp filename");
! 647: safe_strncpy(name, outstr, dotIndex - outstr + 1);
! 648: name[dotIndex - outstr] = 0;
! 649: fprintf(EPSL_texfile, "%%GNUPLOT: LaTeX picture with Postscript\n\
! 650: \\begin{picture}(0,0)%%\n\
! 651: \\includegraphics{%s}%%\n\
! 652: \\end{picture}%%\n\
! 653: \\setlength{\\unitlength}{%.4fbp}%%\n", name, 1.0 / EPSL_SC);
! 654: }
! 655: #ifdef PM3D
! 656: /* to optimize output for postscript terminals family */
! 657: postscript_gpoutfile = gpoutfile;
! 658: #endif
! 659: }
! 660:
! 661:
! 662: TERM_PUBLIC void
! 663: EPSL_graphics()
! 664: {
! 665: static char GPFAR psg1[] = "0 setgray\nnewpath\n";
! 666: struct termentry *t = term;
! 667:
! 668: fprintf(gpoutfile, "\
! 669: Gpdict begin\ngsave\n\
! 670: %d %d translate\n\
! 671: %.4f %.4f scale\n\
! 672: %s",
! 673: EPSL_XOFF, EPSL_YOFF,
! 674: 1.0 / EPSL_SC, 1.0 / EPSL_SC,
! 675: psg1);
! 676: EPSL_pointsize(pointsize);
! 677: EPSL_linewidth(1.0);
! 678: EPSL_path_count = 0;
! 679: EPSL_relative_ok = FALSE;
! 680: EPSL_pen_x = EPSL_pen_y = -4000;
! 681: EPSL_taken = 0;
! 682: EPSL_linetype_last = -1;
! 683:
! 684: if (EPSL_texfile)
! 685: fprintf(EPSL_texfile, "\\begin{picture}(%d,%d)(0,0)%%\n",
! 686: (int) (xsize * t->xmax), (int) (ysize * t->ymax));
! 687: }
! 688:
! 689:
! 690: TERM_PUBLIC void
! 691: EPSL_text()
! 692: {
! 693: EPSL_FLUSH_PATH;
! 694: fputs("grestore\nend\nshowpage\n%%%%EOF\n", gpoutfile);
! 695: if (EPSL_texfile) {
! 696: fputs("\\end{picture}%\n\\endinput\n", EPSL_texfile);
! 697: }
! 698: }
! 699:
! 700: TERM_PUBLIC void
! 701: EPSL_reset()
! 702: {
! 703: if (EPSL_texfile) {
! 704: fclose(EPSL_texfile);
! 705: EPSL_texfile = NULL;
! 706: }
! 707: }
! 708:
! 709:
! 710: TERM_PUBLIC void
! 711: EPSL_linetype(linetype)
! 712: int linetype;
! 713: {
! 714: EPSL_FLUSH_PATH;
! 715: linetype = (linetype % 4) + 2;
! 716: if (linetype < 0)
! 717: linetype = 0;
! 718: EPSL_relative_ok = FALSE;
! 719: #if 0
! 720: if (EPSL_linetype_last == linetype)
! 721: return;
! 722: #endif
! 723: EPSL_linetype_last = linetype;
! 724: fprintf(gpoutfile, "LT%c\n", "ba0123"[linetype]);
! 725: EPSL_path_count = 0;
! 726: }
! 727:
! 728:
! 729: TERM_PUBLIC void
! 730: EPSL_linewidth(linewidth)
! 731: double linewidth;
! 732: {
! 733: EPSL_FLUSH_PATH;
! 734: fprintf(gpoutfile, "%.3f Gpsetlinewidth\n", linewidth);
! 735: }
! 736:
! 737: TERM_PUBLIC void
! 738: EPSL_pointsize(ptsize)
! 739: double ptsize;
! 740: {
! 741: fprintf(gpoutfile, "%.3f Gpsetpointsize\n", ptsize);
! 742: }
! 743:
! 744: TERM_PUBLIC void
! 745: EPSL_move(x, y)
! 746: unsigned int x, y;
! 747: {
! 748: int dx, dy;
! 749: /* Make this semi-dynamic and independent of architecture */
! 750: char abso[5 + 2 * INT_STR_LEN], rel[5 + 2 * INT_STR_LEN];
! 751:
! 752: /*if (EPSL_path_count) {EPSL_FLUSH_PATH}; */
! 753: EPSL_FLUSH_PATH;
! 754: dx = x - EPSL_pen_x;
! 755: dy = y - EPSL_pen_y;
! 756: /* can't cancel all null moves--need a move after stroke'ing */
! 757: if (dx == 0 && dy == 0 && EPSL_relative_ok)
! 758: return;
! 759: sprintf(abso, "%d %d M\n", x, y);
! 760: sprintf(rel, "%d %d R\n", dx, dy);
! 761: if (strlen(rel) < strlen(abso) && EPSL_relative_ok) {
! 762: fputs(rel, gpoutfile);
! 763: EPSL_taken++;
! 764: } else
! 765: fputs(abso, gpoutfile);
! 766: EPSL_relative_ok = TRUE;
! 767: EPSL_path_count += 1;
! 768:
! 769: EPSL_pen_x = x;
! 770: EPSL_pen_y = y;
! 771: }
! 772:
! 773: TERM_PUBLIC void
! 774: EPSL_vector(x, y)
! 775: unsigned int x, y;
! 776: {
! 777: int dx, dy;
! 778: char abso[5 + 2 * INT_STR_LEN], rel[5 + 2 * INT_STR_LEN];
! 779:
! 780: dx = x - EPSL_pen_x;
! 781: dy = y - EPSL_pen_y;
! 782: if (dx == 0 && dy == 0)
! 783: return;
! 784: sprintf(abso, "%d %d L\n", x, y);
! 785: sprintf(rel, "%d %d V\n", dx, dy);
! 786: if (strlen(rel) < strlen(abso) && EPSL_relative_ok) {
! 787: fputs(rel, gpoutfile);
! 788: EPSL_taken++;
! 789: } else
! 790: fputs(abso, gpoutfile);
! 791: EPSL_relative_ok = TRUE;
! 792: EPSL_path_count += 1;
! 793: EPSL_pen_x = x;
! 794: EPSL_pen_y = y;
! 795: /* if (ps_path_count >= 400) {
! 796: fprintf(gpoutfile,"currentpoint stroke M\n");
! 797: ps_path_count = 0;
! 798: }
! 799: */
! 800: }
! 801:
! 802: TERM_PUBLIC void
! 803: EPSL_arrow(xstart, ystart, xend, yend, head)
! 804: unsigned int xstart, ystart, xend, yend;
! 805: TBOOLEAN head;
! 806: {
! 807: fprintf(gpoutfile, "%d %d M\n%d %d %s\n", xstart, ystart, xend, yend, head ? "Arrow" : "L Gpstroke");
! 808: }
! 809:
! 810: TERM_PUBLIC void
! 811: EPSL_put_text(x, y, str)
! 812: unsigned int x, y;
! 813: char *str;
! 814: {
! 815: if (EPSL_texfile) {
! 816: fprintf(EPSL_texfile, "\\put(%d,%d){", x, y);
! 817: if (EPSL_ang) {
! 818: fputs("\\rotatebox{90}{", EPSL_texfile);
! 819: }
! 820: if (((str[0] == '{') || (str[0] == '['))) {
! 821: fprintf(EPSL_texfile, "\\makebox(0,0)%s", str);
! 822: } else
! 823: switch (EPSL_justify) {
! 824: case LEFT:
! 825: fprintf(EPSL_texfile, "\\makebox(0,0)[l]{\\strut{}%s}", str);
! 826: break;
! 827: case CENTRE:
! 828: fprintf(EPSL_texfile, "\\makebox(0,0){\\strut{}%s}", str);
! 829: break;
! 830: case RIGHT:
! 831: fprintf(EPSL_texfile, "\\makebox(0,0)[r]{\\strut{}%s}", str);
! 832: break;
! 833: }
! 834: if (EPSL_ang) {
! 835: fputs("}", EPSL_texfile);
! 836: }
! 837: fputs("}%\n", EPSL_texfile);
! 838: }
! 839: }
! 840:
! 841:
! 842: TERM_PUBLIC int
! 843: EPSL_text_angle(ang)
! 844: int ang;
! 845: {
! 846: EPSL_ang = ang;
! 847: return TRUE;
! 848: }
! 849:
! 850:
! 851: TERM_PUBLIC int
! 852: EPSL_justify_text(mode)
! 853: enum JUSTIFY mode;
! 854: {
! 855: EPSL_justify = mode;
! 856: return TRUE;
! 857: }
! 858:
! 859:
! 860: TERM_PUBLIC int
! 861: EPSL_set_font(font) /* Entry font added by DJL */
! 862: char *font;
! 863: {
! 864: char name[32];
! 865: int size, sep;
! 866:
! 867: sep = strcspn(font, ",");
! 868: strncpy(name, font, sep);
! 869: name[sep] = 0;
! 870: size = EPSL_fontsize;
! 871: sscanf(&(font[sep + 1]), "%d", &size);
! 872: return TRUE;
! 873: }
! 874:
! 875: TERM_PUBLIC void
! 876: EPSL_point(x, y, number)
! 877: unsigned int x, y;
! 878: int number;
! 879: {
! 880: static char GPFAR *GPFAR pointFNS[] = { "Pnt", "Dia", "Crc", "Crs", "CrX", "Box", "DaF", "CcF", "BxF" };
! 881:
! 882: EPSL_FLUSH_PATH;
! 883: if (number < 0)
! 884: number = -1; /* negative types are all 'dot' */
! 885: else
! 886: number %= sizeof(pointFNS) / sizeof(pointFNS[0]) - 1;
! 887: fprintf(gpoutfile, "%d %d %s\n", x, y, pointFNS[number + 1]);
! 888:
! 889: EPSL_relative_ok = 0;
! 890: EPSL_path_count = 0;
! 891: EPSL_linetype_last = -1; /* force next linetype change */
! 892: }
! 893:
! 894: TERM_PUBLIC void
! 895: EPSL_fillbox(style, x1, y1, x2, y2)
! 896: int style;
! 897: unsigned int x1, y1, x2, y2;
! 898: {
! 899: /* ULIG: the style parameter is now used for the fillboxes style
! 900: * (not implemented here), see the documentation */
! 901: EPSL_FLUSH_PATH fprintf(gpoutfile, "%d %d %d %d BoxFill\n", x1, y1, x2, y2);
! 902:
! 903: EPSL_relative_ok = 0;
! 904: EPSL_linetype_last = -1;
! 905: }
! 906:
! 907: #ifdef PM3D
! 908:
! 909: TERM_PUBLIC void
! 910: EPSL_filled_polygon(points, corners)
! 911: int points;
! 912: gpiPoint *corners;
! 913: {
! 914: PS_filled_polygon(points, corners);
! 915: EPSL_relative_ok = FALSE;
! 916: }
! 917:
! 918: #endif /* PM3D */
! 919:
! 920: #endif /* TERM_BODY */
! 921:
! 922: #ifdef TERM_TABLE
! 923:
! 924: TERM_TABLE_START(epslatex_driver)
! 925: "epslatex",
! 926: "LaTeX (Text) and encapsulated PostScript",
! 927: EPSL_XMAX, EPSL_YMAX, EPSL_VCHAR, EPSL_HCHAR,
! 928: EPSL_VTIC, EPSL_HTIC, EPSL_options, EPSL_init, EPSL_reset,
! 929: EPSL_text, null_scale, EPSL_graphics, EPSL_move, EPSL_vector,
! 930: EPSL_linetype, EPSL_put_text, EPSL_text_angle,
! 931: EPSL_justify_text, EPSL_point, EPSL_arrow, EPSL_set_font, EPSL_pointsize,
! 932: 0 /*flags */ , 0 /*suspend */ , 0 /*resume */ , EPSL_fillbox, EPSL_linewidth
! 933: #ifdef PM3D
! 934: #ifdef USE_MOUSE
! 935: , 0, 0, 0, 0, 0 /* no mouse support for epslatex */
! 936: #endif
! 937: , PS_make_palette,
! 938: PS_previous_palette,
! 939: PS_set_color,
! 940: EPSL_filled_polygon
! 941: #endif
! 942: TERM_TABLE_END(epslatex_driver)
! 943:
! 944: #undef LAST_TERM
! 945: #define LAST_TERM epslatex_driver
! 946: #endif /* TERM_TABLE */
! 947: #endif /* TERM_PROTO_ONLY */
! 948:
! 949: #ifdef TERM_HELP
! 950: START_HELP(post)
! 951: "1 epslatex",
! 952: "?commands set terminal epslatex",
! 953: "?set terminal epslatex",
! 954: "?set term epslatex",
! 955: "?terminal epslatex",
! 956: "?term epslatex",
! 957: "?epslatex",
! 958: " Two options may be set in the `epslatex` driver.",
! 959: "",
! 960: " Syntax:",
! 961: " set terminal epslatex {default}",
! 962: " {color | monochrome} {solid | dashed}",
! 963: " {\"<fontname>\"} {<fontsize>}",
! 964: "",
! 965: " `default` mode sets all options to their defaults: `monochrome`, `dashed`,",
! 966: " \"default\" and 11pt.",
! 967: " Default size of a plot is 5 inches wide and 3 inches high.",
! 968: "",
! 969: " `solid` draws all plots with solid lines, overriding any dashed patterns;",
! 970: " `\"<fontname>\"` is the name of font; and `<fontsize>` is",
! 971: " the size of the font in PostScript points. Font selection isn't supported yet.",
! 972: " Font size selection is supported only for the calculation of proper spacing.",
! 973: " The actual LaTeX font at the point of inclusion is taken, so use LaTeX commands",
! 974: " for changing fonts. If you use e.g. 12pt as font size for your LaTeX documents, ",
! 975: " use '\"default\" 12' as options.",
! 976: "",
! 977: " All drivers for LaTeX offer a special way of controlling text positioning:",
! 978: " If any text string begins with '{', you also need to include a '}' at the",
! 979: " end of the text, and the whole text will be centered both horizontally",
! 980: " and vertically by LaTeX. --- If the text string begins with '[', you need",
! 981: " to continue it with: a position specification (up to two out of t,b,l,r),",
! 982: " ']{', the text itself, and finally, '}'. The text itself may be anything",
! 983: " LaTeX can typeset as an LR-box. \\rule{}{}'s may help for best positioning.",
! 984: " See also the documenation of the pslatex terminal driver.",
! 985: " To create multiline labels, use \\shortstack, example",
! 986: " set ylabel '[r]{\\shortstack{first line \\\\ second line}}' ",
! 987: "",
! 988: " The driver produces two different files, one for the LaTeX part and one for",
! 989: " the eps part of the figure. ",
! 990: " The name of the LaTeX file is derived from the name of",
! 991: " the eps file given on the `set output` command; it is determined by replacing",
! 992: " the trailing `.eps` (actually just the final extent in the file name---and",
! 993: " the option will be turned off if there is no extent) with `.tex` in the output",
! 994: " file name. Remember to close the file before leaving `gnuplot`.",
! 995: " There is no LaTeX output if no output file is given!",
! 996: " In your LaTeX documents use '\\input{filename}' for inclusion of the figure.",
! 997: " Include \\usepackage{graphics} in the preambel!",
! 998: " Via 'epstopdf' (contained e.g. in the teTeX package, requires ghostscript)",
! 999: " pdf files can made out of the eps files. If the graphics package is properly",
! 1000: " configured, the LaTeX files can also be processed by pdflatex without",
! 1001: " changes, and the pdf files are included instead of the eps files"
! 1002: END_HELP(post)
! 1003: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>