--- /dev/null
+/* Hello, Emacs, this is -*-C-*-
+ * $Id: texdraw.trm,v 1.19 2006/07/21 02:35:48 sfeam Exp $
+ */
+
+/* GNUPLOT - texdraw.trm */
+
+/*[
+ * Copyright 1990 - 1993, 1998, 2004
+ *
+ * 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 complete modified source code. Modifications are to
+ * be distributed as patches to the released version. Permission to
+ * distribute binaries produced by compiling modified sources is granted,
+ * provided you
+ * 1. distribute the corresponding source modifications from the
+ * released version in the form of a patch file along with the binaries,
+ * 2. add special version identification to distinguish your version
+ * in addition to the base release version number,
+ * 3. provide your name and address as the primary contact for the
+ * support of your modified version, and
+ * 4. retain our contact information in regard to use of the base
+ * software.
+ * Permission to distribute the released version of the source code along
+ * with corresponding source modifications in the form of a patch file is
+ * granted with same provisions 2 through 4 for binary distributions.
+ *
+ * This software is provided "as is" without express or implied warranty
+ * to the extent permitted by applicable law.
+]*/
+
+/*
+ * 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 (gnuplot-info@lists.sourceforge.net).
+ *
+ */
+
+/*
+ * This file contains the texdraw terminal driver, intended for use with the
+ * texdraw macro package for LaTeX. This is an alternative to the
+ * latex driver. You need texdraw.sty, and texdraw.tex in the texdraw package.
+ *
+ */
+#include "driver.h"
+
+#ifdef TERM_REGISTER
+register_term(texdraw)
+#endif
+
+#ifdef TERM_PROTO
+TERM_PUBLIC void TEXDRAW_init __PROTO((void));
+TERM_PUBLIC void TEXDRAW_graphics __PROTO((void));
+TERM_PUBLIC void TEXDRAW_text __PROTO((void));
+TERM_PUBLIC void TEXDRAW_linetype __PROTO((int linetype));
+TERM_PUBLIC void TEXDRAW_move __PROTO((unsigned int x, unsigned int y));
+TERM_PUBLIC void TEXDRAW_point __PROTO((unsigned int x, unsigned int y,
+ int number));
+TERM_PUBLIC void TEXDRAW_vector __PROTO((unsigned int ux, unsigned int uy));
+TERM_PUBLIC void TEXDRAW_arrow __PROTO((unsigned int sx, unsigned int sy,
+ unsigned int ex, unsigned int ey,
+ int head));
+TERM_PUBLIC void TEXDRAW_put_text __PROTO((unsigned int x, unsigned int y,
+ const char str[]));
+TERM_PUBLIC int TEXDRAW_justify_text __PROTO((enum JUSTIFY mode));
+TERM_PUBLIC int TEXDRAW_text_angle __PROTO((int ang));
+TERM_PUBLIC void TEXDRAW_reset __PROTO((void));
+
+#define TEXDRAW_PTS_PER_INCH (72.27)
+/* resolution of printer we expect to use */
+#define DOTS_PER_INCH (300)
+/* dot size in pt */
+#define TEXDRAW_UNIT (TEXDRAW_PTS_PER_INCH/DOTS_PER_INCH)
+
+/* 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) */
+
+#define GOT_TEXDRAW_PROTO
+#endif
+
+#ifndef TERM_PROTO_ONLY
+#ifdef TERM_BODY
+static void TEXDRAW_endline __PROTO((void));
+static unsigned int TEXDRAW_posx;
+static unsigned int TEXDRAW_posy;
+static enum JUSTIFY TEXDRAW_justify = LEFT;
+static 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 const char GPFAR *GPFAR TEXDRAW_points[] = {
+ "\\rmove(0 4)\\htext{$\\Diamond$}",
+ "\\htext{$+$}",
+ "\\rmove(0 4)\\htext{$\\Box$}",
+ "\\htext{$\\times$}",
+ "\\htext{$\\triangle$}",
+ "\\htext{$\\star$}",
+ "\\lcir r:9",
+ "\\lcir r:12",
+ "\\lcir r: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 const int TEXDRAW_lines[] = {
+ 4, /* -2 border */
+ 3, /* -1 axes */
+ 3, /* 0 solid thin */
+ 4, /* 1 solid thick */
+ 6, /* 2 solid Thick */
+};
+
+/* The line type selected most recently */
+static int TEXDRAW_last_type = 0;
+/* current line type */
+static int TEXDRAW_type;
+/* are we in the middle of a line */
+static TBOOLEAN TEXDRAW_inline = FALSE;
+/* terminate any line in progress */
+static void TEXDRAW_endline __PROTO((void));
+/* number of points in line so far */
+static int TEXDRAW_linecount = 0;
+/* max value for linecount */
+#define TEXDRAW_LINEMAX 5
+
+TERM_PUBLIC void
+TEXDRAW_init()
+{
+ TEXDRAW_posx = TEXDRAW_posy = 0;
+ TEXDRAW_linetype(-1);
+ fputs("%% GNUPLOT: LaTeX using TEXDRAW macros\n", gpoutfile);
+}
+
+TERM_PUBLIC void
+TEXDRAW_graphics()
+{
+ static char GPFAR tdg1[] = "\
+\\begin{texdraw}\n\
+\\normalsize\n\
+\\ifx\\pathDEFINED\\relax\\else\\let\\pathDEFINED\\relax\n\
+ \\def\\QtGfr{\\ifx (\\TGre \\let\\YhetT\\cpath\\else\\let\\YhetT\\relax\\fi\\YhetT}\n\
+ \\def\\path (#1 #2){\\move (#1 #2)\\futurelet\\TGre\\QtGfr}\n\
+ \\def\\cpath (#1 #2){\\lvec (#1 #2)\\futurelet\\TGre\\QtGfr}\n\
+\\fi\n\
+\\drawdim pt\n\
+\\setunitscale %2.2f\n\
+\\linewd %d\n\
+\\textref h:L v:C\n";
+ fprintf(gpoutfile, tdg1,
+ TEXDRAW_scalefactor,
+ TEXDRAW_lines[2]);
+ TEXDRAW_last_type = 0;
+ TEXDRAW_type = 0;
+}
+
+TERM_PUBLIC void
+TEXDRAW_text()
+{
+ TEXDRAW_endline();
+ fputs("\\end{texdraw}\n", gpoutfile);
+}
+
+TERM_PUBLIC void
+TEXDRAW_linetype(int linetype)
+{
+ TEXDRAW_endline();
+
+ if (linetype >= TEXDRAW_NUMLINES - 2)
+ linetype %= (TEXDRAW_NUMLINES - 2);
+
+ TEXDRAW_type = linetype > -2 ? linetype : LT_BLACK;
+}
+
+TERM_PUBLIC void
+TEXDRAW_move(unsigned int x, unsigned int y)
+{
+ TEXDRAW_endline();
+
+ TEXDRAW_posx = x;
+ TEXDRAW_posy = y;
+}
+
+TERM_PUBLIC void
+TEXDRAW_point(unsigned int x, unsigned int 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(gpoutfile, "\\move (%d %d)\n",
+ (int) ((double) x * TEXDRAW_xscale),
+ (int) ((double) y * TEXDRAW_yscale));
+ if (TEXDRAW_last_justify != CENTRE) {
+ fprintf(gpoutfile, "\\textref h:C v:C ");
+ TEXDRAW_last_justify = CENTRE;
+ }
+ fprintf(gpoutfile, "%s\n",
+ (number < 0 ?
+ TEXDRAW_TINY_DOT :
+ TEXDRAW_points[number % TEXDRAW_POINT_TYPES]));
+}
+
+TERM_PUBLIC void
+TEXDRAW_vector(unsigned int ux, unsigned int 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(gpoutfile, "\\linewd %d\n",
+ TEXDRAW_lines[TEXDRAW_type + 2]);
+ TEXDRAW_last_type = TEXDRAW_type;
+ }
+ fprintf(gpoutfile, "\\path (%d %d)",
+ (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) {
+ fputs("\n\\cpath ", gpoutfile);
+ TEXDRAW_linecount = 1;
+ }
+ }
+ fprintf(gpoutfile, "(%d %d)",
+ (int) ((double) ux * TEXDRAW_xscale),
+ (int) ((double) uy * TEXDRAW_yscale));
+ TEXDRAW_posx = ux;
+ TEXDRAW_posy = uy;
+}
+
+static void
+TEXDRAW_endline()
+{
+ if (TEXDRAW_inline) {
+ putc('\n', gpoutfile);
+ TEXDRAW_inline = FALSE;
+ }
+}
+
+TERM_PUBLIC void
+TEXDRAW_arrow(
+ unsigned int sx, unsigned int sy,
+ unsigned int ex, unsigned int ey,
+ int head)
+{
+ char text;
+
+ if (head)
+ text = 'a';
+ else
+ text = 'l';
+ fprintf(gpoutfile, "\\move (%d %d)\\%cvec (%d %d)",
+ (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;
+}
+
+TERM_PUBLIC void
+TEXDRAW_put_text(unsigned int x, unsigned int y, const char str[])
+{
+ char text;
+
+ TEXDRAW_endline();
+
+ fprintf(gpoutfile, "\\move (%d %d)",
+ (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)
+ fputs("\\textref h:L v:C ", gpoutfile);
+ else if (TEXDRAW_justify == CENTRE)
+ fputs("\\textref h:C v:C ", gpoutfile);
+ else if (TEXDRAW_justify == RIGHT)
+ fputs("\\textref h:R v:C ", gpoutfile);
+ }
+ fprintf(gpoutfile, "\\%ctext{%s}\n", text, str);
+}
+
+
+TERM_PUBLIC int
+TEXDRAW_justify_text(enum JUSTIFY mode)
+{
+ TEXDRAW_justify = mode;
+ return (TRUE);
+}
+
+TERM_PUBLIC int
+TEXDRAW_text_angle(int ang)
+{
+ TEXDRAW_angle = ang;
+ return (TRUE);
+}
+
+TERM_PUBLIC void
+TEXDRAW_reset()
+{
+ TEXDRAW_endline();
+ TEXDRAW_posx = TEXDRAW_posy = 0;
+}
+
+#endif /* TERM_BODY */
+
+#ifdef TERM_TABLE
+
+TERM_TABLE_START(texdraw_driver)
+ "texdraw",
+ "LaTeX texdraw environment",
+ TEXDRAW_XMAX, TEXDRAW_YMAX, TEXDRAW_VCHAR, TEXDRAW_HCHAR,
+ TEXDRAW_VTIC, TEXDRAW_HTIC, options_null, TEXDRAW_init, TEXDRAW_reset,
+ TEXDRAW_text, null_scale, TEXDRAW_graphics, TEXDRAW_move, TEXDRAW_vector,
+ TEXDRAW_linetype, TEXDRAW_put_text, TEXDRAW_text_angle,
+ TEXDRAW_justify_text, TEXDRAW_point, TEXDRAW_arrow, set_font_null
+TERM_TABLE_END(texdraw_driver)
+
+#undef LAST_TERM
+#define LAST_TERM texdraw_driver
+
+#endif /* TERM_TABLE */
+
+#endif /* TERM_PROTO_ONLY */
+
+#ifdef TERM_HELP
+START_HELP(texdraw)
+"1 texdraw",
+"?commands set terminal texdraw",
+"?set terminal texdraw",
+"?set term texdraw",
+"?terminal texdraw",
+"?term texdraw",
+"?texdraw",
+" The `texdraw` terminal driver supports the LaTeX texdraw environment. It is",
+" intended for use with \"texdraw.sty\" and \"texdraw.tex\" in the texdraw package.",
+"",
+" Points, among other things, are drawn using the LaTeX commands \"\\Diamond\" and",
+" \"\\Box\". These commands no longer belong to the LaTeX2e core; they are included",
+" in the latexsym package, which is part of the base distribution and thus part",
+" of any LaTeX implementation. Please do not forget to use this package.",
+"",
+" It has no options."
+END_HELP(texdraw)
+#endif /* TERM_HELP */