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

Annotation of OpenXM_contrib/gnuplot/term/post.trm, Revision 1.1

1.1     ! maekawa     1: /*
        !             2:  * $Id: post.trm,v 1.46 1998/06/18 14:59:23 ddenholm Exp $
        !             3:  */
        !             4:
        !             5: /* GNUPLOT - post.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 terminal driver supports:
        !            39:  *     postscript
        !            40:  *
        !            41:  * AUTHORS
        !            42:  *  Russell Lang
        !            43:  *
        !            44:  * modified 10/5/95 by drd - put in support for other postscript drivers
        !            45:  * (enhpost, pslatex, ...) so they dont have to work quite so hard
        !            46:  *
        !            47:  * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
        !            48:  *
        !            49:  * The 'postscript' driver produces landscape output 10" wide and 7" high.
        !            50:  * To change font to Times-Roman and font size to 20pts use
        !            51:  * 'set term postscript "Times-Roman" 20'.
        !            52:  * To get a smaller (5" x 3.5") eps output use 'set term post eps'
        !            53:  * and make only one plot per file.  Font size for eps will be half
        !            54:  * the specified size.
        !            55:  *
        !            56:  * Erik Luijten 30/5/97: added %%CreationDate, made %%DocumentFonts conform
        !            57:  *                       to DSC, added version no. and patchl. to %%Creator
        !            58:  */
        !            59:
        !            60: #include "driver.h"
        !            61:
        !            62: #ifdef TERM_REGISTER
        !            63: register_term(post)
        !            64: #endif
        !            65:
        !            66: #ifdef TERM_PROTO
        !            67: TERM_PUBLIC void PS_options __PROTO((void));
        !            68: TERM_PUBLIC void PS_common_init __PROTO((int encap, int portrait, int uses_fonts, unsigned int xoff, unsigned int yoff, unsigned int bb_xmin, unsigned int bb_ymin, unsigned int bb_xmax, unsigned int bb_ymax, char **dict));
        !            69: TERM_PUBLIC void PS_init __PROTO((void));
        !            70: TERM_PUBLIC void PS_graphics __PROTO((void));
        !            71: TERM_PUBLIC void PS_text __PROTO((void));
        !            72: TERM_PUBLIC void PS_reset __PROTO((void));
        !            73: TERM_PUBLIC void PS_linetype __PROTO((int linetype));
        !            74: TERM_PUBLIC void PS_move __PROTO((unsigned int x, unsigned int y));
        !            75: TERM_PUBLIC void PS_vector __PROTO((unsigned int x, unsigned int y));
        !            76: TERM_PUBLIC void PS_put_text __PROTO((unsigned int x, unsigned int y, char *str));
        !            77: TERM_PUBLIC void ENHPS_put_text __PROTO((unsigned int x, unsigned int y, char *str));
        !            78: TERM_PUBLIC int PS_text_angle __PROTO((int ang));
        !            79: TERM_PUBLIC int PS_justify_text __PROTO((enum JUSTIFY mode));
        !            80: TERM_PUBLIC void PS_point __PROTO((unsigned int x, unsigned int y, int number));
        !            81: TERM_PUBLIC int PS_set_font __PROTO((char * font));
        !            82: TERM_PUBLIC int ENHPS_set_font __PROTO((char * font));
        !            83: TERM_PUBLIC void PS_fillbox __PROTO((int style, unsigned int x1, unsigned int y1, unsigned int width, unsigned int height));
        !            84: TERM_PUBLIC void PS_linewidth __PROTO((double linewidth)); /* JFi [linewidth] */
        !            85: TERM_PUBLIC void PS_pointsize __PROTO((double ptsize)); /* JFi [pointsize] */
        !            86:
        !            87: #define PS_POINT_TYPES 8
        !            88: #define PS_XOFF        50      /* page offset in pts */
        !            89: #define PS_YOFF        50
        !            90: #define PS_XMAX 7200 /* assumes landscape */
        !            91: #define PS_YMAX 5040
        !            92: #define PS_XLAST (PS_XMAX - 1)
        !            93: #define PS_YLAST (PS_YMAX - 1)
        !            94: #define PS_VTIC (PS_YMAX/80)
        !            95: #define PS_HTIC (PS_YMAX/80)
        !            96: #define PS_SC (10)                             /* scale is 1pt = 10 units */
        !            97: #define        PS_LW (0.5*PS_SC)               /* linewidth = 0.5 pts */
        !            98: #define PS_VCHAR (14*PS_SC)            /* default is 14 point characters */
        !            99: #define PS_HCHAR (14*PS_SC*6/10)
        !           100:
        !           101: #endif
        !           102:
        !           103:
        !           104: #ifndef TERM_PROTO_ONLY
        !           105:
        !           106: #ifdef TERM_BODY
        !           107: /* PostScript driver by Russell Lang, rjl@monu1.cc.monash.edu.au */
        !           108:
        !           109: /* From version.c */
        !           110: extern char version[];
        !           111: extern char patchlevel[];
        !           112:
        !           113: #define PS_FLUSH_PATH \
        !           114:     if (ps_path_count) { fprintf(gpoutfile, "stroke "); ps_path_count = 0; }
        !           115:
        !           116: static char *PS_RememberFont __PROTO((char *fname, int reencode));
        !           117: static void ENHPS_put_text __PROTO((unsigned int x, unsigned int y, char *str));
        !           118: static char *ENHPS_recurse __PROTO((char *p, TBOOLEAN brace, char *fontname, double fontsize, double base, TBOOLEAN widthflag, TBOOLEAN showflag));
        !           119: static char ps_font[MAX_ID_LEN+1] = "Helvetica" ; /* name of font */
        !           120: static int ps_fontsize = 14;                                    /* size of font in pts */
        !           121:
        !           122: /* for enhanced mode, we keep a separate font name and size, which
        !           123:  * is restored to the default value on font of ""
        !           124:  */
        !           125: static char ps_enh_font[MAX_ID_LEN+1];
        !           126: static int  ps_enh_fontsize;
        !           127:
        !           128: static TBOOLEAN ps_portrait = FALSE;                            /* vertical page */
        !           129: static TBOOLEAN ps_color = FALSE;
        !           130: static TBOOLEAN ps_solid = FALSE;              /*  use solid lines */
        !           131: static TBOOLEAN ps_eps = FALSE;        /* Is this for an eps file? */
        !           132:                        /* Added by Robert Davis <davis@ecn.purdue.edu> */
        !           133: static int ps_page=0;                  /* page count */
        !           134: static int ps_path_count=0;    /* count of lines in path */
        !           135: static int ps_ang=0;                   /* text angle */
        !           136: static enum JUSTIFY ps_justify=LEFT;   /* text is flush left */
        !           137:
        !           138: /* added by Matt Heffron <heffron@falstaff.css.beckman.com> */
        !           139: static TBOOLEAN ps_duplex_state = FALSE;
        !           140: static TBOOLEAN ps_duplex_option = FALSE;
        !           141:
        !           142: static char GPFAR * GPFAR PS_header[] = {
        !           143: "/M {moveto} bind def\n",
        !           144: "/L {lineto} bind def\n",
        !           145: "/R {rmoveto} bind def\n",
        !           146: "/V {rlineto} bind def\n",
        !           147: "/vpt2 vpt 2 mul def\n",
        !           148: "/hpt2 hpt 2 mul def\n",
        !           149: /* flush left show */
        !           150: "/Lshow { currentpoint stroke M\n",
        !           151: "  0 vshift R show } def\n",
        !           152: /* flush right show */
        !           153: "/Rshow { currentpoint stroke M\n",
        !           154: "  dup stringwidth pop neg vshift R show } def\n",
        !           155: /* centred show */
        !           156: "/Cshow { currentpoint stroke M\n",
        !           157: "  dup stringwidth pop -2 div vshift R show } def\n",
        !           158: /* set pointsize */
        !           159: "/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def\n",
        !           160: "  /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def\n",
        !           161: /* Dash or Color Line */
        !           162: "/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }\n",
        !           163: " {pop pop pop Solid {pop []} if 0 setdash} ifelse } def\n",
        !           164: /* Border Lines */
        !           165: "/BL { stroke gnulinewidth 2 mul setlinewidth } def\n",
        !           166: /* Axes Lines */
        !           167: "/AL { stroke gnulinewidth 2 div setlinewidth } def\n",
        !           168: /* set user defined linewidth */
        !           169: "/UL { gnulinewidth mul /userlinewidth exch def } def\n",
        !           170: /* Plot Lines */
        !           171: "/PL { stroke userlinewidth setlinewidth } def\n",
        !           172: /* Line Types */
        !           173: "/LTb { BL [] 0 0 0 DL } def\n", /* border */
        !           174: "/LTa { AL [1 dl 2 dl] 0 setdash 0 0 0 setrgbcolor } def\n", /* axes */
        !           175: "/LT0 { PL [] 1 0 0 DL } def\n",
        !           176: "/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def\n",
        !           177: "/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def\n",
        !           178: "/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def\n",
        !           179: "/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def\n",
        !           180: "/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def\n",
        !           181: "/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def\n",
        !           182: "/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def\n",
        !           183: "/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def\n",
        !           184: /* Point (Round) */    /* Matt Heffron make it round */
        !           185: "/Pnt { stroke [] 0 setdash\n",
        !           186: "   gsave 1 setlinecap M 0 0 V stroke grestore } def\n",
        !           187:
        !           188: /* Diamond */
        !           189: "/Dia { stroke [] 0 setdash 2 copy vpt add M\n",
        !           190: "  hpt neg vpt neg V hpt vpt neg V\n",
        !           191: "  hpt vpt V hpt neg vpt V closepath stroke\n",
        !           192: "  Pnt } def\n",
        !           193:
        !           194: /* Plus */
        !           195: "/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V\n",
        !           196: "  currentpoint stroke M\n",
        !           197: "  hpt neg vpt neg R hpt2 0 V stroke\n",
        !           198: "  } def\n",
        !           199:
        !           200: /* Box */
        !           201: "/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M\n",
        !           202: "  0 vpt2 neg V hpt2 0 V 0 vpt2 V\n",
        !           203: "  hpt2 neg 0 V closepath stroke\n",
        !           204: "  Pnt } def\n",
        !           205:
        !           206: /* Cross (X) */
        !           207: "/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M\n",
        !           208: "  hpt2 vpt2 neg V currentpoint stroke M\n",
        !           209: "  hpt2 neg 0 R hpt2 vpt2 V stroke } def\n",
        !           210:
        !           211: /* Triangle Up*/
        !           212: "/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M\n",
        !           213: "  hpt neg vpt -1.62 mul V\n",
        !           214: "  hpt 2 mul 0 V\n",
        !           215: "  hpt neg vpt 1.62 mul V closepath stroke\n",
        !           216: "  Pnt  } def\n",
        !           217:
        !           218: /* Star */
        !           219: "/Star { 2 copy Pls Crs } def\n",
        !           220:
        !           221: /* div added filed box */
        !           222: /* Filled Box */
        !           223: "/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M\n",
        !           224: "  0 vpt2 neg V  hpt2 0 V  0 vpt2 V\n",
        !           225: "  hpt2 neg 0 V  closepath fill } def\n",
        !           226:
        !           227: /* div added filled triangle */
        !           228: /* Triangle Up, Filled */
        !           229: "/TriUF { stroke [] 0 setdash vpt 1.12 mul add M\n",
        !           230: "  hpt neg vpt -1.62 mul V\n",
        !           231: "  hpt 2 mul 0 V\n",
        !           232: "  hpt neg vpt 1.62 mul V closepath fill } def\n",
        !           233:
        !           234: /* Matt Heffron: added a few more types */
        !           235: /* Triangle Down */
        !           236: "/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M\n",
        !           237: "  hpt neg vpt 1.62 mul V\n",
        !           238: "  hpt 2 mul 0 V\n",
        !           239: "  hpt neg vpt -1.62 mul V closepath stroke\n",
        !           240: "  Pnt  } def\n",
        !           241:
        !           242: /* Triangle Down, Filled*/
        !           243: "/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M\n",
        !           244: "  hpt neg vpt 1.62 mul V\n",
        !           245: "  hpt 2 mul 0 V\n",
        !           246: "  hpt neg vpt -1.62 mul V closepath fill} def\n",
        !           247:
        !           248: /* Diamond, Filled */
        !           249: "/DiaF { stroke [] 0 setdash vpt add M\n",
        !           250: "  hpt neg vpt neg V hpt vpt neg V\n",
        !           251: "  hpt vpt V hpt neg vpt V closepath fill } def\n",
        !           252:
        !           253: /* Pentagon */
        !           254: "/Pent { stroke [] 0 setdash 2 copy gsave\n",
        !           255: "  translate 0 hpt M 4 {72 rotate 0 hpt L} repeat\n",
        !           256: "  closepath stroke grestore Pnt } def\n",
        !           257:
        !           258: /* Pentagon, Filled */
        !           259: "/PentF { stroke [] 0 setdash gsave\n",
        !           260: "  translate 0 hpt M 4 {72 rotate 0 hpt L} repeat\n",
        !           261: "  closepath fill grestore } def\n",
        !           262:
        !           263: /* Circle */
        !           264: "/Circle { stroke [] 0 setdash 2 copy\n",
        !           265: "  hpt 0 360 arc stroke Pnt } def\n",
        !           266:
        !           267: /* Circle,Filled */
        !           268: "/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def\n",
        !           269: /* 16 differently filled circles */
        !           270: "/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450  arc } bind def\n",
        !           271: "/C1 { BL [] 0 setdash 2 copy        moveto\n",
        !           272: "       2 copy  vpt 0 90 arc closepath fill\n",
        !           273: "               vpt 0 360 arc closepath } bind def\n",
        !           274: "/C2 { BL [] 0 setdash 2 copy moveto\n",
        !           275: "       2 copy  vpt 90 180 arc closepath fill\n",
        !           276: "               vpt 0 360 arc closepath } bind def\n",
        !           277: "/C3 { BL [] 0 setdash 2 copy moveto\n",
        !           278: "       2 copy  vpt 0 180 arc closepath fill\n",
        !           279: "               vpt 0 360 arc closepath } bind def\n",
        !           280: "/C4 { BL [] 0 setdash 2 copy moveto\n",
        !           281: "       2 copy  vpt 180 270 arc closepath fill\n",
        !           282: "               vpt 0 360 arc closepath } bind def\n",
        !           283: "/C5 { BL [] 0 setdash 2 copy moveto\n",
        !           284: "       2 copy  vpt 0 90 arc\n",
        !           285: "       2 copy moveto\n",
        !           286: "       2 copy  vpt 180 270 arc closepath fill\n",
        !           287: "               vpt 0 360 arc } bind def\n",
        !           288: "/C6 { BL [] 0 setdash 2 copy moveto\n",
        !           289: "      2 copy  vpt 90 270 arc closepath fill\n",
        !           290: "              vpt 0 360 arc closepath } bind def\n",
        !           291: "/C7 { BL [] 0 setdash 2 copy moveto\n",
        !           292: "      2 copy  vpt 0 270 arc closepath fill\n",
        !           293: "              vpt 0 360 arc closepath } bind def\n",
        !           294: "/C8 { BL [] 0 setdash 2 copy moveto\n",
        !           295: "      2 copy vpt 270 360 arc closepath fill\n",
        !           296: "              vpt 0 360 arc closepath } bind def\n",
        !           297: "/C9 { BL [] 0 setdash 2 copy moveto\n",
        !           298: "      2 copy  vpt 270 450 arc closepath fill\n",
        !           299: "              vpt 0 360 arc closepath } bind def\n",
        !           300: "/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill\n",
        !           301: "       2 copy moveto\n",
        !           302: "       2 copy vpt 90 180 arc closepath fill\n",
        !           303: "               vpt 0 360 arc closepath } bind def\n",
        !           304: "/C11 { BL [] 0 setdash 2 copy moveto\n",
        !           305: "       2 copy  vpt 0 180 arc closepath fill\n",
        !           306: "       2 copy moveto\n",
        !           307: "       2 copy  vpt 270 360 arc closepath fill\n",
        !           308: "               vpt 0 360 arc closepath } bind def\n",
        !           309: "/C12 { BL [] 0 setdash 2 copy moveto\n",
        !           310: "       2 copy  vpt 180 360 arc closepath fill\n",
        !           311: "               vpt 0 360 arc closepath } bind def\n",
        !           312: "/C13 { BL [] 0 setdash  2 copy moveto\n",
        !           313: "       2 copy  vpt 0 90 arc closepath fill\n",
        !           314: "       2 copy moveto\n",
        !           315: "       2 copy  vpt 180 360 arc closepath fill\n",
        !           316: "               vpt 0 360 arc closepath } bind def\n",
        !           317: "/C14 { BL [] 0 setdash 2 copy moveto\n",
        !           318: "       2 copy  vpt 90 360 arc closepath fill\n",
        !           319: "               vpt 0 360 arc } bind def\n",
        !           320: "/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill\n",
        !           321: "               vpt 0 360 arc closepath } bind def\n",
        !           322:
        !           323: /* Auxiliary definitions for rectangles */
        !           324:
        !           325: "/Rec   { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto\n",
        !           326: "       neg 0 rlineto closepath } bind def\n",
        !           327: "/Square { dup Rec } bind def\n",
        !           328: "/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def\n",
        !           329:
        !           330: /* 16 differently filled squares */
        !           331:
        !           332: "/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def\n",
        !           333: "/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def\n",
        !           334: "/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def\n",
        !           335: "/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def\n",
        !           336: "/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def\n",
        !           337: "/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill\n",
        !           338: "       exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def\n",
        !           339: "/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def\n",
        !           340: "/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill\n",
        !           341: "       2 copy vpt Square fill\n",
        !           342: "       Bsquare } bind def\n",
        !           343: "/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def\n",
        !           344: "/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def\n",
        !           345: "/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill\n",
        !           346: "       Bsquare } bind def\n",
        !           347: "/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill\n",
        !           348: "       Bsquare } bind def\n",
        !           349: "/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def\n",
        !           350: "/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill\n",
        !           351: "       2 copy vpt Square fill Bsquare } bind def\n",
        !           352: "/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill\n",
        !           353: "       2 copy exch vpt sub exch vpt Square fill Bsquare } bind def\n",
        !           354: "/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def\n",
        !           355:
        !           356: /* 16 different diamonds (actually just rotated squares) */
        !           357:
        !           358: "/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def\n",
        !           359: "/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def\n",
        !           360: "/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def\n",
        !           361: "/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def\n",
        !           362: "/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def\n",
        !           363: "/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def\n",
        !           364: "/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def\n",
        !           365: "/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def\n",
        !           366: "/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def\n",
        !           367: "/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def\n",
        !           368: "/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def\n",
        !           369: "/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def\n",
        !           370: "/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def\n",
        !           371: "/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def\n",
        !           372: "/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def\n",
        !           373: "/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def\n",
        !           374:
        !           375: /* closed figures w/o the point in the middle (added by Dick Crawford) */
        !           376:
        !           377: /* Diamond */
        !           378: "/DiaE { stroke [] 0 setdash vpt add M\n",
        !           379: "  hpt neg vpt neg V hpt vpt neg V\n",
        !           380: "  hpt vpt V hpt neg vpt V closepath stroke } def\n",
        !           381:
        !           382: /* Box */
        !           383: "/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M\n",
        !           384: "  0 vpt2 neg V hpt2 0 V 0 vpt2 V\n",
        !           385: "  hpt2 neg 0 V closepath stroke } def\n",
        !           386:
        !           387: /* Triangle Up*/
        !           388: "/TriUE { stroke [] 0 setdash vpt 1.12 mul add M\n",
        !           389: "  hpt neg vpt -1.62 mul V\n",
        !           390: "  hpt 2 mul 0 V\n",
        !           391: "  hpt neg vpt 1.62 mul V closepath stroke } def\n",
        !           392:
        !           393: /* Triangle Down */
        !           394: "/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M\n",
        !           395: "  hpt neg vpt 1.62 mul V\n",
        !           396: "  hpt 2 mul 0 V\n",
        !           397: "  hpt neg vpt -1.62 mul V closepath stroke } def\n",
        !           398:
        !           399: /* Pentagon */
        !           400: "/PentE { stroke [] 0 setdash gsave\n",
        !           401: "  translate 0 hpt M 4 {72 rotate 0 hpt L} repeat\n",
        !           402: "  closepath stroke grestore } def\n",
        !           403:
        !           404: /* Circle */
        !           405: "/CircE { stroke [] 0 setdash \n",
        !           406: "  hpt 0 360 arc stroke } def\n",
        !           407:
        !           408: /* opaque closed figures w/o the point in the middle (added by Dick Crawford) */
        !           409:
        !           410: "/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def\n",
        !           411:
        !           412: /* Diamond */
        !           413: "/DiaW { stroke [] 0 setdash vpt add M\n",
        !           414: "  hpt neg vpt neg V hpt vpt neg V\n",
        !           415: "  hpt vpt V hpt neg vpt V Opaque stroke } def\n",
        !           416:
        !           417: /* Box */
        !           418: "/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M\n",
        !           419: "  0 vpt2 neg V hpt2 0 V 0 vpt2 V\n",
        !           420: "  hpt2 neg 0 V Opaque stroke } def\n",
        !           421:
        !           422: /* Triangle Up*/
        !           423: "/TriUW { stroke [] 0 setdash vpt 1.12 mul add M\n",
        !           424: "  hpt neg vpt -1.62 mul V\n",
        !           425: "  hpt 2 mul 0 V\n",
        !           426: "  hpt neg vpt 1.62 mul V Opaque stroke } def\n",
        !           427:
        !           428: /* Triangle Down */
        !           429: "/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M\n",
        !           430: "  hpt neg vpt 1.62 mul V\n",
        !           431: "  hpt 2 mul 0 V\n",
        !           432: "  hpt neg vpt -1.62 mul V Opaque stroke } def\n",
        !           433:
        !           434: /* Pentagon */
        !           435: "/PentW { stroke [] 0 setdash gsave\n",
        !           436: "  translate 0 hpt M 4 {72 rotate 0 hpt L} repeat\n",
        !           437: "  Opaque stroke grestore } def\n",
        !           438:
        !           439: /* Circle */
        !           440: "/CircW { stroke [] 0 setdash \n",
        !           441: "  hpt 0 360 arc Opaque stroke } def\n",
        !           442:
        !           443: /* filled box : usage   x1 y1 x2 y2 BoxFill */
        !           444: "/BoxFill { gsave Rec 1 setgray fill grestore } def\n",
        !           445:
        !           446: NULL
        !           447: };
        !           448:
        !           449: static char GPFAR * GPFAR ENHPS_header[] = {
        !           450: /* For MFshow and MFwidth the tos is an array with the string and font info:  */
        !           451: /*     [<fontname (a string)> <fontsize> <vertical offset> <width significant?> <printed?> <text string>]  */
        !           452:
        !           453: "/MFshow {{dup dup 0 get findfont exch 1 get scalefont setfont\n",
        !           454: "     [ currentpoint ] exch dup 2 get 0 exch rmoveto dup dup 5 get exch 4 get\n",
        !           455: "     {show} {stringwidth pop 0 rmoveto}ifelse dup 3 get\n",
        !           456: "     {2 get neg 0 exch rmoveto pop} {pop aload pop moveto}ifelse} forall} bind def\n",
        !           457: "/MFwidth {0 exch {dup 3 get{dup dup 0 get findfont exch 1 get scalefont setfont\n",
        !           458: "      5 get stringwidth pop add}\n",
        !           459: "    {pop} ifelse} forall} bind def\n",
        !           460:
        !           461: /* flush left show */
        !           462: "/MLshow { currentpoint stroke M\n",
        !           463: "  0 exch R MFshow } bind def\n",
        !           464:
        !           465: /* flush right show */
        !           466: "/MRshow { currentpoint stroke M\n",
        !           467: "  exch dup MFwidth neg 3 -1 roll R MFshow } def\n",
        !           468:
        !           469: /* centred show */
        !           470: "/MCshow { currentpoint stroke M\n",
        !           471: "  exch dup MFwidth -2 div 3 -1 roll R MFshow } def\n",
        !           472: NULL
        !           473: };
        !           474:
        !           475: /* added to enhpost by Matt Heffron <heffron@falstaff.css.beckman.com> */
        !           476: /* moved to post.trm by drd */
        !           477:
        !           478: static struct PS_FontName {
        !           479:        char *name;
        !           480:        struct PS_FontName *next;
        !           481: } *PS_DocFonts = NULL;
        !           482:
        !           483: /* given a font, look in store to see if it is there already
        !           484:  * if so, return NULL. If not, reencode it if allowed to, otherwise
        !           485:  * return an appropriate re-encode string
        !           486:  */
        !           487:
        !           488: TERM_PUBLIC char *PS_RememberFont(fname, can_reencode)
        !           489: char *fname;
        !           490: int can_reencode;
        !           491: {
        !           492:        struct PS_FontName *fnp;
        !           493:        char *recode = NULL;
        !           494:
        !           495:    for (fnp=PS_DocFonts; fnp ; fnp = fnp->next)
        !           496:                if (strcmp(fnp->name, fname)==0)
        !           497:                        return NULL;
        !           498:
        !           499:        /* we did not find the name */
        !           500:
        !           501:    fnp = (struct PS_FontName *)gp_alloc(sizeof(struct PS_FontName), "PostScript Font record");
        !           502:    fnp->name = gp_alloc(1+strlen(fname), "PostScript Font name");
        !           503:    strcpy(fnp->name, fname);
        !           504:    fnp->next = PS_DocFonts;
        !           505:    PS_DocFonts = fnp;
        !           506:
        !           507:        switch(encoding)
        !           508:        {
        !           509:                case ENCODING_ISO_8859_1:
        !           510:                        recode = "reencodeISO def\n";
        !           511:                        break;
        !           512:                case ENCODING_CP_437:
        !           513:                        recode = "reencodeCP437 def\n";
        !           514:                        break;
        !           515:                case ENCODING_CP_850 :
        !           516:                        recode = "reencodeCP850 def\n";
        !           517:                        break;
        !           518:        }
        !           519:
        !           520:        if (can_reencode && recode)
        !           521:        {       fprintf(gpoutfile,"/%s %s",fname, recode);
        !           522:                return NULL;
        !           523:        }
        !           524:        else
        !           525:                return recode;
        !           526: }
        !           527:
        !           528: static int PS_pen_x, PS_pen_y;
        !           529: static int PS_taken;
        !           530: static int PS_linetype_last;
        !           531: static TBOOLEAN PS_relative_ok;
        !           532:
        !           533: TERM_PUBLIC void PS_options()
        !           534: {
        !           535:        if (!END_OF_COMMAND) {
        !           536:                if (almost_equals(c_token,"p$ortrait")) {
        !           537:                        ps_portrait=TRUE;
        !           538:                        ps_eps=FALSE;
        !           539:                        c_token++;
        !           540:                }
        !           541:                else if (almost_equals(c_token,"l$andscape")) {
        !           542:                        ps_portrait=FALSE;
        !           543:                        ps_eps=FALSE;
        !           544:                        c_token++;
        !           545:                }
        !           546:                else if (almost_equals(c_token,"ep$sf")) {
        !           547:                        ps_portrait=TRUE;
        !           548:                        ps_eps = TRUE;
        !           549:                        c_token++;
        !           550:                }
        !           551:                else if (almost_equals(c_token,"d$efault")) {
        !           552:                        ps_portrait=FALSE;
        !           553:                        ps_eps=FALSE;
        !           554:                        ps_color=FALSE;
        !           555:                        ps_solid=FALSE;
        !           556:                        ps_duplex_option=FALSE;
        !           557:                        strcpy(ps_font,"Helvetica");
        !           558:                        ps_fontsize = 14;
        !           559:                        term->v_char = (unsigned int)(ps_fontsize*PS_SC);
        !           560:                        term->h_char = (unsigned int)(ps_fontsize*PS_SC*6/10);
        !           561:                        term->put_text = PS_put_text;
        !           562:                        c_token++;
        !           563:                }
        !           564:        }
        !           565:
        !           566:        if (almost_equals(c_token, "enh$anced")) {
        !           567:                term->put_text = ENHPS_put_text;
        !           568:                term->set_font = ENHPS_set_font;
        !           569:                ++c_token;
        !           570:        } else if (almost_equals(c_token, "noenh$anced")) {
        !           571:                term->put_text = PS_put_text;
        !           572:                term->set_font = PS_set_font;
        !           573:                ++c_token;
        !           574:        }
        !           575:
        !           576:        if (!END_OF_COMMAND) {
        !           577:                if (almost_equals(c_token,"m$onochrome")) {
        !           578:                        ps_color=FALSE;
        !           579:                        c_token++;
        !           580:                }
        !           581:                else if (almost_equals(c_token,"c$olor")
        !           582:                         || almost_equals(c_token,"c$olour")) {
        !           583:                        ps_color=TRUE;
        !           584:                        c_token++;
        !           585:                }
        !           586:        }
        !           587:
        !           588:        if (!END_OF_COMMAND) {
        !           589:                if (almost_equals(c_token,"so$lid")) {
        !           590:                        ps_solid=TRUE;
        !           591:                        c_token++;
        !           592:                }
        !           593:                else if (almost_equals(c_token,"da$shed")) {
        !           594:                        ps_solid=FALSE;
        !           595:                        c_token++;
        !           596:                }
        !           597:        }
        !           598:
        !           599:        if (!END_OF_COMMAND) {
        !           600:                if (almost_equals(c_token,"si$mplex")) {
        !           601:                        ps_duplex_state  = FALSE;
        !           602:                        ps_duplex_option = TRUE;
        !           603:                        c_token++;
        !           604:                }
        !           605:                else if (almost_equals(c_token,"du$plex")) {
        !           606:                        ps_duplex_state  = TRUE;
        !           607:                        ps_duplex_option = TRUE;
        !           608:                        c_token++;
        !           609:                }
        !           610:                else if (almost_equals(c_token,"defaultp$lex")) {
        !           611:                        ps_duplex_option = FALSE;
        !           612:                        c_token++;
        !           613:                }
        !           614:        }
        !           615:
        !           616:        if (!END_OF_COMMAND && isstring(c_token)) {
        !           617:                quote_str(ps_font,c_token, MAX_ID_LEN);
        !           618:                c_token++;
        !           619:        }
        !           620:
        !           621:        if (!END_OF_COMMAND) {
        !           622:                /* We have font size specified */
        !           623:                struct value a;
        !           624:                ps_fontsize = (int)real(const_express(&a));
        !           625:                term->v_char = (unsigned int)(ps_fontsize*PS_SC);
        !           626:                term->h_char = (unsigned int)(ps_fontsize*PS_SC*6/10);
        !           627:        }
        !           628:
        !           629:        sprintf(default_font,"%s,%d",ps_font,ps_fontsize);
        !           630:        /* default_font holds the font and size set at 'set term' */
        !           631:        /* Entry font added by DJL */
        !           632:        sprintf(term_options,"%s %senhanced %s %s %s \"%s\" %d",
        !           633:                ps_eps ? "eps" : (ps_portrait ? "portrait" : "landscape"),
        !           634:       term->put_text == ENHPS_put_text ? "" : "no",
        !           635:                ps_color ? "color" : "monochrome",
        !           636:                ps_solid ? "solid" : "dashed",
        !           637:                ps_duplex_option ? (ps_duplex_state ? "duplex" : "simplex")
        !           638:                                     : "defaultplex",
        !           639:                ps_font,ps_fontsize);
        !           640: }
        !           641:
        !           642: /* store settings passed to common_init() for use in PS_graphics()
        !           643:  * ps_eps, ps_portrait, etc are reserved for storing the term options
        !           644:  */
        !           645: static int ps_common_encap;
        !           646: static int ps_common_portrait;
        !           647: static int ps_common_uses_fonts;
        !           648: static unsigned int ps_common_xoff, ps_common_yoff;
        !           649:
        !           650:
        !           651: TERM_PUBLIC void PS_common_init(encap, portrait, uses_fonts, xoff, yoff, bb_xmin, bb_ymin, bb_xmax, bb_ymax, dict)
        !           652: int encap; /* encapsulated or not - 1 for pslatex */
        !           653: int portrait; /* 1 for pslatex */
        !           654: int uses_fonts; /* 0 for ps(la)tex */
        !           655: unsigned int xoff, yoff; /* how much to translate by */
        !           656: unsigned int bb_xmin, bb_ymin, bb_xmax, bb_ymax; /* bounding box */
        !           657: char **dict; /* extra entries for the dictionary */
        !           658: {
        !           659: static char GPFAR psi1[] = "%%%%Creator: gnuplot %s patchlevel %s\n\
        !           660: %%%%CreationDate: %s\
        !           661: %%%%DocumentFonts: %s\n";
        !           662: static char GPFAR psi2[] = "%%%%EndComments\n\
        !           663: /gnudict 256 dict def\ngnudict begin\n\
        !           664: /Color %s def\n\
        !           665: /Solid %s def\n\
        !           666: /gnulinewidth %.3f def\n\
        !           667: /userlinewidth gnulinewidth def\n\
        !           668: /vshift %d def\n\
        !           669: /dl {%d mul} def\n\
        !           670: /hpt_ %.1f def\n\
        !           671: /vpt_ %.1f def\n\
        !           672: /hpt hpt_ def\n\
        !           673: /vpt vpt_ def\n";
        !           674: static char GPFAR * GPFAR PS_iso_8859_1_encoding[] = {
        !           675: "/reencodeISO {\n",
        !           676: "dup dup findfont dup length dict begin\n",
        !           677: "{ 1 index /FID ne { def }{ pop pop } ifelse } forall\n",
        !           678: "currentdict /CharStrings known {\n",
        !           679: "\tCharStrings /Idieresis known {\n",
        !           680: "\t\t/Encoding ISOLatin1Encoding def } if\n} if\n",
        !           681: "currentdict end definefont\n",
        !           682: "} def\n",
        !           683: "/ISOLatin1Encoding [\n",
        !           684: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
        !           685: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
        !           686: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
        !           687: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
        !           688: "/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright\n",
        !           689: "/parenleft/parenright/asterisk/plus/comma/minus/period/slash\n",
        !           690: "/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon\n",
        !           691: "/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N\n",
        !           692: "/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright\n",
        !           693: "/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m\n",
        !           694: "/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde\n",
        !           695: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
        !           696: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
        !           697: "/.notdef/dotlessi/grave/acute/circumflex/tilde/macron/breve\n",
        !           698: "/dotaccent/dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut\n",
        !           699: "/ogonek/caron/space/exclamdown/cent/sterling/currency/yen/brokenbar\n",
        !           700: "/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot\n",
        !           701: "/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior\n",
        !           702: "/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine\n",
        !           703: "/guillemotright/onequarter/onehalf/threequarters/questiondown\n",
        !           704: "/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla\n",
        !           705: "/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex\n",
        !           706: "/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis\n",
        !           707: "/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute\n",
        !           708: "/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis\n",
        !           709: "/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave\n",
        !           710: "/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex\n",
        !           711: "/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis\n",
        !           712: "/yacute/thorn/ydieresis\n",
        !           713: "] def\n",
        !           714: NULL };
        !           715:
        !           716: /*   encoding for code page 437                                            */
        !           717: /*                                                                         */
        !           718: /*   version 1.0:  - Mainly letters are mapped. The following positions    */
        !           719: /*   (JFi)           are left blank (undefined):                           */
        !           720: /*                   -- first 32 positions,                                */
        !           721: /*                   -- frame characters,                                  */
        !           722: /*                   -- greek characters,                                  */
        !           723: /*                   -- some more special characters.                      */
        !           724: /*                                                                         */
        !           725: /*   version 1.1:  - added some more special characters                    */
        !           726: /*                                                                         */
        !           727: static char GPFAR * GPFAR PS_cp_437_encoding[] = {
        !           728: "/reencodeCP437 {\n",
        !           729: "dup dup findfont dup length dict begin\n",
        !           730: "{ 1 index /FID ne { def }{ pop pop } ifelse } forall\n",
        !           731: "currentdict /CharStrings known {\n",
        !           732: "\tCharStrings /Idieresis known {\n",
        !           733: "\t\t/Encoding CP437Encoding def } if\n} if\n",
        !           734: "currentdict end definefont\n",
        !           735: "} def\n",
        !           736: "/CP437Encoding [\n",
        !           737: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
        !           738: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
        !           739: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
        !           740: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
        !           741: "/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright\n",
        !           742: "/parenleft/parenright/asterisk/plus/comma/minus/period/slash\n",
        !           743: "/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon\n",
        !           744: "/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N\n",
        !           745: "/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright\n",
        !           746: "/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m\n",
        !           747: "/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde/.notdef\n",
        !           748: "/Ccedilla/udieresis/eacute/acircumflex/adieresis/agrave/aring/ccedilla\n",
        !           749: "/ecircumflex/edieresis/egrave/idieresis/icircumflex/igrave/Adieresis/Aring\n",
        !           750: "/Eacute/ae/AE/ocircumflex/odieresis/ograve/ucircumflex/ugrave\n",
        !           751: "/ydieresis/Odieresis/Udieresis/cent/sterling/yen/.notdef/florin\n",
        !           752: "/aacute/iacute/oacute/uacute/ntilde/Ntilde/ordfeminine/ordmasculine\n",
        !           753: "/questiondown/.notdef/logicalnot/onehalf/onequarter/exclamdown/guillemotleft/guillemotright\n",
        !           754: "/space/space/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
        !           755: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
        !           756: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
        !           757: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
        !           758: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
        !           759: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
        !           760: "/.notdef/germandbls/.notdef/.notdef/.notdef/.notdef/mu/.notdef\n",
        !           761: "/.notdef/.notdef/.notdef/.notdef/infinity/.notdef/.notdef/.notdef\n",
        !           762: "/.notdef/plusminus/greaterequal/lessequal/.notdef/.notdef/divide/.notdef\n",
        !           763: "/degree/bullet/periodcentered/.notdef/nsuperior/twosuperior/.notdef\n",
        !           764: "] def\n",
        !           765: NULL };
        !           766:
        !           767: /*   encoding for code page 850                                            */
        !           768: /*                                                                         */
        !           769: /*   version 1.0:  - Mainly letters are mapped. The following positions    */
        !           770: /*   (JFi)           are left blank (undefined):                           */
        !           771: /*                   -- first 32 positions,                                */
        !           772: /*                   -- frame characters,                                  */
        !           773: /*                   -- a few special characters.                          */
        !           774: /*                                                                         */
        !           775: static char GPFAR * GPFAR PS_cp_850_encoding[] = {
        !           776: "/reencodeCP850 {\n",
        !           777: "dup dup findfont dup length dict begin\n",
        !           778: "{ 1 index /FID ne { def }{ pop pop } ifelse } forall\n",
        !           779: "currentdict /CharStrings known {\n",
        !           780: "\tCharStrings /Idieresis known {\n",
        !           781: "\t\t/Encoding CP850Encoding def } if\n} if\n",
        !           782: "currentdict end definefont\n",
        !           783: "} def\n",
        !           784: "/CP850Encoding [\n",
        !           785: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
        !           786: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
        !           787: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
        !           788: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
        !           789: "/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright\n",
        !           790: "/parenleft/parenright/asterisk/plus/comma/minus/period/slash\n",
        !           791: "/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon\n",
        !           792: "/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N\n",
        !           793: "/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright\n",
        !           794: "/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m\n",
        !           795: "/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde/.notdef\n",
        !           796: "/Ccedilla/udieresis/eacute/acircumflex/adieresis/agrave/aring/ccedilla\n",
        !           797: "/ecircumflex/edieresis/egrave/idieresis/icircumflex/igrave/Adieresis/Aring\n",
        !           798: "/Eacute/ae/AE/ocircumflex/odieresis/ograve/ucircumflex/ugrave\n",
        !           799: "/ydieresis/Odieresis/Udieresis/oslash/sterling/Oslash/multiply/florin\n",
        !           800: "/aacute/iacute/oacute/uacute/ntilde/Ntilde/ordfeminine/ordmasculine\n",
        !           801: "/questiondown/registered/logicalnot/onehalf/onequarter/exclamdown/guillemotleft/guillemotright\n",
        !           802: "/space/space/.notdef/.notdef/.notdef/Aacute/Acircumflex/Agrave\n",
        !           803: "/.notdef/.notdef/.notdef/.notdef/.notdef/cent/yen/.notdef\n",
        !           804: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/atilde/Atilde\n",
        !           805: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/currency\n",
        !           806: "/eth/Eth/Ecircumflex/Edieresis/Egrave/dotlessi/Iacute/Icircumflex\n",
        !           807: "/Idieresis/.notdef/.notdef/.notdef/.notdef/brokenbar/Igrave/.notdef\n",
        !           808: "/Oacute/germandbls/Ocircumflex/Ograve/otilde/Otilde/mu/thorn\n",
        !           809: "/Thorn/Uacute/Ucircumflex/Ugrave/yacute/Yacute/macron/acute\n",
        !           810: "/hyphen/plusminus/equal/threequarters/paragraph/section/divide/.notdef\n",
        !           811: "/degree/.notdef/periodcentered/onesuperior/threesuperior/twosuperior/.notdef\n",
        !           812: "] def\n",
        !           813: NULL };
        !           814:
        !           815:        struct termentry *t = term;
        !           816:        int i;
        !           817:         time_t now;
        !           818:
        !           819:        ps_common_encap = encap; /* store for later */
        !           820:        ps_common_portrait = portrait; /* store for later */
        !           821:        ps_common_uses_fonts = uses_fonts;
        !           822:        ps_common_xoff = xoff;
        !           823:        ps_common_yoff = yoff;
        !           824:
        !           825:        ps_page = 0;
        !           826:
        !           827:        if (!encap)
        !           828:                fprintf(gpoutfile,"%%!PS-Adobe-2.0\n");
        !           829:        else
        !           830:                fprintf(gpoutfile,"%%!PS-Adobe-2.0 EPSF-2.0\n");
        !           831:
        !           832:        if (outstr) fprintf(gpoutfile, "%%%%Title: %s\n", outstr );             /*  JFi  */
        !           833:        time(&now);
        !           834:        fprintf(gpoutfile, psi1, version, patchlevel, asctime(localtime(&now)), uses_fonts ? "(atend)" : "");
        !           835:
        !           836:        fprintf(gpoutfile,"%%%%BoundingBox: %d %d %d %d\n", xoff + bb_xmin, yoff + bb_ymin, xoff + bb_xmax, yoff + bb_ymax);
        !           837:
        !           838:        fprintf(gpoutfile,"%%%%Orientation: %s\n", ps_portrait ? "Portrait" : "Landscape");
        !           839:
        !           840:        if (!encap)
        !           841:                fprintf(gpoutfile,"%%%%Pages: (atend)\n");
        !           842:        fprintf(gpoutfile, psi2,
        !           843:                ps_color ? "true" : "false",
        !           844:                ps_solid ? "true" : "false",
        !           845:                PS_LW,                  /* line width */
        !           846:                (int)(t->v_char)/(-3),  /* shift for vertical centring */
        !           847:                PS_SC,                  /* dash length */
        !           848:                PS_HTIC/2.0,            /* half point width */
        !           849:                PS_VTIC/2.0);           /* half point height */
        !           850:
        !           851:        if (uses_fonts && (encoding == ENCODING_ISO_8859_1)) {
        !           852:                for (i=0; PS_iso_8859_1_encoding[i] != NULL; i++) {
        !           853:                        fprintf(gpoutfile,"%s",PS_iso_8859_1_encoding[i]);
        !           854:                }
        !           855:        }
        !           856:        if (uses_fonts && (encoding == ENCODING_CP_437)) {       /* JFi */
        !           857:                for (i=0; PS_cp_437_encoding[i] != NULL; i++) {
        !           858:                        fprintf(gpoutfile,"%s",PS_cp_437_encoding[i]);
        !           859:                }
        !           860:        }
        !           861:        if (uses_fonts && (encoding == ENCODING_CP_850)) {       /* JFi */
        !           862:                for (i=0; PS_cp_850_encoding[i] != NULL; i++) {
        !           863:                        fprintf(gpoutfile,"%s",PS_cp_850_encoding[i]);
        !           864:                }
        !           865:        }
        !           866: /*        Duplicate code!
        !           867:           As long as only two code pages are implemented, that's not a big
        !           868:           problem. Otherwise a small procedure might be beneficial.
        !           869: */
        !           870:
        !           871:        for ( i=0; PS_header[i] != NULL; i++)
        !           872:                fprintf(gpoutfile,"%s",PS_header[i]);
        !           873:        if (ps_duplex_option)
        !           874:                fprintf(gpoutfile, "statusdict begin %s setduplexmode end\n",
        !           875:                                ps_duplex_state ? "true" : "false");
        !           876:        PS_RememberFont(ps_font, 1);
        !           877:
        !           878:        if (dict)
        !           879:                while (*dict)
        !           880:                        fputs(*(dict++), gpoutfile);
        !           881:
        !           882:        fprintf(gpoutfile,"end\n%%%%EndProlog\n");
        !           883: }
        !           884:
        !           885: /* the init fn for the postscript driver */
        !           886: TERM_PUBLIC void PS_init()
        !           887: {
        !           888:        unsigned int xmin_t, ymin_t, xmax_t, ymax_t;
        !           889:
        !           890:        if (ps_eps)
        !           891:        {
        !           892:                term->xmax = PS_XMAX;
        !           893:                term->ymax = PS_YMAX;
        !           894:                xmin_t = PS_XMAX * xoffset / (2*PS_SC);
        !           895:                xmax_t = PS_XMAX * (xsize + xoffset) / (2*PS_SC);
        !           896:                ymin_t = PS_YMAX * yoffset / (2*PS_SC);
        !           897:                ymax_t = PS_YMAX * (yoffset + ysize) / (2*PS_SC);
        !           898:        }
        !           899:        else if (ps_portrait)
        !           900:        {
        !           901:                term->xmax = PS_YMAX;
        !           902:                term->ymax = PS_XMAX;
        !           903:                xmin_t = PS_YMAX * xoffset / PS_SC;
        !           904:                xmax_t = PS_YMAX * (xsize + xoffset) / PS_SC;
        !           905:                ymin_t = PS_XMAX * yoffset / PS_SC;
        !           906:                ymax_t = PS_XMAX * (ysize + yoffset) / PS_SC;
        !           907:        }
        !           908:        else
        !           909:        {
        !           910:                term->xmax = PS_XMAX;
        !           911:                term->ymax = PS_YMAX;
        !           912:                ymin_t = PS_XMAX * xoffset / PS_SC;
        !           913:                ymax_t = PS_XMAX * (xsize+xoffset) / PS_SC;
        !           914:                xmin_t = PS_YMAX * (1-ysize-yoffset) / PS_SC;
        !           915:                xmax_t = PS_YMAX * (1-yoffset) / PS_SC;
        !           916:        }
        !           917:
        !           918:        /* for enhanced postscript, copy ps_font to ps_enh_font
        !           919:         * does no harm for non-enhanced
        !           920:         */
        !           921:        strcpy(ps_enh_font, ps_font);
        !           922:        ps_enh_fontsize = ps_fontsize;
        !           923:
        !           924:        PS_common_init(ps_eps, ps_portrait, 1, PS_XOFF, PS_YOFF,
        !           925:           xmin_t, ymin_t, xmax_t, ymax_t,
        !           926:           (term->put_text == ENHPS_put_text) ? ENHPS_header : NULL);
        !           927: }
        !           928:
        !           929:
        !           930: TERM_PUBLIC void PS_graphics()
        !           931: {
        !           932: static char GPFAR psg1[] = "0 setgray\nnewpath\n";
        !           933: struct termentry *t = term;
        !           934:        ps_page++;
        !           935:        if (!ps_common_encap)
        !           936:                fprintf(gpoutfile,"%%%%Page: %d %d\n",ps_page,ps_page);
        !           937:        fprintf(gpoutfile,"gnudict begin\ngsave\n");
        !           938:        fprintf(gpoutfile,"%d %d translate\n",ps_common_xoff, ps_common_yoff);
        !           939:        fprintf(gpoutfile,"%.3f %.3f scale\n", (ps_eps ? 0.5 : 1.0)/PS_SC,
        !           940:                                             (ps_eps ? 0.5 : 1.0)/PS_SC);
        !           941:        if (!ps_common_portrait) {
        !           942:            fprintf(gpoutfile,"90 rotate\n0 %d translate\n", (int)(-PS_YMAX));
        !           943:        }
        !           944:        fprintf(gpoutfile, psg1);
        !           945:        if (ps_common_uses_fonts)
        !           946:                fprintf(gpoutfile, "(%s) findfont %d scalefont setfont\n", ps_font, (t->v_char) );
        !           947:        ps_path_count = 0;
        !           948:        PS_relative_ok = FALSE;
        !           949:        PS_pen_x = PS_pen_y = -4000;
        !           950:        PS_taken = 0;
        !           951:        PS_linetype_last = -1;
        !           952: }
        !           953:
        !           954:
        !           955: TERM_PUBLIC void PS_text()
        !           956: {
        !           957:        ps_path_count = 0;
        !           958:        fprintf(gpoutfile,"stroke\ngrestore\nend\nshowpage\n");
        !           959:        /* fprintf(stderr,"taken %d times\n",PS_taken); */
        !           960:        /* informational:  tells how many times it was "cheaper"
        !           961:           to do a relative moveto or lineto rather than an
        !           962:           absolute one */
        !           963: }
        !           964:
        !           965:
        !           966: TERM_PUBLIC void PS_reset()
        !           967: {
        !           968:        fprintf(gpoutfile,"%%%%Trailer\n");
        !           969:
        !           970: /*      I think the following commands should be executed
        !           971:         `if (ps_common_uses_fonts)`. So I changed the next line.
        !           972:         Please see "PS_RememberFont", too.                       */  /* JFi */
        !           973:
        !           974: /*     if (!ps_common_uses_fonts) {  */                             /* JFi */
        !           975:        if (ps_common_uses_fonts) {
        !           976:                fprintf(gpoutfile,"%%%%DocumentFonts: ");
        !           977:                while (PS_DocFonts) {
        !           978:                    struct PS_FontName *fnp;
        !           979:                        fnp = PS_DocFonts->next;
        !           980:                        fprintf(gpoutfile, "%s%s", PS_DocFonts->name, fnp ? " " : "\n");
        !           981:                        free(PS_DocFonts->name);
        !           982:                        free(PS_DocFonts);
        !           983:                        PS_DocFonts=fnp;
        !           984:                }
        !           985:        }
        !           986:        if (!ps_common_encap)
        !           987:                fprintf(gpoutfile,"%%%%Pages: %d\n",ps_page);
        !           988: }
        !           989:
        !           990:
        !           991: TERM_PUBLIC void PS_linetype(linetype)
        !           992: int linetype;
        !           993: {
        !           994:        linetype = (linetype % 9) + 2;
        !           995:        if (linetype < 0) linetype = 0;
        !           996:        PS_relative_ok = FALSE;
        !           997: #if 0
        !           998:        /*  In order to make 'PS_linewidth' work properly, I need to comment
        !           999:         *  this line out.  Especially in combination with the line width
        !          1000:         *  extension of the `set arrow` command this is necessary.
        !          1001:         *  Can we live with that drawback?  (JFi)
        !          1002:         */
        !          1003:        if (PS_linetype_last == linetype) return;
        !          1004: #endif
        !          1005:        PS_linetype_last = linetype;
        !          1006:        fprintf(gpoutfile,"LT%c\n", "ba012345678"[linetype]);
        !          1007:        ps_path_count = 0;
        !          1008: }
        !          1009:
        !          1010:
        !          1011: TERM_PUBLIC void PS_linewidth (linewidth)
        !          1012: double linewidth;
        !          1013: {
        !          1014:         fprintf(gpoutfile,"%.3f UL\n",linewidth);
        !          1015:
        !          1016: /*
        !          1017:   Documentation of the 'change linewidth' strategy of the postscript terminal:
        !          1018:
        !          1019:   1. define a new postscript variable with a default value:
        !          1020:      /userlinewidth gnulinewidth def
        !          1021:
        !          1022:   2. define a new postscript command to change the contents of that variable:
        !          1023:      /UL { gnulinewidth mul /userlinewidth exch def } def
        !          1024:      usage:  multiplication_factor UL
        !          1025:
        !          1026:   3. modify the already known postscript command /PL for the plot lines:
        !          1027:      /PL { stroke userlinewidth setlinewidth } def
        !          1028:
        !          1029:   4. issue the new command before every change of the plot linestyle:
        !          1030:      example:
        !          1031:          4.0 UL
        !          1032:          LT0
        !          1033:      result:
        !          1034:          Linetype 0 is drawn four times as thick as defined by the contents
        !          1035:          of the postscript variable 'gnulinewidth'.
        !          1036: */
        !          1037: }
        !          1038:
        !          1039:
        !          1040: TERM_PUBLIC void PS_pointsize (ptsize)
        !          1041: double ptsize;
        !          1042: {
        !          1043:         fprintf(gpoutfile,"%.3f UP\n",ptsize);
        !          1044:
        !          1045: /*
        !          1046:   Documentation of the 'change pointsize' strategy of the postscript terminal:
        !          1047:
        !          1048:   1. define two new postscript variables to hold the overall pointsize:
        !          1049:      /hpt_  and  /vpt_
        !          1050:
        !          1051:   2. define a new postscript command to use the contents of these variables:
        !          1052:      /UP { cf. definition above } def
        !          1053:      usage:  multiplication_factor UP
        !          1054:
        !          1055:  [3.] [doesn't exist, skip to next number]
        !          1056:
        !          1057:   4. issue the new command whereever you change the symbols (and linetype):
        !          1058:      example:
        !          1059:          2.5 UP
        !          1060:          4.0 UL  % optionally change linewidth, too
        !          1061:          LT0
        !          1062:      result:
        !          1063:          Next symbols will be drawn 2.5 times as big as defined by the
        !          1064:          GNUPLOT `set pointsize` command (= overall pointsize).
        !          1065: */
        !          1066: }
        !          1067:
        !          1068:
        !          1069: TERM_PUBLIC void PS_move(x,y)
        !          1070: unsigned int x,y;
        !          1071: {
        !          1072:        int dx, dy;
        !          1073:        /* Make this semi-dynamic and independent of architecture */
        !          1074:        char abso[5+2*INT_STR_LEN], rel[5+2*INT_STR_LEN];
        !          1075:        dx = x - PS_pen_x;
        !          1076:        dy = y - PS_pen_y;
        !          1077:        /* can't cancel all null moves--need a move after stroke'ing */
        !          1078:        if (dx==0 && dy==0 && PS_relative_ok)
        !          1079:                return;
        !          1080:        sprintf(abso, "%d %d M\n", x, y);
        !          1081:        sprintf(rel, "%d %d R\n", dx, dy);
        !          1082:        if (strlen(rel) < strlen(abso) && PS_relative_ok){
        !          1083:                fputs(rel, gpoutfile);
        !          1084:                PS_taken++;
        !          1085:        }else
        !          1086:                fputs(abso, gpoutfile);
        !          1087:        PS_relative_ok = TRUE;
        !          1088:        ps_path_count += 1;
        !          1089:
        !          1090:        PS_pen_x = x;
        !          1091:        PS_pen_y = y;
        !          1092: }
        !          1093:
        !          1094: TERM_PUBLIC void PS_vector(x,y)
        !          1095: unsigned int x,y;
        !          1096: {
        !          1097:        int dx, dy;
        !          1098:        char abso[5+2*INT_STR_LEN], rel[5+2*INT_STR_LEN];
        !          1099:        dx = x - PS_pen_x;
        !          1100:        dy = y - PS_pen_y;
        !          1101:        if (dx==0 && dy==0) return;
        !          1102:        sprintf(abso, "%d %d L\n", x, y);
        !          1103:        sprintf(rel, "%d %d V\n", dx, dy);
        !          1104:        if (strlen(rel) < strlen(abso) && PS_relative_ok){
        !          1105:                fputs(rel, gpoutfile);
        !          1106:                PS_taken++;
        !          1107:        }else
        !          1108:                fputs(abso, gpoutfile);
        !          1109:        PS_relative_ok = TRUE;
        !          1110:        ps_path_count += 1;
        !          1111:        PS_pen_x = x;
        !          1112:        PS_pen_y = y;
        !          1113:        if (ps_path_count >= 400) {
        !          1114:                fprintf(gpoutfile,"currentpoint stroke M\n");
        !          1115:                ps_path_count = 0;
        !          1116:        }
        !          1117: }
        !          1118:
        !          1119:
        !          1120: TERM_PUBLIC void PS_put_text(x,y,str)
        !          1121: unsigned int x, y;
        !          1122: char *str;
        !          1123: {
        !          1124: char ch;
        !          1125:        if (!strlen(str)) return;
        !          1126:        PS_move(x,y);
        !          1127:        if (ps_ang != 0)
        !          1128:                fprintf(gpoutfile,"currentpoint gsave translate %d rotate 0 0 M\n"
        !          1129:                        ,ps_ang*90);
        !          1130:        putc('(',gpoutfile);
        !          1131:        ch = *str++;
        !          1132:        while(ch!='\0') {
        !          1133:                if ( (ch=='(') || (ch==')') || (ch=='\\') )
        !          1134:                        putc('\\',gpoutfile);
        !          1135:                putc(ch,gpoutfile);
        !          1136:                ch = *str++;
        !          1137:        }
        !          1138:        switch(ps_justify) {
        !          1139:                case LEFT : fprintf(gpoutfile,") Lshow\n");
        !          1140:                        break;
        !          1141:                case CENTRE : fprintf(gpoutfile,") Cshow\n");
        !          1142:                        break;
        !          1143:                case RIGHT : fprintf(gpoutfile,") Rshow\n");
        !          1144:                        break;
        !          1145:        }
        !          1146:        if (ps_ang != 0)
        !          1147:                fprintf(gpoutfile,"grestore\n");
        !          1148:        ps_path_count = 0;
        !          1149:        PS_relative_ok = FALSE;
        !          1150: }
        !          1151:
        !          1152:
        !          1153: TERM_PUBLIC int PS_text_angle(ang)
        !          1154: int ang;
        !          1155: {
        !          1156:        ps_ang=ang;
        !          1157:        return TRUE;
        !          1158: }
        !          1159:
        !          1160:
        !          1161: TERM_PUBLIC int PS_justify_text(mode)
        !          1162: enum JUSTIFY mode;
        !          1163: {
        !          1164:        ps_justify=mode;
        !          1165:        return TRUE;
        !          1166: }
        !          1167:
        !          1168:
        !          1169: TERM_PUBLIC int PS_set_font(font)  /* Entry font added by DJL */
        !          1170: char *font;
        !          1171: {
        !          1172: char name[32];
        !          1173: int  size,sep;
        !          1174:
        !          1175:         sep=strcspn(font,",");
        !          1176:         strncpy(name,font,sep); name[sep]=NUL;
        !          1177:         size=ps_fontsize; sscanf (&(font[sep+1]),"%d",&size);
        !          1178:         fprintf(gpoutfile,"/%s findfont %d scalefont setfont\n",name,size*PS_SC);
        !          1179:         PS_RememberFont(name,1 );
        !          1180:         return TRUE;
        !          1181: }
        !          1182:
        !          1183:
        !          1184: /* postscript point routines */
        !          1185:
        !          1186:
        !          1187: TERM_PUBLIC void PS_point(x,y,number)
        !          1188: unsigned int x,y;
        !          1189: int number;
        !          1190: {
        !          1191: static char GPFAR * GPFAR pointFNS[] = {"Pnt",  "Pls",   "Crs",    "Star",
        !          1192:                            "Box",  "BoxF",  "Circle", "CircleF",
        !          1193:                            "TriU", "TriUF", "TriD",   "TriDF",
        !          1194:                            "Dia",  "DiaF",  "Pent",   "PentF",
        !          1195:                           "C0",   "C1",    "C2",     "C3",
        !          1196:                           "C4",   "C5",    "C6",     "C7",
        !          1197:                           "C8",   "C9",    "C10",    "C11",
        !          1198:                           "C12",  "C13",   "C14",    "C15",
        !          1199:                            "S0",   "S1",    "S2",     "S3",
        !          1200:                           "S4",   "S5",    "S6",     "S7",
        !          1201:                            "S8",   "S9",    "S10",    "S11",
        !          1202:                           "S12",  "S13",   "S14",    "S15",
        !          1203:                           "D0",   "D1",    "D2",     "D3",
        !          1204:                           "D4",   "D5",    "D6",     "D7",
        !          1205:                           "D8",   "D9",    "D10",    "D11",
        !          1206:                           "D12",  "D13",   "D14",    "D15",
        !          1207:                            "BoxE", "CircE", "TriUE",  "TriDE",
        !          1208:                            "DiaE", "PentE", "BoxW",   "CircW",
        !          1209:                            "TriUW", "TriDW", "DiaW",  "PentW"
        !          1210: };
        !          1211:        if (number < 0)
        !          1212:                number = -1;            /* negative types are all 'dot' */
        !          1213:        else
        !          1214:                number %= sizeof(pointFNS)/sizeof(pointFNS[0]) -1;
        !          1215:        fprintf(gpoutfile,"%d %d %s\n", x, y, pointFNS[number+1]);
        !          1216:
        !          1217:        PS_relative_ok = 0;
        !          1218:        ps_path_count = 0;
        !          1219:        PS_linetype_last = -1; /* force next linetype change */
        !          1220: }
        !          1221:
        !          1222: TERM_PUBLIC void PS_fillbox(style, x1,y1,x2,y2)
        !          1223: int style;
        !          1224: unsigned int x1,y1,x2,y2;
        !          1225: {
        !          1226:        PS_FLUSH_PATH
        !          1227:
        !          1228:        fprintf(gpoutfile, "%d %d %d %d BoxFill\n", x1,y1, x2,y2);
        !          1229:
        !          1230:        PS_relative_ok = 0;
        !          1231:        PS_linetype_last = -1;
        !          1232: }
        !          1233:
        !          1234:
        !          1235: /* ENHPOST */
        !          1236:
        !          1237:
        !          1238: #ifdef DEBUG_ENHPS
        !          1239: #define ENHPS_DEBUG(x) printf x;
        !          1240: #else
        !          1241: #define ENHPS_DEBUG(x)
        !          1242: #endif
        !          1243:
        !          1244:
        !          1245: static TBOOLEAN ENHps_opened_string;  /* try to cut out empty ()'s */
        !          1246:
        !          1247: /* used in determining height of processed text */
        !          1248:
        !          1249: static float ENHps_max_height, ENHps_min_height;
        !          1250:
        !          1251:
        !          1252: /* process a bit of string, and return the last character used.
        !          1253:  * p is start of string
        !          1254:  * brace is TRUE to keep processing to }, FALSE for do one character
        !          1255:  * fontname & fontsize are obvious
        !          1256:  * base is the current baseline
        !          1257:  * widthflag is TRUE if the width of this should count,
        !          1258:  *              FALSE for zero width boxes
        !          1259:  * showflag is TRUE if this should be shown,
        !          1260:  *             FALSE if it should not be shown (like TeX \phantom)
        !          1261:  */
        !          1262:
        !          1263: static char *ENHPS_recurse(p, brace, fontname, fontsize, base, widthflag, showflag)
        !          1264: char *p, *fontname;
        !          1265: TBOOLEAN brace, widthflag, showflag;
        !          1266: double fontsize, base;
        !          1267: {
        !          1268:
        !          1269: /* close a postscript string if it has been opened */
        !          1270: #define ENHPS_FLUSH      \
        !          1271: {      if (ENHps_opened_string)  \
        !          1272:        {       fputs(")]\n", gpoutfile);   \
        !          1273:                ENHps_opened_string = FALSE; \
        !          1274:        }                         \
        !          1275: }
        !          1276:
        !          1277: #define ENHPS_OPEN     \
        !          1278: {      if (!ENHps_opened_string) \
        !          1279:        { fprintf(gpoutfile, "[(%s) %.1f %.1f %s %s (",  \
        !          1280:                  fontname, fontsize, base, \
        !          1281:                  widthflag ? "true" : "false",  \
        !          1282:                  showflag ? "true" : "false");  \
        !          1283:          ENHps_opened_string = TRUE; \
        !          1284:        }       \
        !          1285: }
        !          1286:
        !          1287:        ENHPS_DEBUG(("RECURSE WITH [%p] \"%s\", %d %s %.1f %.1f %d %d\n", p, p, brace, fontname, fontsize, base, widthflag, showflag))
        !          1288:
        !          1289:        /* Start each recursion with a clean string */
        !          1290:        ENHPS_FLUSH
        !          1291:
        !          1292:        if (base + fontsize > ENHps_max_height)
        !          1293:        {       ENHps_max_height = base + fontsize;
        !          1294:                ENHPS_DEBUG(("Setting max height to %.1f\n", ENHps_max_height));
        !          1295:        }
        !          1296:
        !          1297:        if (base < ENHps_min_height)
        !          1298:        {       ENHps_min_height = base;
        !          1299:                ENHPS_DEBUG(("Setting min height to %.1f\n", ENHps_min_height));
        !          1300:        }
        !          1301:
        !          1302:        while (*p)
        !          1303:        {       float shift;
        !          1304:
        !          1305:                switch (*p)
        !          1306:                {
        !          1307:                        case '}'  :
        !          1308:                                /*{{{  deal with it*/
        !          1309:                                if (brace)
        !          1310:                                        return (p);
        !          1311:
        !          1312:                                fprintf(stderr, "enhpost printer driver - spurious }\n");
        !          1313:                                break;
        !          1314:                                /*}}}*/
        !          1315:
        !          1316:                        case '_'  :
        !          1317:                        case '^'  :
        !          1318:                                /*{{{  deal with super/sub script*/
        !          1319:
        !          1320:                                shift = (*p == '^') ? 0.5 : -0.3;
        !          1321:
        !          1322:                                ENHPS_FLUSH
        !          1323:
        !          1324:                                p = ENHPS_recurse(p+1, FALSE, fontname, fontsize*0.8, base+shift*fontsize, widthflag, showflag);
        !          1325:
        !          1326:                                break;
        !          1327:                                /*}}}*/
        !          1328:
        !          1329:                        case '{'  :
        !          1330:                        {
        !          1331:                                char *savepos=NULL, save=0;
        !          1332:                                char *localfontname=fontname, ch;
        !          1333:                                int recode=1;
        !          1334:                                float f=fontsize;
        !          1335:
        !          1336:                                /*{{{  recurse (possibly with a new font) */
        !          1337:
        !          1338:                                ENHPS_DEBUG(("Dealing with {\n"))
        !          1339:
        !          1340:                                if (*++p == '/')
        !          1341:                                {       /* then parse a fontname, optional fontsize */
        !          1342:                                        while (*++p == ' ');
        !          1343:                                        if (*p=='-')
        !          1344:                                        {
        !          1345:                                                recode=0;
        !          1346:                                                while (*++p == ' ');
        !          1347:                                        }
        !          1348:                                        localfontname = p;
        !          1349:                                        while ((ch = *p) > ' ' && ch != '=' && ch != '*')
        !          1350:                                                ++p;
        !          1351:                                        save = *(savepos=p);
        !          1352:                                        if (ch == '=')
        !          1353:                                        {
        !          1354:                                                *p++ = '\0';
        !          1355:                                                /*{{{  get optional font size*/
        !          1356:                                                ENHPS_DEBUG(("Calling strtod(\"%s\") ...", p))
        !          1357:                                                f = (float)strtod(p, &p);
        !          1358:                                                ENHPS_DEBUG(("Returned %.1f and \"%s\"\n", f, p))
        !          1359:
        !          1360:                                                if (f)
        !          1361:                                                        f *= PS_SC;  /* remember the scaling */
        !          1362:                                                else
        !          1363:                                                        f = fontsize;
        !          1364:
        !          1365:                                                ENHPS_DEBUG(("Font size %.1f\n", f))
        !          1366:                                                /*}}}*/
        !          1367:                                        }
        !          1368:                                        else if (ch == '*')
        !          1369:                                        {
        !          1370:                                                *p++ = '\0';
        !          1371:                                                /*{{{  get optional font size scale factor*/
        !          1372:                                                ENHPS_DEBUG(("Calling strtod(\"%s\") ...", p))
        !          1373:                                                f = (float)strtod(p, &p);
        !          1374:                                                ENHPS_DEBUG(("Returned %.1f and \"%s\"\n", f, p))
        !          1375:
        !          1376:                                                if (f)
        !          1377:                                                        f *= fontsize;  /* apply the scale factor */
        !          1378:                                                else
        !          1379:                                                        f = fontsize;
        !          1380:
        !          1381:                                                ENHPS_DEBUG(("Font size %.1f\n", f))
        !          1382:                                                /*}}}*/
        !          1383:                                        }
        !          1384:                                        else
        !          1385:                                        {
        !          1386:                                                *p++ = '\0';
        !          1387:                                                f = fontsize;
        !          1388:                                        }
        !          1389:
        !          1390:                                        while (*p == ' ')
        !          1391:                                                ++p;
        !          1392:                                        if (*localfontname)
        !          1393:                                        {
        !          1394:                                                /* only allow RememberFont to re-encode it if no string active */
        !          1395:                                                char *recodestring = PS_RememberFont(localfontname, recode && !ENHps_opened_string);
        !          1396:                                                if (recode && recodestring)
        !          1397:                                                {
        !          1398:                                                        ENHPS_FLUSH
        !          1399:                                                        fprintf(gpoutfile, "/%s %s", localfontname, recodestring);
        !          1400:                                                }
        !          1401:                                        }
        !          1402:                                        else
        !          1403:                                                localfontname = fontname;
        !          1404:                                }
        !          1405:                                /*}}}*/
        !          1406:
        !          1407:                                ENHPS_DEBUG(("Before recursing, we are at [%p] \"%s\"\n", p, p))
        !          1408:
        !          1409:                                p = ENHPS_recurse(p, TRUE, localfontname, f, base, widthflag, showflag);
        !          1410:
        !          1411:                                ENHPS_DEBUG(("BACK WITH \"%s\"\n", p));
        !          1412:
        !          1413:                                ENHPS_FLUSH
        !          1414:
        !          1415:                                if (savepos)
        !          1416:                                        /* restore overwritten character */
        !          1417:                                        *savepos = save;
        !          1418:
        !          1419:                                break;
        !          1420:                        }
        !          1421:
        !          1422:                        case '@' :
        !          1423:                                /*{{{  phantom box - prints next 'char', then restores currentpoint */
        !          1424:
        !          1425:                                ENHPS_FLUSH
        !          1426:
        !          1427:                                p = ENHPS_recurse(++p, FALSE, fontname, fontsize, base, FALSE, showflag);
        !          1428:
        !          1429:                                break;
        !          1430:                                /*}}}*/
        !          1431:
        !          1432:                        case '&' :
        !          1433:                                /*{{{  character skip - skips space equal to length of character(s) */
        !          1434:
        !          1435:                                ENHPS_FLUSH
        !          1436:
        !          1437:                                p = ENHPS_recurse(++p, FALSE, fontname, fontsize, base, widthflag, FALSE);
        !          1438:
        !          1439:                                break;
        !          1440:                                /*}}}*/
        !          1441:
        !          1442:                        case '('  :
        !          1443:                        case ')'  :
        !          1444:                                /*{{{  an escape and print it */
        !          1445:                                /* special cases */
        !          1446:                                ENHPS_OPEN
        !          1447:                                fputc('\\', gpoutfile);
        !          1448:                                fputc(*p, gpoutfile);
        !          1449:                                break;
        !          1450:                                /*}}}*/
        !          1451:
        !          1452:                        case '\\'  :
        !          1453:                                /*{{{  is it an escape */
        !          1454:                                /* special cases */
        !          1455:
        !          1456:                                if (p[1]=='\\' || p[1]=='(' || p[1]==')')
        !          1457:                                {
        !          1458:                                        ENHPS_OPEN
        !          1459:                                        fputc('\\', gpoutfile);
        !          1460:                                }
        !          1461:                                else if (p[1] >= '0' && p[1] <= '7')
        !          1462:                                {
        !          1463:                                        /* up to 3 octal digits */
        !          1464:                                        ENHPS_OPEN
        !          1465:                                        fputc('\\', gpoutfile);
        !          1466:                                        fputc(p[1], gpoutfile);
        !          1467:                                        ++p;
        !          1468:                                        if (p[1] >= '0' && p[1] <= '7')
        !          1469:                                        {
        !          1470:                                                fputc(p[1], gpoutfile);
        !          1471:                                                ++p;
        !          1472:                                                if (p[1] >= '0' && p[1] <= '7')
        !          1473:                                                {
        !          1474:                                                        fputc(p[1], gpoutfile);
        !          1475:                                                        ++p;
        !          1476:                                                }
        !          1477:                                        }
        !          1478:                                        break;
        !          1479:                                }
        !          1480:
        !          1481:                                ++p;
        !          1482:                                /* just go and print it (fall into the 'default' case) */
        !          1483:
        !          1484:                                /*}}}*/
        !          1485:                        default:
        !          1486:                                /*{{{  print it */
        !          1487:                                ENHPS_OPEN
        !          1488:
        !          1489:                                fputc(*p, gpoutfile);
        !          1490:
        !          1491:                        /*}}}*/
        !          1492:
        !          1493:                }
        !          1494:
        !          1495:                /* like TeX, we only do one character in a recursion, unless it's
        !          1496:                 * in braces
        !          1497:                 */
        !          1498:
        !          1499:                if (!brace)
        !          1500:                {
        !          1501:                        ENHPS_FLUSH
        !          1502:                        return(p);  /* the ++p in the outer copy will increment us */
        !          1503:                }
        !          1504:
        !          1505:                if (*p) /* only not true if { not terminated, I think */
        !          1506:                        ++p;
        !          1507:        }
        !          1508:        ENHPS_FLUSH
        !          1509:        return p;
        !          1510: }
        !          1511:
        !          1512:
        !          1513: /* a set-font routine for enhanced post : simply copies
        !          1514:  * the font into a global, or restores the globals
        !          1515:  * to the ps_font default
        !          1516:  */
        !          1517:
        !          1518: TERM_PUBLIC int ENHPS_set_font(font)  /* Entry font added by DJL */
        !          1519: char *font;
        !          1520: {
        !          1521:        ENHPS_DEBUG(("ENHPS_set_font(\"%s\")\n", font));
        !          1522:
        !          1523:        if (*font)
        !          1524:        {
        !          1525:                int sep=strcspn(font,",");
        !          1526:                strncpy(ps_enh_font,font,sep); ps_enh_font[sep]=NUL;
        !          1527:                ps_enh_fontsize=ps_fontsize; sscanf (font+sep+1,"%d",&ps_enh_fontsize);
        !          1528:                PS_RememberFont(ps_enh_font, 1);
        !          1529:        }
        !          1530:        else
        !          1531:        {
        !          1532:                /* return to defaults */
        !          1533:                strcpy(ps_enh_font, ps_font);
        !          1534:                ps_enh_fontsize = ps_fontsize;
        !          1535:        }
        !          1536:
        !          1537:        return TRUE;
        !          1538: }
        !          1539:
        !          1540: TERM_PUBLIC void ENHPS_put_text(x, y, str)
        !          1541: unsigned int x, y;
        !          1542: char *str;
        !          1543: {
        !          1544:        /* flush any pending graphics (all the XShow routines do this...) */
        !          1545:
        !          1546:        if (!strlen(str))
        !          1547:                return;
        !          1548:
        !          1549:        if (ps_path_count)
        !          1550:        {
        !          1551:                fputs(" stroke\n",gpoutfile);
        !          1552:                ps_path_count=0;
        !          1553:                PS_relative_ok=FALSE;
        !          1554:        }
        !          1555:
        !          1556:        /* if there are no magic characters, we should just be able
        !          1557:         * punt the string to PS_put_text(), which will give shorter
        !          1558:         * ps output [eg tics and stuff rarely need extra processing],
        !          1559:         * but we need to make sure that the current font is the
        !          1560:         * default one before we can do that. {ie I tried it and it
        !          1561:         * used the wrong font !}
        !          1562:         * if (!strpbrk(str, "{}^_@&"))
        !          1563:         * {
        !          1564:         *   - do something to ensure default font is selected
        !          1565:         *   PS_put_text(x,y,str);
        !          1566:         *   return;
        !          1567:         * }
        !          1568:         */
        !          1569:
        !          1570:
        !          1571:        PS_move(x,y);
        !          1572:
        !          1573:        if (ps_ang != 0)
        !          1574:                fprintf(gpoutfile,"currentpoint gsave translate %d rotate 0 0 moveto\n",
        !          1575:                        ps_ang*90);
        !          1576:
        !          1577:        fputs("[ ",gpoutfile);
        !          1578:
        !          1579:        /* set up the globals */
        !          1580:
        !          1581:        ENHps_opened_string = FALSE;
        !          1582:        ENHps_max_height = -1000;
        !          1583:        ENHps_min_height = 1000;
        !          1584:
        !          1585:        /* Set the recursion going. We say to keep going until a
        !          1586:         * closing brace, but we don't really expect to find one.
        !          1587:         * If the return value is not the nul-terminator of the
        !          1588:         * string, that can only mean that we did find an unmatched
        !          1589:         * closing brace in the string. We increment past it (else
        !          1590:         * we get stuck in an infinite loop) and try again.
        !          1591:         *
        !          1592:         * ps_enh_font and ps_enh_fontsize are either set to the
        !          1593:         * the defaults set on option line, or have been set to
        !          1594:         * "font,size". That is to say, ps_font is used only
        !          1595:         * at startup and by ENHPS_set_font
        !          1596:         */
        !          1597:        while (*(str = ENHPS_recurse(str, TRUE, ps_enh_font,
        !          1598:                                     (double)(ps_enh_fontsize*PS_SC),
        !          1599:                                     0.0, TRUE, TRUE)))
        !          1600:        {
        !          1601:                ENHPS_FLUSH
        !          1602:
        !          1603:                /* I think we can only get here if *str == '}' */
        !          1604:                if (*str == '}')
        !          1605:                        fprintf(stderr, "enhpost printer driver - ignoring spurious }\n");
        !          1606:                else
        !          1607:                        fprintf(stderr, "internal error in enhpost driver - *str=0x%x\n", *str);
        !          1608:
        !          1609:                if (!*++str)
        !          1610:                        break; /* end of string */
        !          1611:
        !          1612:                /* else carry on and process the rest of the string */
        !          1613:        }
        !          1614:
        !          1615:        ENHps_max_height += ENHps_min_height;
        !          1616:
        !          1617:        fprintf(gpoutfile, "] %.1f ", -ENHps_max_height/3);
        !          1618:
        !          1619:        switch(ps_justify)
        !          1620:        {
        !          1621:                case LEFT : fprintf(gpoutfile, "MLshow\n");
        !          1622:                        break;
        !          1623:                case CENTRE : fprintf(gpoutfile, "MCshow\n");
        !          1624:                        break;
        !          1625:                case RIGHT : fprintf(gpoutfile, "MRshow\n");
        !          1626:                        break;
        !          1627:        }
        !          1628:
        !          1629:        if (ps_ang != 0)
        !          1630:                fputs("grestore\n", gpoutfile);
        !          1631:        ps_path_count = 0;
        !          1632:        PS_relative_ok=FALSE;
        !          1633: }
        !          1634:
        !          1635:
        !          1636:
        !          1637:
        !          1638:
        !          1639: #endif /* TERM_BODY */
        !          1640:
        !          1641: #ifdef TERM_TABLE
        !          1642:
        !          1643: TERM_TABLE_START(post_driver)
        !          1644:
        !          1645:       "postscript",
        !          1646:       "PostScript graphics language [mode \042fontname\042 font_size]",
        !          1647:           PS_XMAX, PS_YMAX, PS_VCHAR, PS_HCHAR,
        !          1648:           PS_VTIC, PS_HTIC, PS_options, PS_init, PS_reset,
        !          1649:           PS_text, null_scale, PS_graphics, PS_move, PS_vector,
        !          1650:           PS_linetype, PS_put_text, PS_text_angle,
        !          1651:           PS_justify_text, PS_point, do_arrow, PS_set_font, PS_pointsize,
        !          1652:           0 /*flags*/, 0 /*suspend*/, 0 /*resume*/, PS_fillbox, PS_linewidth
        !          1653:
        !          1654: TERM_TABLE_END(post_driver)
        !          1655:
        !          1656: #undef LAST_TERM
        !          1657: #define LAST_TERM post_driver
        !          1658:
        !          1659: #endif /* TERM_TABLE */
        !          1660:
        !          1661: #endif /* TERM_PROTO_ONLY */
        !          1662:
        !          1663: #ifdef TERM_HELP
        !          1664: START_HELP(post)
        !          1665: "1 postscript",
        !          1666: "?commands set terminal postscript",
        !          1667: "?set terminal postscript",
        !          1668: "?set term postscript",
        !          1669: "?terminal postscript",
        !          1670: "?term postscript",
        !          1671: "?postscript",
        !          1672: " Several options may be set in the `postscript` driver.",
        !          1673: "",
        !          1674: " Syntax:",
        !          1675: "       set terminal postscript {<mode>} {enhanced | noenhanced}",
        !          1676: "                               {color | monochrome} {solid | dashed}",
        !          1677: "                               {<duplexing>}",
        !          1678: "                               {\"<fontname>\"} {<fontsize>}",
        !          1679: "",
        !          1680: " where <mode> is `landscape`, `portrait`, `eps` or `default`;",
        !          1681: " `solid` draws all plots with solid lines, overriding any dashed patterns;",
        !          1682: " <duplexing> is `defaultplex`, `simplex` or `duplex` (\"duplexing\" in",
        !          1683: " PostScript is the ability of the printer to print on both sides of the same",
        !          1684: " page---don't set this if your printer can't do it);",
        !          1685: " `enhanced` activates the \"enhanced PostScript\" features (subscripts,",
        !          1686: " superscripts and mixed fonts);",
        !          1687: " `\"<fontname>\"` is the name of a valid PostScript font; and `<fontsize>` is",
        !          1688: " the size of the font in PostScript points.",
        !          1689: "",
        !          1690: " `default` mode sets all options to their defaults: `landscape`, `monochrome`,",
        !          1691: " `dashed`, `defaultplex`, `noenhanced`, \"Helvetica\" and 14pt.",
        !          1692: "  Default size of a PostScript plot is 10 inches wide and 7 inches high.",
        !          1693: "",
        !          1694: " `eps` mode generates EPS (Encapsulated PostScript) output, which is just",
        !          1695: " regular PostScript with some additional lines that allow the file to be",
        !          1696: " imported into a variety of other applications.  (The added lines are",
        !          1697: " PostScript comment lines, so the file may still be printed by itself.)  To",
        !          1698: " get EPS output, use the `eps` mode and make only one plot per file.  In `eps`",
        !          1699: " mode the whole plot, including the fonts, is reduced to half of the default",
        !          1700: " size.",
        !          1701: "",
        !          1702: " Examples:",
        !          1703: "       set terminal postscript default       # old postscript",
        !          1704: "       set terminal postscript enhanced      # old enhpost",
        !          1705: "       set terminal postscript landscape 22  # old psbig",
        !          1706: "       set terminal postscript eps 14        # old epsf1",
        !          1707: "       set terminal postscript eps 22        # old epsf2",
        !          1708: "       set size 0.7,1.4; set term post portrait color \"Times-Roman\" 14",
        !          1709: "",
        !          1710: " Linewidths and pointsizes may be changed with `set linestyle`.",
        !          1711: "",
        !          1712: " The `postscript` driver supports about 70 distinct pointtypes, selectable",
        !          1713: " through the `pointtype` option on `plot` and `set linestyle`.",
        !          1714: "",
        !          1715: " Several possibly useful files about `gnuplot`'s PostScript are included",
        !          1716: " in the /docs/ps subdirectory of the `gnuplot` distribution and at the",
        !          1717: " distribution sites.  These are \"ps_symbols.gpi\" (a `gnuplot` command file",
        !          1718: " that, when executed, creates the file \"ps_symbols.ps\" which shows all the",
        !          1719: " symbols available through the `postscript` terminal), \"ps_guide.ps\" (a",
        !          1720: " PostScript file that contains a summary of the enhanced syntax and a page",
        !          1721: " showing what the octal codes produce with text and symbol fonts) and",
        !          1722: " \"ps_file.doc\" (a text file that contains a discussion of the organization",
        !          1723: " of a PostScript file written by `gnuplot`).",
        !          1724: "",
        !          1725: " A PostScript file is editable, so once `gnuplot` has created one, you are",
        !          1726: " free to modify it to your heart's desire.  See the \"editing postscript\"",
        !          1727: " section for some hints.",
        !          1728: "2 enhanced postscript",
        !          1729: "?commands set terminal postscript enhanced",
        !          1730: "?set terminal postscript enhanced",
        !          1731: "?set term postscript enhanced",
        !          1732: "?terminal postscript enhanced",
        !          1733: "?term postscript enhanced",
        !          1734: "?enhanced_postscript",
        !          1735: "@start table - first is interactive cleartext form",
        !          1736: "  Control      Examples        Explanation",
        !          1737: "   ^           a^x             superscript",
        !          1738: "   _           a_x             subscript",
        !          1739: "   @           @x or a@^b_c    phantom box (occupies no width)",
        !          1740: "   &           &{space}        inserts space of specified length",
        !          1741: "#\\begin{tabular}{|ccl|} \\hline",
        !          1742: "#\\multicolumn{3}{|c|}{Enhanced Text Control Codes} \\\\ \\hline",
        !          1743: "#Control & Examples & Explanation \\\\ \\hline",
        !          1744: "#\\verb~^~ & \\verb~a^x~ & superscript\\\\",
        !          1745: "#\\verb~_~ & \\verb~a_x~ & subscript\\\\",
        !          1746: "#\\verb~@~ & \\verb~@x or a@^b_c~ & phantom box (occupies no width)\\\\",
        !          1747: "#\\verb~&~ & \\verb~&{space}~ & inserts space of specified length\\\\",
        !          1748: "%c c l .",
        !          1749: "%.TE", /* ugly - doc2ms uses @ for column separator, but here we */
        !          1750: "%.TS", /* need @ in table, so end and restart the table ! */
        !          1751: "%center box tab ($) ;",
        !          1752: "%c c l .",
        !          1753: "%Control$Examples$Explanation",
        !          1754: "%_",
        !          1755: "%^$a^x$superscript",
        !          1756: "%\\&_$a\\&_x$subscript",
        !          1757: "% @ $ @x or a\\&@^b\\&_c$phantom box (occupies no width)",
        !          1758: "% & $ &{space}$inserts space of specified length",
        !          1759: "@end table",
        !          1760: "",
        !          1761: " Braces can be used to place multiple-character text where a single character",
        !          1762: " is expected (e.g., 2^{10}).  To change the font and/or size, use the full",
        !          1763: " form:  {/[fontname][=fontsize | *fontscale] text}.  Thus {/Symbol=20 G} is a",
        !          1764: " 20-point GAMMA) and {/*0.75 K} is a K at three-quarters of whatever fontsize",
        !          1765: " is currently in effect.  (The '/' character MUST be the first character after",
        !          1766: " the '{'.)",
        !          1767: "",
        !          1768: " If the encoding vector has been changed by `set encoding`, the default",
        !          1769: " encoding vector can be used instead by following the slash with a dash.  This",
        !          1770: " is unnecessary if you use the Symbol font, however---since /Symbol uses its",
        !          1771: " own encoding vector, `gnuplot` will not apply any other encoding vector to",
        !          1772: " it.",
        !          1773: "",
        !          1774: " The phantom box is useful for a@^b_c to align superscripts and subscripts",
        !          1775: " but does not work well for overwriting an accent on a letter.  (To do the",
        !          1776: " latter, it is much better to use `set encoding iso_8859_1` to change to the",
        !          1777: " ISO Latin-1 encoding vector, which contains a large variety of letters with",
        !          1778: " accents or other diacritical marks.)  Since the box is non-spacing, it is",
        !          1779: " sensible to put the shorter of the subscript or superscript in the box (that",
        !          1780: " is, after the @).",
        !          1781: "",
        !          1782: " Space equal in length to a string can be inserted using the '&' character.",
        !          1783: " Thus",
        !          1784: "         'abc&{def}ghi'",
        !          1785: " would produce",
        !          1786: "         'abc   ghi'.",
        !          1787: "",
        !          1788: " You can access special symbols numerically by specifying \\character-code (in",
        !          1789: " octal), e.g., {/Symbol \\245} is the symbol for infinity.",
        !          1790: "",
        !          1791: " You can escape control characters using \\, e.g.,  \\\\, \\{, and so on.",
        !          1792: "",
        !          1793: " But be aware that strings in double-quotes are parsed differently than those",
        !          1794: " enclosed in single-quotes.  The major difference is that backslashes may need",
        !          1795: " to be doubled when in double-quoted strings.",
        !          1796: "",
        !          1797: " Examples (these are hard to describe in words---try them!):",
        !          1798: "       set xlabel 'Time (10^6 {/Symbol m}s)'",
        !          1799: "       set title '{/Symbol=18 \\362@_{/=9.6 0}^{/=12 x}} \\",
        !          1800: "                  {/Helvetica e^{-{/Symbol m}^2/2} d}{/Symbol m}'",
        !          1801: "",
        !          1802: " The file \"ps_guide.ps\" in the /docs/ps subdirectory of the `gnuplot` source",
        !          1803: " distribution contains more examples of the enhanced syntax.",
        !          1804: "2 editing postscript",
        !          1805: "?commands set terminal postscript editing",
        !          1806: "?set terminal postscript editing",
        !          1807: "?set term postscript editing",
        !          1808: "?terminal postscript editing",
        !          1809: "?term postscript editing",
        !          1810: "?editing_postscript",
        !          1811: " The PostScript language is a very complex language---far too complex to",
        !          1812: " describe in any detail in this document.  Nevertheless there are some things",
        !          1813: " in a PostScript file written by `gnuplot` that can be changed without risk of",
        !          1814: " introducing fatal errors into the file.",
        !          1815: "",
        !          1816: " For example, the PostScript statement \"/Color true def\" (written into the",
        !          1817: " file in response to the command `set terminal postscript color`), may be",
        !          1818: " altered in an obvious way to generate a black-and-white version of a plot.",
        !          1819: " Similarly line colors, text colors, line weights and symbol sizes can also be",
        !          1820: " altered in straight-forward ways.  Text (titles and labels) can be edited to",
        !          1821: " correct misspellings or to change fonts.  Anything can be repositioned, and",
        !          1822: " of course anything can be added or deleted, but modifications such as these",
        !          1823: " may require deeper knowledge of the PostScript language.",
        !          1824: "",
        !          1825: " The organization of a PostScript file written by `gnuplot` is discussed in",
        !          1826: " the text file \"ps_file.doc\" in the /docs/ps subdirectory."
        !          1827: END_HELP(post)
        !          1828: #endif
        !          1829:

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