Annotation of OpenXM_contrib/gnuplot/term/texdraw.trm, Revision 1.1.1.1
1.1 maekawa 1: /*
2: * $Id: texdraw.trm,v 1.15 1998/06/18 14:59:26 ddenholm Exp $
3: */
4:
5: /* GNUPLOT - texdraw.trm */
6:
7: /*[
8: * Copyright 1990 - 1993, 1998
9: *
10: * Permission to use, copy, and distribute this software and its
11: * documentation for any purpose with or without fee is hereby granted,
12: * provided that the above copyright notice appear in all copies and
13: * that both that copyright notice and this permission notice appear
14: * in supporting documentation.
15: *
16: * Permission to modify the software is granted, but not the right to
17: * distribute the complete modified source code. Modifications are to
18: * be distributed as patches to the released version. Permission to
19: * distribute binaries produced by compiling modified sources is granted,
20: * provided you
21: * 1. distribute the corresponding source modifications from the
22: * released version in the form of a patch file along with the binaries,
23: * 2. add special version identification to distinguish your version
24: * in addition to the base release version number,
25: * 3. provide your name and address as the primary contact for the
26: * support of your modified version, and
27: * 4. retain our contact information in regard to use of the base
28: * software.
29: * Permission to distribute the released version of the source code along
30: * with corresponding source modifications in the form of a patch file is
31: * granted with same provisions 2 through 4 for binary distributions.
32: *
33: * This software is provided "as is" without express or implied warranty
34: * to the extent permitted by applicable law.
35: ]*/
36:
37: /*
38: * This file is included by ../term.c.
39: *
40: * This terminal driver supports:
41: * The TEXDRAW macros for LaTeX.
42: *
43: * AUTHORS
44: * Khun Yee Fung. Modified from eepic.trm.
45: * clipper@csd.uwo.ca
46: * January 20, 1992
47: *
48: * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
49: *
50: */
51:
52: /*
53: * This file contains the texdraw terminal driver, intended for use with the
54: * texdraw macro package for LaTeX. This is an alternative to the
55: * latex driver. You need texdraw.sty, and texdraw.tex in the texdraw package.
56: *
57: */
58: #include "driver.h"
59:
60: #ifdef TERM_REGISTER
61: register_term(texdraw)
62: #endif
63:
64: #ifdef TERM_PROTO
65: TERM_PUBLIC void TEXDRAW_init __PROTO((void));
66: TERM_PUBLIC void TEXDRAW_graphics __PROTO((void));
67: TERM_PUBLIC void TEXDRAW_text __PROTO((void));
68: TERM_PUBLIC void TEXDRAW_linetype __PROTO((int linetype));
69: TERM_PUBLIC void TEXDRAW_move __PROTO((unsigned int x, unsigned int y));
70: TERM_PUBLIC void TEXDRAW_point __PROTO((unsigned int x, unsigned int y,
71: int number));
72: TERM_PUBLIC void TEXDRAW_vector __PROTO((unsigned int ux, unsigned int uy));
73: TERM_PUBLIC void TEXDRAW_arrow __PROTO((unsigned int sx, unsigned int sy,
74: unsigned int ex, unsigned int ey,
75: TBOOLEAN head));
76: TERM_PUBLIC void TEXDRAW_put_text __PROTO((unsigned int x, unsigned int y,
77: char str[]));
78: TERM_PUBLIC int TEXDRAW_justify_text __PROTO((enum JUSTIFY mode));
79: TERM_PUBLIC int TEXDRAW_text_angle __PROTO((int ang));
80: TERM_PUBLIC void TEXDRAW_reset __PROTO((void));
81:
82: #define TEXDRAW_PTS_PER_INCH (72.27)
83: /* resolution of printer we expect to use */
84: #define DOTS_PER_INCH (300)
85: /* dot size in pt */
86: #define TEXDRAW_UNIT (TEXDRAW_PTS_PER_INCH/DOTS_PER_INCH)
87:
88: /* 5 inches wide by 3 inches high (default) */
89: #define TEXDRAW_XMAX (5*DOTS_PER_INCH)
90: #define TEXDRAW_YMAX (3*DOTS_PER_INCH)
91:
92: #define TEXDRAW_HTIC (5*DOTS_PER_INCH/72) /* (5./TEXDRAW_UNIT) */
93: #define TEXDRAW_VTIC (5*DOTS_PER_INCH/72) /* (5./TEXDRAW_UNIT) */
94: #define TEXDRAW_HCHAR (DOTS_PER_INCH*53/10/72) /* (5.3/TEXDRAW_UNIT) */
95: #define TEXDRAW_VCHAR (DOTS_PER_INCH*11/72) /* (11./TEXDRAW_UNIT) */
96:
97: #define GOT_TEXDRAW_PROTO
98: #endif
99:
100: #ifndef TERM_PROTO_ONLY
101: #ifdef TERM_BODY
102: static void TEXDRAW_endline __PROTO((void));
103: static unsigned int TEXDRAW_posx;
104: static unsigned int TEXDRAW_posy;
105: enum JUSTIFY TEXDRAW_justify = LEFT;
106: enum JUSTIFY TEXDRAW_last_justify = LEFT;
107: static int TEXDRAW_angle = 0;
108: static float TEXDRAW_scalefactor = 0.2409;
109: static double TEXDRAW_xscale = 1.0, TEXDRAW_yscale = 1.0;
110:
111: /* for DOTS point style */
112: #define TEXDRAW_TINY_DOT "\\htext{$\\cdot$}"
113:
114: /* POINTS */
115: #define TEXDRAW_POINT_TYPES 12 /* we supply more point types */
116: static char GPFAR *GPFAR TEXDRAW_points[] =
117: {
118: "\\rmove(0 4)\\htext{$\\Diamond$}",
119: "\\htext{$+$}",
120: "\\rmove(0 4)\\htext{$\\Box$}",
121: "\\htext{$\\times$}",
122: "\\htext{$\\triangle$}",
123: "\\htext{$\\star$}",
124: "\\lcir r:9",
125: "\\lcir r:12",
126: "\\lcir r:16",
127: "\\fcir f:0.9 r:9",
128: "\\fcir f:0.9 r:12",
129: "\\fcir f:0.9 r:16"
130: };
131:
132: /* LINES */
133: #define TEXDRAW_NUMLINES 5 /* number of linetypes below */
134: static int TEXDRAW_lines[] =
135: {
136: 4, /* -2 border */
137: 3, /* -1 axes */
138: 3, /* 0 solid thin */
139: 4, /* 1 solid thick */
140: 6, /* 2 solid Thick */
141: };
142:
143: /* The line type selected most recently */
144: static int TEXDRAW_last_type = 0;
145: /* current line type */
146: static int TEXDRAW_type;
147: /* are we in the middle of a line */
148: static TBOOLEAN TEXDRAW_inline = FALSE;
149: /* terminate any line in progress */
150: static void TEXDRAW_endline __PROTO((void));
151: /* number of points in line so far */
152: static int TEXDRAW_linecount = 0;
153: /* max value for linecount */
154: #define TEXDRAW_LINEMAX 5
155:
156: TERM_PUBLIC void TEXDRAW_init()
157: {
158: TEXDRAW_posx = TEXDRAW_posy = 0;
159: TEXDRAW_linetype(-1);
160: fputs("%% GNUPLOT: LaTeX using TEXDRAW macros\n", gpoutfile);
161: }
162:
163: TERM_PUBLIC void TEXDRAW_graphics()
164: {
165: static char GPFAR tdg1[] = "\
166: \\begin{texdraw}\n\
167: \\normalsize\n\
168: \\ifx\\pathDEFINED\\relax\\else\\let\\pathDEFINED\\relax\n\
169: \\def\\QtGfr{\\ifx (\\TGre \\let\\YhetT\\cpath\\else\\let\\YhetT\\relax\\fi\\YhetT}\n\
170: \\def\\path (#1 #2){\\move (#1 #2)\\futurelet\\TGre\\QtGfr}\n\
171: \\def\\cpath (#1 #2){\\lvec (#1 #2)\\futurelet\\TGre\\QtGfr}\n\
172: \\fi\n\
173: \\drawdim pt\n\
174: \\setunitscale %2.2f\n\
175: \\linewd %d\n\
176: \\textref h:L v:C\n";
177: fprintf(gpoutfile, tdg1,
178: TEXDRAW_scalefactor,
179: TEXDRAW_lines[2]);
180: TEXDRAW_last_type = 0;
181: TEXDRAW_type = 0;
182: }
183:
184: TERM_PUBLIC void TEXDRAW_text()
185: {
186: TEXDRAW_endline();
187: fputs("\\end{texdraw}\n", gpoutfile);
188: }
189:
190: TERM_PUBLIC void TEXDRAW_linetype(linetype)
191: int linetype;
192: {
193: TEXDRAW_endline();
194:
195: if (linetype >= TEXDRAW_NUMLINES - 2)
196: linetype %= (TEXDRAW_NUMLINES - 2);
197:
198: TEXDRAW_type = linetype;
199: }
200:
201: TERM_PUBLIC void TEXDRAW_move(x, y)
202: unsigned int x, y;
203: {
204: TEXDRAW_endline();
205:
206: TEXDRAW_posx = x;
207: TEXDRAW_posy = y;
208: }
209:
210: TERM_PUBLIC void TEXDRAW_point(x, y, number)
211: unsigned int x, y;
212: int number;
213: {
214: TEXDRAW_move(x, y);
215:
216: /* Print the character defined by 'number'; number < 0 means
217: * to use a dot, otherwise one of the defined points. */
218: fprintf(gpoutfile, "\\move (%d %d)\n",
219: (int) ((double) x * TEXDRAW_xscale),
220: (int) ((double) y * TEXDRAW_yscale));
221: if (TEXDRAW_last_justify != CENTRE) {
222: fprintf(gpoutfile, "\\textref h:C v:C ");
223: TEXDRAW_last_justify = CENTRE;
224: }
225: fprintf(gpoutfile, "%s\n",
226: (number < 0 ?
227: TEXDRAW_TINY_DOT :
228: TEXDRAW_points[number % TEXDRAW_POINT_TYPES]));
229: }
230:
231: TERM_PUBLIC void TEXDRAW_vector(ux, uy)
232: unsigned int ux, uy;
233: {
234: if (!TEXDRAW_inline) {
235: TEXDRAW_inline = TRUE;
236:
237: /* Start a new line. This depends on line type */
238: if (TEXDRAW_type != TEXDRAW_last_type) {
239: if (TEXDRAW_lines[TEXDRAW_type + 2] != TEXDRAW_lines[TEXDRAW_last_type + 2])
240: fprintf(gpoutfile, "\\linewd %d\n", TEXDRAW_lines[TEXDRAW_type + 2]);
241: TEXDRAW_last_type = TEXDRAW_type;
242: }
243: fprintf(gpoutfile, "\\path (%d %d)",
244: (int) ((double) TEXDRAW_posx * TEXDRAW_xscale),
245: (int) ((double) TEXDRAW_posy * TEXDRAW_yscale));
246: TEXDRAW_linecount = 1;
247: } else {
248: /* Even though we are in middle of a path,
249: * we may want to start a new path command.
250: * If they are too long then latex will choke.
251: */
252: if (TEXDRAW_linecount++ >= TEXDRAW_LINEMAX) {
253: fputs("\n\\cpath ", gpoutfile);
254: TEXDRAW_linecount = 1;
255: }
256: }
257: fprintf(gpoutfile, "(%d %d)",
258: (int) ((double) ux * TEXDRAW_xscale),
259: (int) ((double) uy * TEXDRAW_yscale));
260: TEXDRAW_posx = ux;
261: TEXDRAW_posy = uy;
262: }
263:
264: static void TEXDRAW_endline()
265: {
266: if (TEXDRAW_inline) {
267: putc('\n', gpoutfile);
268: TEXDRAW_inline = FALSE;
269: }
270: }
271:
272: TERM_PUBLIC void TEXDRAW_arrow(sx, sy, ex, ey, head)
273: unsigned int sx, sy, ex, ey;
274: TBOOLEAN head;
275: {
276: char text;
277:
278: if (head)
279: text = 'a';
280: else
281: text = 'l';
282: fprintf(gpoutfile, "\\move (%d %d)\\%cvec (%d %d)",
283: (int) ((double) sx * TEXDRAW_xscale),
284: (int) ((double) sy * TEXDRAW_yscale),
285: text,
286: (int) ((double) ex * TEXDRAW_xscale),
287: (int) ((double) ey * TEXDRAW_yscale));
288: TEXDRAW_posx = ex;
289: TEXDRAW_posy = ey;
290: }
291:
292: TERM_PUBLIC void TEXDRAW_put_text(x, y, str)
293: unsigned int x, y; /* reference point of string */
294: char str[]; /* the text */
295: {
296: char text;
297:
298: TEXDRAW_endline();
299:
300: fprintf(gpoutfile, "\\move (%d %d)",
301: (int) ((double) x * TEXDRAW_xscale),
302: (int) ((double) y * TEXDRAW_yscale));
303:
304: if (!TEXDRAW_angle)
305: text = 'h';
306: else
307: text = 'v';
308:
309: if (TEXDRAW_last_justify != TEXDRAW_justify) {
310: TEXDRAW_last_justify = TEXDRAW_justify;
311: if (TEXDRAW_justify == LEFT)
312: fputs("\\textref h:L v:C ", gpoutfile);
313: else if (TEXDRAW_justify == CENTRE)
314: fputs("\\textref h:C v:C ", gpoutfile);
315: else if (TEXDRAW_justify == RIGHT)
316: fputs("\\textref h:R v:C ", gpoutfile);
317: }
318: fprintf(gpoutfile, "\\%ctext{%s}\n", text, str);
319: }
320:
321:
322: TERM_PUBLIC int TEXDRAW_justify_text(mode)
323: enum JUSTIFY mode;
324: {
325: TEXDRAW_justify = mode;
326: return (TRUE);
327: }
328:
329: TERM_PUBLIC int TEXDRAW_text_angle(ang)
330: int ang;
331: {
332: TEXDRAW_angle = ang;
333: return (TRUE);
334: }
335:
336: TERM_PUBLIC void TEXDRAW_reset()
337: {
338: TEXDRAW_endline();
339: TEXDRAW_posx = TEXDRAW_posy = 0;
340: }
341:
342: #endif /* TERM_BODY */
343:
344: #ifdef TERM_TABLE
345:
346: TERM_TABLE_START(texdraw_driver)
347: "texdraw",
348: "LaTeX texdraw environment",
349: TEXDRAW_XMAX, TEXDRAW_YMAX, TEXDRAW_VCHAR, TEXDRAW_HCHAR,
350: TEXDRAW_VTIC, TEXDRAW_HTIC, options_null, TEXDRAW_init, TEXDRAW_reset,
351: TEXDRAW_text, null_scale, TEXDRAW_graphics, TEXDRAW_move, TEXDRAW_vector,
352: TEXDRAW_linetype, TEXDRAW_put_text, TEXDRAW_text_angle,
353: TEXDRAW_justify_text, TEXDRAW_point, TEXDRAW_arrow, set_font_null
354: TERM_TABLE_END(texdraw_driver)
355:
356: #undef LAST_TERM
357: #define LAST_TERM texdraw_driver
358:
359: #endif /* TERM_TABLE */
360:
361: #endif /* TERM_PROTO_ONLY */
362:
363: #ifdef TERM_HELP
364: START_HELP(texdraw)
365: "1 texdraw",
366: "?commands set terminal texdraw",
367: "?set terminal texdraw",
368: "?set term texdraw",
369: "?terminal texdraw",
370: "?term texdraw",
371: "?texdraw",
372: " The `texdraw` terminal driver supports the LaTeX texdraw environment. It is",
373: " intended for use with \"texdraw.sty\" and \"texdraw.tex\" in the texdraw package.",
374: "",
375: " It has no options."
376: END_HELP(texdraw)
377: #endif /* TERM_HELP */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>