/* GNUPLOT - texdraw.trm */ /* * Copyright (C) 1990 * * Permission to use, copy, and distribute this software and its * documentation for any purpose with or without fee is hereby granted, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation. * * Permission to modify the software is granted, but not the right to * distribute the modified code. Modifications are to be distributed * as patches to released version. * * This software is provided "as is" without express or implied warranty. * * This file is included by ../term.c. * * This terminal driver supports: * The TEXDRAW macros for LaTeX. * * AUTHORS * Khun Yee Fung. Modified from eepic.trm. * clipper@csd.uwo.ca * January 20, 1992 * * send your comments or suggestions to (pixar!info-gnuplot@sun.com). * */
/* * This file contains the texdraw terminal driver, intended for use with the * texdraw.sty macro package for LaTeX. This is an alternative to the * latex driver. You need texdraw.sty, and texdraw.tex. * Be sure to use the texdraw package with the &sstarf#star;path commands. * Ask <clipper@csd.uwo.ca> for the modified version if you don't have it. * */
#define TEXDRAW_PTS_PER_INCH (72.27) #define DOTS_PER_INCH (300) /* resolution of printer we expect to use */ #define TEXDRAW_UNIT (TEXDRAW_PTS_PER_INCH/DOTS_PER_INCH) /* dot size in pt */
/* 5 inches wide by 3 inches high (default) */ #define TEXDRAW_XMAX (5*DOTS_PER_INCH) #define TEXDRAW_YMAX (3*DOTS_PER_INCH)
#define TEXDRAW_HTIC (5*DOTS_PER_INCH/72) /* (5./TEXDRAW_UNIT) */ #define TEXDRAW_VTIC (5*DOTS_PER_INCH/72) /* (5./TEXDRAW_UNIT) */ #define TEXDRAW_HCHAR (DOTS_PER_INCH*53/10/72) /* (5.3/TEXDRAW_UNIT) */ #define TEXDRAW_VCHAR (DOTS_PER_INCH*11/72) /* (11./TEXDRAW_UNIT) */
static unsigned int TEXDRAW_posx; static unsigned int TEXDRAW_posy; enum JUSTIFY TEXDRAW_justify = LEFT; enum JUSTIFY TEXDRAW_last_justify = LEFT; static int TEXDRAW_angle = 0; static float TEXDRAW_scalefactor = 0.2409; static double TEXDRAW_xscale = 1.0, TEXDRAW_yscale = 1.0;
/* for DOTS point style */
#define TEXDRAW_TINY_DOT "
htext
cdot"
/* POINTS */
#define TEXDRAW_POINT_TYPES 12 /* we supply more point types */
static char *TEXDRAW_points[] =
"
rmove(0 4)
htext
Diamond",
"
htext+",
"
rmove(0 4)
htext
Box",
"
htext
times",
"
htext
triangle",
"
htext
star",
"
lcir f:9",
"
lcir f:12",
"
lcir f:16",
"
fcir f:0.9 r:9",
"
fcir f:0.9 r:12",
"
fcir f:0.9 r:16"
;
/* LINES */ #define TEXDRAW_NUMLINES 5 /* number of linetypes below */ static int TEXDRAW_lines[] = 4, /* -2 border */ 3, /* -1 axes */ 3, /* 0 solid thin */ 4, /* 1 solid thick */ 6, /* 2 solid Thick */ ;
static int TEXDRAW_last_type = 0; /* The line type selected most recently */ static int TEXDRAW_type; /* current line type */ static TBOOLEAN TEXDRAW_inline = FALSE; /* are we in the middle of a line */ static void TEXDRAW_endline(); /* terminate any line in progress */ static int TEXDRAW_linecount = 0; /* number of points in line so far */ #define TEXDRAW_LINEMAX 5 /* max value for linecount */
TEXDRAW_init() TEXDRAW_posx = TEXDRAW_posy = 0; TEXDRAW_linetype(-1); fprintf(outfile, "
TEXDRAW_scale(xs, ys) double xs, ys; /* scaling factors */ register struct termentry *t = &term_tbl[term];
/* we change the table for use in graphics.c */ t->xmax = (unsigned int) (TEXDRAW_XMAX * xs); t->ymax = (unsigned int) (TEXDRAW_YMAX * ys);
TEXDRAW_xscale = xs; TEXDRAW_yscale = ys;
return (TRUE);
TEXDRAW_graphics()
fprintf(outfile, "
begintexdraw");
fprintf(outfile, "
normalsize");
fprintf(outfile, "
drawdim pt");
fprintf(outfile, "
setunitscale fprintf(outfile, "
linewd fprintf(outfile, "
textref h:L v:C");
TEXDRAW_last_type = 0;
TEXDRAW_type = 0;
TEXDRAW_text()
TEXDRAW_endline();
fprintf(outfile, "
endtexdraw");
TEXDRAW_linetype(linetype) int linetype; TEXDRAW_endline();
if (linetype >= TEXDRAW_NUMLINES - 2) linetype
TEXDRAW_type = linetype;
TEXDRAW_move(x, y) unsigned int x, y; TEXDRAW_endline();
TEXDRAW_posx = x; TEXDRAW_posy = y;
TEXDRAW_point(x, y, number) unsigned int x, y; int number; TEXDRAW_move(x, y);
/* Print the character defined by 'number'; number < 0 means
to use a dot, otherwise one of the defined points. */
fprintf(outfile, "
move ((int)((double) x * TEXDRAW_xscale),
(int)((double) y * TEXDRAW_yscale));
if (TEXDRAW_last_justify != CENTRE)
fprintf(outfile, "
textref h:C v:C ");
TEXDRAW_last_justify = CENTRE;
fprintf(outfile, "(number < 0 ?
TEXDRAW_TINY_DOT :
TEXDRAW_points[number
TEXDRAW_vector(ux, uy) unsigned int ux, uy; if (!TEXDRAW_inline) TEXDRAW_inline = TRUE;
/* Start a new line. This depends on line type */
if (TEXDRAW_type != TEXDRAW_last_type)
if (TEXDRAW_lines[TEXDRAW_type+2] != TEXDRAW_lines[TEXDRAW_last_type+2])
fprintf(outfile, "
linewd TEXDRAW_last_type = TEXDRAW_type;
fprintf(outfile, "
path ((int)((double) TEXDRAW_posx * TEXDRAW_xscale),
(int)((double) TEXDRAW_posy * TEXDRAW_yscale));
TEXDRAW_linecount = 1;
else
/* Even though we are in middle of a path,
* we may want to start a new path command.
* If they are too long then latex will choke.
*/
if (TEXDRAW_linecount++ >= TEXDRAW_LINEMAX)
fprintf(outfile, "
cpath ");
TEXDRAW_linecount = 1;
fprintf(outfile, "((int)((double) ux * TEXDRAW_xscale),
(int)((double) uy * TEXDRAW_yscale));
TEXDRAW_posx = ux;
TEXDRAW_posy = uy;
static void TEXDRAW_endline() if (TEXDRAW_inline) fprintf(outfile, ""); TEXDRAW_inline = FALSE;
TEXDRAW_arrow(sx, sy, ex, ey, head) int sx, sy, ex, ey; TBOOLEAN head; char text;
if (head)
text = 'a';
else
text = 'l';
fprintf(outfile, "
move ((int)((double) sx * TEXDRAW_xscale),
(int)((double) sy * TEXDRAW_yscale),
text,
(int)((double) ex * TEXDRAW_xscale),
(int)((double) ey * TEXDRAW_yscale));
TEXDRAW_posx = ex;
TEXDRAW_posy = ey;
TEXDRAW_put_text(x, y, str) int x, y; /* reference point of string */ char str[]; /* the text */ char text;
TEXDRAW_endline();
fprintf(outfile, "
move ((int)((double) x * TEXDRAW_xscale),
(int)((double) y * TEXDRAW_yscale));
if (!TEXDRAW_angle) text = 'h'; else text = 'v';
if (TEXDRAW_last_justify != TEXDRAW_justify)
TEXDRAW_last_justify = TEXDRAW_justify;
if (TEXDRAW_justify == LEFT)
fprintf(outfile, "
textref h:L v:C ");
else if (TEXDRAW_justify == CENTRE)
fprintf(outfile, "
textref h:C v:C ");
else if (TEXDRAW_justify == RIGHT)
fprintf(outfile, "
textref h:R v:C ");
fprintf(outfile, "
int TEXDRAW_justify_text(mode) enum JUSTIFY mode; TEXDRAW_justify = mode; return (TRUE);
int TEXDRAW_text_angle(angle) int angle; TEXDRAW_angle = angle; return (TRUE);
TEXDRAW_reset() TEXDRAW_endline(); TEXDRAW_posx = TEXDRAW_posy = 0;