Annotation of OpenXM_contrib/gnuplot/term/eepic.trm, Revision 1.1
1.1 ! maekawa 1: /*
! 2: * $Id: eepic.trm,v 1.18 1998/04/14 00:17:39 drd Exp $
! 3: *
! 4: */
! 5:
! 6: /* GNUPLOT - eepic.trm */
! 7:
! 8: /*[
! 9: * Copyright 1990 - 1993, 1998
! 10: *
! 11: * Permission to use, copy, and distribute this software and its
! 12: * documentation for any purpose with or without fee is hereby granted,
! 13: * provided that the above copyright notice appear in all copies and
! 14: * that both that copyright notice and this permission notice appear
! 15: * in supporting documentation.
! 16: *
! 17: * Permission to modify the software is granted, but not the right to
! 18: * distribute the complete modified source code. Modifications are to
! 19: * be distributed as patches to the released version. Permission to
! 20: * distribute binaries produced by compiling modified sources is granted,
! 21: * provided you
! 22: * 1. distribute the corresponding source modifications from the
! 23: * released version in the form of a patch file along with the binaries,
! 24: * 2. add special version identification to distinguish your version
! 25: * in addition to the base release version number,
! 26: * 3. provide your name and address as the primary contact for the
! 27: * support of your modified version, and
! 28: * 4. retain our contact information in regard to use of the base
! 29: * software.
! 30: * Permission to distribute the released version of the source code along
! 31: * with corresponding source modifications in the form of a patch file is
! 32: * granted with same provisions 2 through 4 for binary distributions.
! 33: *
! 34: * This software is provided "as is" without express or implied warranty
! 35: * to the extent permitted by applicable law.
! 36: ]*/
! 37:
! 38: /*
! 39: * This file is included by ../term.c.
! 40: *
! 41: * This terminal driver supports:
! 42: * The EEPIC macros for LaTeX.
! 43: *
! 44: * AUTHORS
! 45: * David Kotz
! 46: *
! 47: * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
! 48: *
! 49: */
! 50: /*
! 51: * This file contains the eepic terminal driver, intended for use with the
! 52: * eepic.sty macro package for LaTeX. This is an alternative to the
! 53: * latex driver. You need eepic.sty, epic.sty, and a printer driver that
! 54: * supports the tpic \specials.
! 55: *
! 56: * Although dotted and dashed lines are possible with EEPIC, and are
! 57: * tempting, they do not work well for high-sample-rate curves, mushing
! 58: * the dashes all together into a solid line. For now anyway, the EEPIC
! 59: * driver will have only solid lines. Anyone got a solution?
! 60: *
! 61: * LATEX must also be defined.
! 62: */
! 63: /*
! 64: * adapted to the new terminal layout by Stefan Bodewig (Dec. 1995)
! 65: */
! 66:
! 67: #include "driver.h"
! 68:
! 69: #ifdef TERM_REGISTER
! 70: register_term(eepic)
! 71: #endif
! 72:
! 73: #ifdef TERM_PROTO
! 74: TERM_PUBLIC void EEPIC_init __PROTO((void));
! 75: TERM_PUBLIC void EEPIC_graphics __PROTO((void));
! 76: TERM_PUBLIC void EEPIC_text __PROTO((void));
! 77: TERM_PUBLIC void EEPIC_linetype __PROTO((int linetype));
! 78: TERM_PUBLIC void EEPIC_move __PROTO((unsigned int x, unsigned int y));
! 79: TERM_PUBLIC void EEPIC_point __PROTO((unsigned int x, unsigned int y,
! 80: int number));
! 81: TERM_PUBLIC void EEPIC_vector __PROTO((unsigned int ux, unsigned int uy));
! 82: TERM_PUBLIC void EEPIC_arrow __PROTO((unsigned int sx, unsigned int sy,
! 83: unsigned int ex, unsigned int ey,
! 84: TBOOLEAN head));
! 85: TERM_PUBLIC void EEPIC_put_text __PROTO((unsigned int x, unsigned int y,
! 86: char str[]));
! 87: TERM_PUBLIC int EEPIC_justify_text __PROTO((enum JUSTIFY mode));
! 88: TERM_PUBLIC int EEPIC_text_angle __PROTO((int ang));
! 89: TERM_PUBLIC void EEPIC_reset __PROTO((void));
! 90:
! 91: #define EEPIC_PTS_PER_INCH (72.27)
! 92: /* resolution of printer we expect to use */
! 93: #define DOTS_PER_INCH (300)
! 94: /* dot size in pt */
! 95: #define EEPIC_UNIT (EEPIC_PTS_PER_INCH/DOTS_PER_INCH)
! 96:
! 97: /* 5 inches wide by 3 inches high (default) */
! 98: /* (EEPIC_PTS_PER_INCH/EEPIC_UNIT*5.0) */
! 99: #define EEPIC_XMAX (5*DOTS_PER_INCH)
! 100: /* (EEPIC_PTS_PER_INCH/EEPIC_UNIT*3.0) */
! 101: #define EEPIC_YMAX (3*DOTS_PER_INCH)
! 102:
! 103: #define EEPIC_HTIC (5*DOTS_PER_INCH/72) /* (5./EEPIC_UNIT) */
! 104: #define EEPIC_VTIC (5*DOTS_PER_INCH/72) /* (5./EEPIC_UNIT) */
! 105: #define EEPIC_HCHAR (DOTS_PER_INCH*53/10/72) /* (5.3/EEPIC_UNIT) */
! 106: #define EEPIC_VCHAR (DOTS_PER_INCH*11/72) /* (11./EEPIC_UNIT) */
! 107: #endif /* TERM_PROTO */
! 108:
! 109: #ifndef TERM_PROTO_ONLY
! 110: #ifdef TERM_BODY
! 111:
! 112: static unsigned int EEPIC_posx;
! 113: static unsigned int EEPIC_posy;
! 114: enum JUSTIFY eepic_justify = LEFT;
! 115: static int eepic_angle = 0;
! 116:
! 117: /* for DOTS point style */
! 118: #define EEPIC_TINY_DOT "\\rule{.1pt}{.1pt}"
! 119:
! 120: /* POINTS */
! 121: #define EEPIC_POINT_TYPES 12 /* we supply more point types */
! 122: static char GPFAR *GPFAR EEPIC_points[] =
! 123: {
! 124: "\\raisebox{-1.2pt}{\\makebox(0,0){$\\Diamond$}}",
! 125: "\\makebox(0,0){$+$}",
! 126: "\\raisebox{-1.2pt}{\\makebox(0,0){$\\Box$}}",
! 127: "\\makebox(0,0){$\\times$}",
! 128: "\\makebox(0,0){$\\triangle$}",
! 129: "\\makebox(0,0){$\\star$}",
! 130: "\\circle{12}", "\\circle{18}", "\\circle{24}",
! 131: "\\circle*{12}", "\\circle*{18}", "\\circle*{24}"
! 132: };
! 133:
! 134: /* LINES */
! 135: #define EEPIC_NUMLINES 5 /* number of linetypes below */
! 136: static char GPFAR *GPFAR EEPIC_lines[] =
! 137: {
! 138: "\\thicklines \\path", /* -2 border */
! 139: "\\thinlines \\drawline[-50]", /* -1 axes */
! 140: "\\thinlines \\path", /* 0 solid thin */
! 141: "\\thicklines \\path", /* 1 solid thick */
! 142: "\\Thicklines \\path", /* 2 solid Thick */
! 143: };
! 144: /* These are other possibilities
! 145: "\\thinlines \\dottedline{30}",
! 146: "\\thinlines \\drawline[-30]",
! 147: "\\thinlines \\dottedline{60}",
! 148: "\\thinlines \\drawline[-60]",
! 149: "\\thinlines \\dashline[-10]{20}[6]"
! 150: */
! 151: static int EEPIC_type; /* current line type */
! 152: static TBOOLEAN EEPIC_inline = FALSE; /* are we in the middle of a line */
! 153: void EEPIC_endline __PROTO((void)); /* terminate any line in progress */
! 154: static int EEPIC_linecount = 0; /* number of points in line so far */
! 155: #define EEPIC_LINEMAX 50 /* max value for linecount */
! 156:
! 157: /* ARROWS */
! 158: /* we use the same code as for LATEX */
! 159: /* figure out the best arrow */
! 160: void best_latex_arrow __PROTO((int sx, int sy, int ex, int ey, int who,
! 161: TBOOLEAN head));
! 162:
! 163: TERM_PUBLIC void EEPIC_init()
! 164: {
! 165: EEPIC_posx = EEPIC_posy = 0;
! 166: EEPIC_linetype(-1);
! 167: fprintf(gpoutfile, "%% GNUPLOT: LaTeX picture using EEPIC macros\n\
! 168: \\setlength{\\unitlength}{%fpt}\n", EEPIC_UNIT);
! 169: }
! 170:
! 171:
! 172: TERM_PUBLIC void EEPIC_graphics()
! 173: {
! 174: register struct termentry *t = term;
! 175:
! 176: fprintf(gpoutfile, "\\begin{picture}(%d,%d)(0,0)\n\
! 177: \\footnotesize\n", t->xmax, t->ymax);
! 178:
! 179: }
! 180:
! 181:
! 182: TERM_PUBLIC void EEPIC_text()
! 183: {
! 184: EEPIC_endline();
! 185: fputs("\\end{picture}\n", gpoutfile);
! 186: }
! 187:
! 188:
! 189: TERM_PUBLIC void EEPIC_linetype(linetype)
! 190: int linetype;
! 191: {
! 192: EEPIC_endline();
! 193:
! 194: if (linetype >= EEPIC_NUMLINES - 2)
! 195: linetype %= (EEPIC_NUMLINES - 2);
! 196:
! 197: EEPIC_type = linetype;
! 198: }
! 199:
! 200:
! 201:
! 202: TERM_PUBLIC void EEPIC_move(x, y)
! 203: unsigned int x, y;
! 204: {
! 205: EEPIC_endline();
! 206:
! 207: EEPIC_posx = x;
! 208: EEPIC_posy = y;
! 209: }
! 210:
! 211:
! 212: TERM_PUBLIC void EEPIC_point(x, y, number) /* version of line_and_point */
! 213: unsigned int x, y;
! 214: int number; /* type of point */
! 215: {
! 216: EEPIC_move(x, y);
! 217:
! 218: /* Print the character defined by 'number'; number < 0 means
! 219: to use a dot, otherwise one of the defined points. */
! 220: fprintf(gpoutfile, "\\put(%d,%d){%s}\n", x, y,
! 221: (number < 0 ? EEPIC_TINY_DOT
! 222: : EEPIC_points[number % EEPIC_POINT_TYPES]));
! 223: }
! 224:
! 225:
! 226: TERM_PUBLIC void EEPIC_vector(ux, uy)
! 227: unsigned int ux, uy;
! 228: {
! 229: if (!EEPIC_inline) {
! 230: EEPIC_inline = TRUE;
! 231:
! 232: /* Start a new line. This depends on line type */
! 233: fprintf(gpoutfile, "%s(%u,%u)",
! 234: EEPIC_lines[EEPIC_type + 2],
! 235: EEPIC_posx, EEPIC_posy);
! 236: EEPIC_linecount = 1;
! 237: } else {
! 238: /* Even though we are in middle of a path,
! 239: * we may want to start a new path command.
! 240: * If they are too long then latex will choke.
! 241: */
! 242: if (EEPIC_linecount++ >= EEPIC_LINEMAX) {
! 243: fprintf(gpoutfile, "\n%s(%u,%u)",
! 244: EEPIC_lines[EEPIC_type + 2],
! 245: EEPIC_posx, EEPIC_posy);
! 246: EEPIC_linecount = 1;
! 247: }
! 248: }
! 249: fprintf(gpoutfile, "(%u,%u)", ux, uy);
! 250: EEPIC_posx = ux;
! 251: EEPIC_posy = uy;
! 252: }
! 253:
! 254: void EEPIC_endline()
! 255: {
! 256: if (EEPIC_inline) {
! 257: putc('\n', gpoutfile);
! 258: EEPIC_inline = FALSE;
! 259: }
! 260: }
! 261:
! 262:
! 263: TERM_PUBLIC void EEPIC_arrow(sx, sy, ex, ey, head)
! 264: unsigned int sx, sy, ex, ey;
! 265: TBOOLEAN head;
! 266: {
! 267: best_latex_arrow(sx, sy, ex, ey, 2, head); /* call latex routine */
! 268:
! 269: EEPIC_posx = ex;
! 270: EEPIC_posy = ey;
! 271: }
! 272:
! 273:
! 274: TERM_PUBLIC void EEPIC_put_text(x, y, str)
! 275: unsigned int x, y; /* reference point of string */
! 276: char str[]; /* the text */
! 277: {
! 278: EEPIC_endline();
! 279:
! 280: fprintf(gpoutfile, "\\put(%d,%d)", x, y);
! 281: if ((str[0] == '{') || (str[0] == '[')) {
! 282: fprintf(gpoutfile, "{\\makebox(0,0)%s}\n", str);
! 283: } else
! 284: switch (eepic_angle) {
! 285: case 0:{
! 286: switch (eepic_justify) {
! 287: case LEFT:{
! 288: fprintf(gpoutfile,
! 289: "{\\makebox(0,0)[l]{%s}}\n", str);
! 290: break;
! 291: }
! 292: case CENTRE:{
! 293: fprintf(gpoutfile,
! 294: "{\\makebox(0,0){%s}}\n", str);
! 295: break;
! 296: }
! 297: case RIGHT:{
! 298: fprintf(gpoutfile,
! 299: "{\\makebox(0,0)[r]{%s}}\n", str);
! 300: break;
! 301: }
! 302: }
! 303: break;
! 304: }
! 305: case 1:{ /* put text in a short stack */
! 306: switch (eepic_justify) {
! 307: case LEFT:{
! 308: fprintf(gpoutfile,
! 309: "{\\makebox(0,0)[lb]{\\shortstack{%s}}}\n", str);
! 310: break;
! 311: }
! 312: case CENTRE:{
! 313: fprintf(gpoutfile,
! 314: "{\\makebox(0,0)[l]{\\shortstack{%s}}}\n", str);
! 315: break;
! 316: }
! 317: case RIGHT:{
! 318: fprintf(gpoutfile,
! 319: "{\\makebox(0,0)[lt]{\\shortstack{%s}}}\n", str);
! 320: break;
! 321: }
! 322: }
! 323: break;
! 324: }
! 325: }
! 326: }
! 327:
! 328:
! 329:
! 330: TERM_PUBLIC int EEPIC_justify_text(mode)
! 331: enum JUSTIFY mode;
! 332: {
! 333: eepic_justify = mode;
! 334: return (TRUE);
! 335: }
! 336:
! 337: TERM_PUBLIC int EEPIC_text_angle(ang)
! 338: int ang;
! 339: {
! 340: /* we can't really write text vertically, but this will
! 341: put the ylabel centred at the left of the plot, and
! 342: then we'll make a \shortstack */
! 343: eepic_angle = ang;
! 344: return (TRUE);
! 345: }
! 346:
! 347: TERM_PUBLIC void EEPIC_reset()
! 348: {
! 349: EEPIC_endline();
! 350: EEPIC_posx = EEPIC_posy = 0;
! 351: }
! 352:
! 353: #endif
! 354:
! 355: #ifdef TERM_TABLE
! 356:
! 357: TERM_TABLE_START(eepic_driver)
! 358: "eepic", "EEPIC -- extended LaTeX picture environment",
! 359: EEPIC_XMAX, EEPIC_YMAX, EEPIC_VCHAR, EEPIC_HCHAR,
! 360: EEPIC_VTIC, EEPIC_HTIC, options_null, EEPIC_init, EEPIC_reset,
! 361: EEPIC_text, null_scale, EEPIC_graphics, EEPIC_move, EEPIC_vector,
! 362: EEPIC_linetype, EEPIC_put_text, EEPIC_text_angle,
! 363: EEPIC_justify_text, EEPIC_point, EEPIC_arrow, set_font_null
! 364: TERM_TABLE_END(eepic_driver)
! 365:
! 366: #undef LAST_TERM
! 367: #define LAST_TERM eepic_driver
! 368:
! 369: #endif
! 370: #endif
! 371:
! 372: #ifdef TERM_HELP
! 373: START_HELP(eepic)
! 374: "1 eepic",
! 375: "?commands set terminal eepic",
! 376: "?set terminal eepic",
! 377: "?set term eepic",
! 378: "?terminal eepic",
! 379: "?term eepic",
! 380: "?eepic",
! 381: " The `eepic` terminal driver supports the extended LaTeX picture environment.",
! 382: " It is an alternative to the `latex` driver.",
! 383: "",
! 384: " The output of this terminal is intended for use with the \"eepic.sty\" macro",
! 385: " package for LaTeX. To use it, you need \"eepic.sty\", \"epic.sty\" and a",
! 386: " printer driver that supports the \"tpic\" \\specials. If your printer driver",
! 387: " doesn't support those \\specials, \"eepicemu.sty\" will enable you to use some",
! 388: " of them.",
! 389: "",
! 390: " Although dotted and dashed lines are possible with `eepic` and are tempting,",
! 391: " they do not work well for high-sample-rate curves, fusing the dashes all",
! 392: " together into a solid line. For now, the `eepic` driver creates only solid",
! 393: " lines. There is another gnuplot driver (`tpic`) that supports dashed lines,",
! 394: " but it cannot be used if your DVI driver doesn't support \"tpic\" \\specials.",
! 395: "",
! 396: " All drivers for LaTeX offer a special way of controlling text positioning:",
! 397: " If any text string begins with '{', you also need to include a '}' at the",
! 398: " end of the text, and the whole text will be centered both horizontally",
! 399: " and vertically by LaTeX. --- If the text string begins with '[', you need",
! 400: " to continue it with: a position specification (up to two out of t,b,l,r),",
! 401: " ']{', the text itself, and finally, '}'. The text itself may be anything",
! 402: " LaTeX can typeset as an LR-box. \\rule{}{}'s may help for best positioning.",
! 403: "",
! 404: " The `eepic` terminal has no options.",
! 405: "",
! 406: " Examples:",
! 407: " About label positioning:",
! 408: " Use gnuplot defaults (mostly sensible, but sometimes not really best):",
! 409: " set title '\\LaTeX\\ -- $ \\gamma $'",
! 410: " Force centering both horizontally and vertically:",
! 411: " set label '{\\LaTeX\\ -- $ \\gamma $}' at 0,0",
! 412: " Specify own positioning (top here):",
! 413: " set xlabel '[t]{\\LaTeX\\ -- $ \\gamma $}'",
! 414: " The other label -- account for long ticlabels:",
! 415: " set ylabel '[r]{\\LaTeX\\ -- $ \\gamma $\\rule{7mm}{0pt}'"
! 416: END_HELP(eepic)
! 417: #endif /* TERM_HELP */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>