|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T f
Length: 30412 (0x76cc) Types: TextFile Names: »fig2tex.c,v«
└─⟦060c9c824⟧ Bits:30007080 DKUUG TeX 2/12/89 └─⟦this⟧ »./tex82/TeXgraphics/transfig/fig2tex/fig2tex.c,v«
head 1.13; access ; symbols ; locks ; strict; comment @ * @; 1.13 date 88.02.24.12.23.04; author beck; state Exp; branches ; next 1.12; 1.12 date 88.02.18.16.23.46; author beck; state Exp; branches ; next 1.11; 1.11 date 88.02.17.11.20.05; author beck; state Exp; branches ; next 1.10; 1.10 date 88.02.17.10.30.57; author beck; state Exp; branches ; next 1.9; 1.9 date 88.02.16.12.10.54; author beck; state Exp; branches ; next 1.8; 1.8 date 88.02.15.16.27.35; author beck; state Exp; branches ; next 1.7; 1.7 date 88.02.15.15.57.03; author beck; state Exp; branches ; next 1.6; 1.6 date 88.02.15.11.44.37; author beck; state Exp; branches ; next 1.5; 1.5 date 88.02.12.01.06.09; author beck; state Exp; branches ; next 1.4; 1.4 date 88.02.11.11.11.28; author beck; state Exp; branches ; next 1.3; 1.3 date 88.02.09.11.25.07; author beck; state Exp; branches ; next 1.2; 1.2 date 88.01.04.10.40.01; author beck; state Exp; branches ; next 1.1; 1.1 date 87.12.22.13.00.24; author beck; state Exp; branches ; next ; desc @Fig-to-PicTeX conversion program with LaTeX optimization @ 1.13 log @fix bounding box calculation, a bug in arbitary text @ text @/* * Fig2tex : The fig-to-PicTeX translator * * Modified from ftp, the fig-to-to-pic translator * * University of Texas at Austin, * */ /* * Modified 1987 for PicTeX output by Micah Beck (beck@@svax.cs.cornell.edu) * */ #include <stdio.h> #include <math.h> #include "object.h" #include "choices.h" #define round(x) ((int) (x + .5)) #define max(a,b) ((a > b) ? a : b) #define min(a,b) ((a < b) ? a : b) #define MINMAX(X,Y) { min_x = min(X, min_x); \ min_y = min(Y, min_y); \ max_x = max(X, max_x); \ max_y = max(Y, max_y); \ } #define SWITCH(T,A,B) { register T t; \ t = A; \ A = B; \ B = t; \ } #define EPSILON 0.02 #define CLOSE(A,B) (fabs(A-B) < EPSILON) extern int getopt(); extern char *optarg; extern int optind; extern double sin(), cos(), acos(), fabs(); FILE *tfp; float PIX_PER_INCH, mag; int cur_style, cur_dashlength; main(argc, argv) int argc; char *argv[]; { char *textfont, *linethick, *plotsymbol; char *from, *to, text[80], c; FILE *ffp; int arb, size, type, style, thickness, direction; int n, num_obj, font, object; int f_arrow, b_arrow, arrow_wid, arrow_ht; float CANVAS_WIDTH, CANVAS_HEIGHT, ORIGIN; float dummy, width, height, length, dash_length; float a, b; float x, y, x1, y1, x2, y2, xsav, ysav; float cx1, cy1, cx2, cy2, cx3, cy3, cx4, cy4; float min_x, min_y, max_x, max_y; double dx1, dx2, dy1, dy2, r1, th1, r2, th2, theta, t; mag = 1.0; textfont = "\\twltt"; linethick = ".7pt"; plotsymbol = "\\sevrm ."; from = NULL; to = NULL; while ((c = getopt(argc, argv, "af:l:p:m:")) != EOF) switch (c) { case 'a': /* arbitrary text */ arb = 1; case 'f': /* set text font */ textfont = optarg; break; case 'l': /* set line thickness */ linethick = optarg; break; case 'p': /* set plot symbol */ plotsymbol = optarg; break; case 'm': mag = atof(optarg); /* set magnification */ break; case '?': exit(1); break; } if (optind < argc) from = argv[optind++]; /* from file */ if (optind < argc) to = argv[optind]; /* to file */ if (from == NULL) ffp = stdin; else if ((ffp = fopen(from, "r")) == NULL) { fprintf(stderr, "Couldn't open %s\n", from); exit(1); } if (to == NULL) tfp = stdout; else if ((tfp = fopen(to, "w")) == NULL) { fprintf(stderr, "Couldn't open %s\n", to); exit(1); } cur_style = SOLID_LINE; cur_dashlength = 0; fscanf(ffp,"%f %f %f %f\n", &PIX_PER_INCH, &ORIGIN, &CANVAS_WIDTH, &CANVAS_HEIGHT); max_x = max_y = 0; min_x = CANVAS_WIDTH; min_y = CANVAS_HEIGHT; fprintf(tfp, "\\mbox{\\beginpicture\n"); fprintf(tfp, "\\setcoordinatesystem units <%6.3fin,%6.3fin>\n", mag, mag); fprintf(tfp, "\\linethickness=%s\n", linethick); fprintf(tfp, "\\setplotsymbol ({%s})\n", plotsymbol); fprintf(tfp, "\\setlinear\n"); fprintf(tfp, "\\if \\picturemode \\nopics \\else\n"); fprintf(tfp, "\\if \\picturemode \\dottedpics \\setdots \\fi"); fprintf(tfp, "\\if \\picturemode \\optpics\n"); fprintf(tfp, "\\unitlength=%6.3fin\n", mag); fprintf(tfp, "\\thicklines\n"); fprintf(tfp, "\\fi\n"); num_obj = 0; while ((fscanf(ffp, "%d", &object)) != EOF) { switch (object) { case ARC : num_obj++; fprintf(tfp, "%%\n%% Fig ARC object (#%d)\n%%\n", num_obj); n = fscanf(ffp, " %d %d %d %f %d %d %d %d %d %f %f %f %f %f %f %f %f\n", &type, &style, &thickness, &dash_length, &direction, &f_arrow, &b_arrow, &arrow_ht, &arrow_wid, &x, &y, &x1, &y1, &dummy, &dummy, &x2, &y2); if (n != 17) { fprintf(stderr, "Arc (object #%d) is incomplete\n", num_obj); fscanf(ffp, " %[^\n]", text); /* skip to next line */ break; } if (direction == 1) { SWITCH(float, x1, x2); SWITCH(float, y1, y2); SWITCH(int, f_arrow, b_arrow); } dx1 = x1 - x; dy1 = y1 - y; dx2 = x2 - x; dy2 = y2 - y; rtop(dx1, dy1, &r1, &th1); rtop(dx2, dy2, &r2, &th2); theta = th1 - th2; if (theta > 0) theta -= 360; MINMAX(x1, y1); MINMAX(x2, y2); for (t = 0; t > theta * acos(0.0) / 90; t -= .1) MINMAX(x + r1 * cos(th1+t), y + r1 * sin(th1+t)); x = x / PIX_PER_INCH; /* (x,y) is the center of the arc */ y = (CANVAS_HEIGHT - y) / PIX_PER_INCH; x1 = x1 / PIX_PER_INCH; y1 = (CANVAS_HEIGHT - y1) / PIX_PER_INCH; x2 = x2 / PIX_PER_INCH; y2 = (CANVAS_HEIGHT - y2) / PIX_PER_INCH; if (b_arrow) setarrow(tfp, ((float)arrow_wid)/PIX_PER_INCH, ((float)arrow_ht)/PIX_PER_INCH, x1+(y1-y), y1-(x1-x), x1, y1); if (f_arrow) setarrow(tfp, ((float)arrow_wid)/PIX_PER_INCH, ((float)arrow_ht)/PIX_PER_INCH, x2-(y2-y), y2+(x2-x), x2, y2); setstyle(style, dash_length); fprintf(tfp, "\\circulararc %6.3f degrees from %6.3f %6.3f center at %6.3f %6.3f\n", theta, x1, y1, x, y); break; case POLYLINE : num_obj++; fprintf(tfp, "%%\n%% Fig POLYLINE object (#%d)\n%%\n", num_obj); n = fscanf(ffp, " %d %d %d %f %d %d %d %d", &type, &style, &thickness, &dash_length, &f_arrow, &b_arrow, &arrow_ht, &arrow_wid); if (n != 8) { fprintf(stderr, "Line (object #%d) is incomplete\n", num_obj); fscanf(ffp, " %[^\n]", text); /* skip to next line */ break; } if (fscanf(ffp, " %f %f %f %f", &x1, &y1, &x2, &y2) != 4) { fprintf(stderr, "Line (object #%d) is incomplete\n", num_obj); fscanf(ffp, " %[^\n]", text); /* skip to next line */ break; }; MINMAX(x1, y1); x1 = x1 / PIX_PER_INCH; y1 = (CANVAS_HEIGHT - y1) / PIX_PER_INCH; if (x2 == 9999 && y2 == 9999) { /* A single point line */ fprintf(tfp, "\\plot %6.3f %6.3f %6.3f %6.3f/\n", x1, y1, x1, y1); break; } MINMAX(x2, y2); x2 = x2 / PIX_PER_INCH; y2 = (CANVAS_HEIGHT - y2) / PIX_PER_INCH; if (b_arrow) setarrow(tfp, ((float)arrow_wid)/PIX_PER_INCH, ((float)arrow_ht)/PIX_PER_INCH, x2, y2, x1, y1); setstyle(style, dash_length); putline(x1, y1, x2, y2); for (;;) { if (fscanf(ffp, " %f %f", &x, &y) != 2) { fprintf(stderr, "Line (object #%d) is incomplete\n", num_obj); fscanf(ffp, "%*[^\n]"); /* Flush the buffer */ break; }; if (x == 9999) break; MINMAX(x, y); x = x / PIX_PER_INCH; y = (CANVAS_HEIGHT - y) / PIX_PER_INCH; putline(x2, y2, x, y); x1 = x2; y1 = y2; x2 = x; y2 = y; } if (f_arrow) setarrow(tfp, ((float)arrow_wid)/PIX_PER_INCH, ((float)arrow_ht) /PIX_PER_INCH, x1, y1, x2, y2); break; case SPLINE : num_obj++; fprintf(tfp, "%%\n%% Fig SPLINE object (#%d)\n%%\n", num_obj); n = fscanf(ffp, " %d %d %d %f %d %d %d %d", &type, &style, &thickness, &dash_length, &f_arrow, &b_arrow, &arrow_ht, &arrow_wid); if (n != 8) { fprintf(stderr, "Spline (object #%d) is incomplete\n", num_obj); fscanf(ffp, " %[^\n]", text); /* skip to next line */ break; } if (fscanf(ffp, " %f %f %f %f", &x1, &y1, &x2, &y2) != 4) { fprintf(stderr, "Spline (object #%d) is incomplete\n", num_obj); fscanf(ffp, " %[^\n]", text); /* skip to next line */ break; }; MINMAX(x1, y1); MINMAX(x2, y2); y1 = (CANVAS_HEIGHT - y1); y2 = (CANVAS_HEIGHT - y2); if (b_arrow) setarrow(tfp, ((float)arrow_wid)/PIX_PER_INCH, ((float)arrow_ht)/PIX_PER_INCH, x2/PIX_PER_INCH, y2/PIX_PER_INCH, x1/PIX_PER_INCH, y1/PIX_PER_INCH); setstyle(style, dash_length); cx1 = (x1 + x2) / 2; cy1 = (y1 + y2) / 2; cx2 = (x1 + 3 * x2) / 4; cy2 = (y1 + 3 * y2) / 4; if (type == DRAW_SPLINE) fprintf(tfp, "\\plot %6.3f %6.3f %6.3f %6.3f\n", x1/PIX_PER_INCH, y1/PIX_PER_INCH, cx1/PIX_PER_INCH, cy1/PIX_PER_INCH); else fprintf(tfp, "\\plot \n"); /* save closure point for close splines */ xsav = x2; ysav = y2; for (n=2;;n++) { if (fscanf(ffp, " %f %f", &x, &y) != 2) { fprintf(stderr, "Spline (object #%d) is incomplete\n", num_obj); fscanf(ffp, "%*[^\n]"); /* Flush the buffer */ break; }; if (x == 9999) break; MINMAX(x, y); y = (CANVAS_HEIGHT - y); x1 = x2; y1 = y2; x2 = x; y2 = y; cx3 = (3 * x1 + x2) / 4; cy3 = (3 * y1 + y2) / 4; cx4 = (x1 + x2) / 2; cy4 = (y1 + y2) / 2; chaikin_spline(cx1, cy1, cx2, cy2, cx3, cy3, cx4, cy4); cx1 = cx4; cy1 = cy4; cx2 = (x1 + 3 * x2) / 4; cy2 = (y1 + 3 * y2) / 4; } if (type == DRAW_SPLINE) fprintf(tfp, "\t%6.3f %6.3f /\n", (int)x2/PIX_PER_INCH, (int)y2/PIX_PER_INCH); else { fprintf(tfp, "\t/\n\\plot\n"); x1 = x2; y1 = y2; x2 = xsav; y2 = ysav; cx3 = (3 * x1 + x2) / 4; cy3 = (3 * y1 + y2) / 4; cx4 = (x1 + x2) / 2; cy4 = (y1 + y2) / 2; chaikin_spline(cx1, cy1, cx2, cy2, cx3, cy3, cx4, cy4); fprintf(tfp, "\t/\n"); } if (f_arrow) setarrow(tfp, ((float)arrow_wid)/PIX_PER_INCH, ((float)arrow_ht) /PIX_PER_INCH, x1/PIX_PER_INCH, y1/PIX_PER_INCH, x2/PIX_PER_INCH, y2/PIX_PER_INCH); break; case ELLIPSE : num_obj++; fprintf(tfp, "%%\n%% Fig ELLIPSE object (#%d)\n%%\n", num_obj); n = fscanf(ffp, " %d %d %d %f %d %f %f %f %f %f %f %f %f\n", &type, &style, &thickness, &dash_length, &direction, &x, &y, &a, &b, &dummy, &dummy, &dummy, &dummy); if (n != 13) { fprintf(stderr, "Ellipse (object #%d) is incomplete\n", num_obj); fscanf(ffp, " %[^\n]", text); /* skip to next line */ break; } setstyle(style, dash_length); MINMAX(x+a, y); MINMAX(x-a, y); MINMAX(x, y+b); MINMAX(x, y-b); x = x / PIX_PER_INCH; y = (CANVAS_HEIGHT - y) / PIX_PER_INCH; width = a / PIX_PER_INCH; height = b / PIX_PER_INCH; if (!latexcircle(width, height, x, y)) fprintf(tfp, "\\iffalse "); fprintf(tfp, "\\else\n"); fprintf(tfp, "\\ellipticalarc axes ratio %6.3f:%-6.3f 360 degrees \n", width, height); fprintf(tfp, "\tfrom %6.3f %6.3f center at %6.3f %6.3f\n", x+width, y, x, y); fprintf(tfp, "\\fi\n"); break; case TEXT : num_obj++; fprintf(tfp, "%%\n%% Fig TEXT object (#%d)\n%%\n", num_obj); n = fscanf(ffp, "%d %d %d %f %f %f %f %[^\n]", &font, &size, &style, &height, &length, &x, &y, text); if (n != 8) { fprintf(stderr, "Text (object #%d) is incomplete\n", num_obj); fscanf(ffp, " %[^\n]", text); /* skip to next line */ break; } MINMAX(x,y); MINMAX(x+length, y-height) x = x / PIX_PER_INCH; y = (CANVAS_HEIGHT - y) / PIX_PER_INCH; if (arb) /* arbitrary tex needs no hbox */ fprintf(tfp, "\\put {%s %s} [lB] at %6.3f %6.3f\n", textfont, text, x, y); else fprintf(tfp, "\\put {\\hbox to %6.3fin{%s %s}} [lB] at %6.3f %6.3f\n", length/PIX_PER_INCH, textfont, text, x, y); break; case COMPOUND : fscanf(ffp, " %[^\n]", text); /* ignore the rest */ default : break; } } fprintf(tfp, "\\fi\n"); fprintf(tfp, "\\linethickness=0pt\n"); fprintf(tfp, "\\putrectangle corners at %6.3f %6.3f and %6.3f %6.3f\n", min_x/PIX_PER_INCH,(CANVAS_HEIGHT-max_y)/PIX_PER_INCH, max_x/PIX_PER_INCH,(CANVAS_HEIGHT-min_y)/PIX_PER_INCH); fprintf(tfp, "\\endpicture}\n"); } /* * putline - use rules if possible */ putline (start_x, start_y, end_x, end_y) float start_x, start_y, end_x, end_y; { if (cur_style == SOLID_LINE && (CLOSE (start_x, end_x) || CLOSE (start_y, end_y))) fprintf(tfp, "\\putrule from %6.3f %6.3f to %6.3f %6.3f\n", start_x, start_y, end_x, end_y); else { if (!latexline(start_x, start_y, end_x, end_y)) fprintf(tfp, "\\iffalse\n"); fprintf(tfp, "\\else\n"); fprintf(tfp, "\\plot %6.3f %6.3f %6.3f %6.3f /\n", start_x, start_y, end_x, end_y); fprintf(tfp, "\\fi\n"); } } /* * setstyle - issue style commands as appropriate */ setstyle(style, dash_length) int style; float dash_length; { switch (style) { case SOLID_LINE: if (cur_style == SOLID_LINE) break; fprintf(tfp, "\\setsolid\n"); break; case DASH_LINE: if (cur_style == DASH_LINE && cur_dashlength == dash_length) break; fprintf(tfp, "\\setdashes <%7.4fin>\n",dash_length / PIX_PER_INCH); break; case DOTTED_LINE: if (cur_style == DOTTED_LINE) break; fprintf(tfp, "\\setdots \n"); break; } cur_style = style; cur_dashlength = dash_length; } /* * setarrow - construct an arrow from a given direction */ setarrow(tfp, w, l, ex, ey, ax, ay) FILE *tfp; float w, l, ex, ey, ax, ay; { float L, beta, gamma; L = hypot(ex - ax, ey - ay); ex = (ax + .01*(ex - ax)/L); ey = (ay + .01*(ey - ay)/L); gamma = w/l; beta = gamma/2; setstyle(SOLID_LINE, 0.0); fprintf(tfp, "\\arrow <%6.3fin> [%6.3f,%6.3f] from %6.3f %6.3f to %6.3f %6.3f\n", l*mag, beta, gamma, ex, ey, ax, ay); } /* * rtop - rectangular to polar conversion */ rtop(x, y, r, th) double x, y, *r, *th; { *r = hypot(x,y); *th = acos(x/(*r)) * 90 /acos(0.0); if (y < 0) *th = 360 - *th; } /**************************************************************************** The following spline drawing routine is from "An Algorithm for High-Speed Curve Generation" by George Merrill Chaikin, Computer Graphics and Image Processing, 3, Academic Press, 1974, 346-349. and "On Chaikin's Algorithm" by R. F. Riesenfeld, Computer Graphics and Image Processing, 4, Academic Press, 1975, 304-310. *****************************************************************************/ chaikin_spline(x1, y1, x2, y2, x3, y3, x4, y4) float x1, y1, x2, y2, x3, y3, x4, y4; { float xmid, ymid; xmid = (x2 + x3) / 2; ymid = (y2 + y3) / 2; if (fabs(x1 - xmid) < 1 && fabs(y1 - ymid) < 1) draw_vector(x1, y1, xmid, ymid); else { chaikin_spline(x1, y1, ((x1 + x2) / 2), ((y1 + y2) / 2), ((3*x2 + x3) / 4), ((3*y2 + y3) / 4), xmid, ymid); } if (fabs(xmid - x4) < 1 && fabs(ymid - y4) < 1) { draw_vector(xmid, ymid, x4, y4); } else { chaikin_spline(xmid, ymid, ((x2 + 3*x3) / 4), ((y2 + 3*y3) / 4), ((x3 + x4) / 2), ((y3 + y4) / 2), x4, y4); } } draw_vector(x1, y1, x2, y2) float x1, y1, x2, y2; { fprintf(tfp, "\t%6.3f %6.3f\n", x2 / PIX_PER_INCH, y2 / PIX_PER_INCH); } /******************************************************************** LaTeX Object Optimizer Routines ********************************************************************/ /* * Slopes implemented in LaTeX and the corresponding args to \line */ float slopes[][2]= { {0.,1.}, {1.,1.},{2.,1.},{3.,1.},{4.,1.},{5.,1.},{6.,1.}, {1.,2.}, {3.,2.}, {5.,2.}, {1.,3.},{2.,3.}, {4.,3.},{5.,3.}, {1.,4.}, {3.,4.}, {5.,4.}, {1.,5.},{2.,5.},{3.,5.},{4.,5.},{6.,5.}, {1.,6.}, {5.,6.}, {-1.,0.}}; float upslope[2]={1.,0.}, downslope[2]={-1.,0.}; /* * latexline - generate a LaTeX line if possible */ latexline(x1, y1, x2, y2) float x1, y1, x2, y2; { float *lineargs; float len, sl, t, delta; int sign = 1; int i; if (cur_style != SOLID_LINE) return(0); if (CLOSE(x1, x2)) { len = fabs(y2-y1); if (y2 > y1) lineargs = upslope; else { lineargs = downslope; } } else { if (x2 < x1) { SWITCH(float, x1, x2); SWITCH(float, y1, y2); } len = x2 - x1; if (len*mag < 1/7.) return(0); sl = (y2 - y1) / (x2 - x1); if (sl < 0) { sl = -sl; sign = -1; } for (i=0, delta=1.0; slopes[i][0] >= 0; i++) if ((t = fabs(atan(sl) - atan(slopes[i][0]/slopes[i][1]))) < delta) { delta = t; lineargs = slopes[i]; } } if (CLOSE(delta, 0.0)) { fprintf(tfp, "\\if \\picturemode \\optpics\n"); fprintf(tfp,"\\put {\\line(%.0f,%.0f){%6.3f}} [Bl] at %6.3f %6.3f\n", lineargs[1], sign*lineargs[0], len, x1, y1); return(1); } else return(0); } /* * latexcircle - generate a LaTeX circle if possible */ latexcircle(w, h, x, y) float w, h, x, y; { if (cur_style != SOLID_LINE) return(0); if (!CLOSE(w, h)) return(0); if (2*w > 15.5/72.27) return(0); fprintf(tfp, "\\if \\picturemode \\optpics\n"); fprintf(tfp, "\\put {\\circle{%6.3f}} [lB] at %6.3f %6.3f\n", 2*w, x, y); return(1); } @ 1.12 log @use rules when possible,even when not optimizing @ text @d425 3 d433 1 a433 1 mag*length/PIX_PER_INCH, textfont, text, x, y); d436 1 a436 1 mag*length/PIX_PER_INCH, textfont, text, x, y); d519 1 a519 1 gamma = (w+0.0)/l; @ 1.11 log @close splines work now ., @ text @d67 1 a67 1 linethick = ".07pt"; d233 1 a233 1 fprintf(tfp, "\\plot %6.3f %6.3f %6.3f %6.3f /\n", a242 1 d250 2 a251 7 if (!latexline(x1, y1, x2, y2)) fprintf(tfp, "\\iffalse\n"); fprintf(tfp, "\\else\n"); fprintf(tfp, "\\plot %6.3f %6.3f %6.3f %6.3f /\n", x1, y1, x2, y2); fprintf(tfp, "\\fi\n"); d266 1 a266 6 if (!latexline(x2, y2, x, y)) fprintf(tfp, "\\iffalse "); fprintf(tfp, "\\else\n"); fprintf(tfp, "\\plot %6.3f %6.3f %6.3f %6.3f /\n", x2, y2, x, y); fprintf(tfp, "\\fi\n"); d450 22 @ 1.10 log @added some pretty printing @ text @d60 1 a60 1 float x, y, x1, y1, x2, y2; d330 12 a341 4 fprintf(tfp, "\\plot %6.3f %6.3f %6.3f %6.3f \n", x1/PIX_PER_INCH, y1/PIX_PER_INCH, cx1/PIX_PER_INCH, cy1/PIX_PER_INCH); a351 1 d363 9 a371 2 fprintf(tfp, "\t%6.3f %6.3f /\n", (int)x2/PIX_PER_INCH, (int)y2/PIX_PER_INCH); d373 4 @ 1.9 log @Adjusted splines for greater resolution (300 BPI for printing) @ text @d108 1 a108 1 exit(); d114 1 a114 1 exit(); d148 2 a161 2 setstyle(style, dash_length); d198 3 d207 3 a220 2 setstyle(style, dash_length); d233 1 a233 1 fprintf(tfp, "\plot %6.3f,%6.3f %6.3f,%6.3f\n", d249 2 d254 1 a254 1 fprintf(tfp, "\\setlinear \\plot %6.3f %6.3f %6.3f %6.3f /\n", d285 4 a288 5 if (f_arrow) setarrow(tfp, ((float)arrow_wid)/PIX_PER_INCH, ((float)arrow_ht) /PIX_PER_INCH, x1, y1, x2, y2); d294 3 a306 2 setstyle(style, dash_length); d326 1 d356 1 a356 1 fprintf(tfp, "\t%6.3f %6.3f /", d368 3 d396 4 a399 2 fprintf(tfp, "\\ellipticalarc axes ratio %6.3f:%-6.3f 360 degrees from %6.3f %6.3f center at %6.3f %6.3f\n", width, height, x+width, y, x, y); d406 3 d489 1 @ 1.8 log @splines integrated more cleanly @ text @a11 1 * Problems: rendering of splines (PicTeX uses quadratic) d324 2 a325 2 (int)x1/PIX_PER_INCH, (int)y1/PIX_PER_INCH, round(cx1)/PIX_PER_INCH, round(cy1)/PIX_PER_INCH); d515 2 a516 2 if (fabs(x1 - xmid) < 3 && fabs(y1 - ymid) < 3) draw_vector(round(x1), round(y1), round(xmid), round(ymid)); d524 2 a525 2 if (fabs(xmid - x4) < 3 && fabs(ymid - y4) < 3) { draw_vector(round(xmid), round(ymid), round(x4), round(y4)); d536 1 a536 1 int x1, y1, x2, y2; d539 1 a539 1 (float)x2 / PIX_PER_INCH, (float)y2 / PIX_PER_INCH); @ 1.7 log @splines work @ text @d268 1 a268 1 fprintf(tfp, "\\iffalse\n"); d324 3 a326 1 draw_vector((int)x1, (int)y1, round(cx1), round(cy1)); d350 2 a351 1 draw_vector(round(cx1), round(cy1), (int)x2, (int)y2); d385 1 a385 1 fprintf(tfp, "\\iffalse\n"); d539 1 a539 2 fprintf(tfp, "\\plot %6.3f %6.3f %6.3f %6.3f /\n", (float)x1 / PIX_PER_INCH, (float)y1 / PIX_PER_INCH, @ 1.6 log @some optimizer changes: remove point massaging @ text @d19 2 d62 1 a62 1 float ox, oy, ox1, oy1, ox2, oy2; d130 1 a130 1 mag, mag); d133 1 d230 1 a230 1 fprintf(tfp, "\setlinear\n\plot %6.3f,%6.3f %6.3f,%6.3f\n", d270 1 a270 1 fprintf(tfp, "\\setlinear \\plot %6.3f %6.3f %6.3f %6.3f /\n", d312 2 a313 4 x1 = x1 / PIX_PER_INCH; y1 = (CANVAS_HEIGHT - y1) / PIX_PER_INCH; x2 = x2 / PIX_PER_INCH; y2 = (CANVAS_HEIGHT - y2) / PIX_PER_INCH; d318 2 a319 1 x2, y2, x1, y1); a320 1 fprintf(tfp, "\\setquadratic \\plot %6.3f %6.3f %6.3f %6.3f", d322 3 a324 1 x1, y1, x2, y2); d337 1 a337 2 x = x / PIX_PER_INCH; y = (CANVAS_HEIGHT - y) / PIX_PER_INCH; d339 8 a346 1 fprintf(tfp, "\n\t %6.3f %6.3f", x, y); d348 1 a348 6 x1 = x2; y1 = y2; x2 = x; y2 = y; } if (!(n%2)) fprintf(stderr, "Spline (ojbect #%d) has an even number of point\n", num_obj); a349 2 fprintf(tfp, " /\n"); d353 2 a354 1 x1, y1, x2, y2); d476 1 d489 58 @ 1.5 log @some fixes @ text @d2 1 a2 1 * F2t : The fig-to-PicTeX translator a35 3 #define GRAN 32 #define MASSAGE(X) {X = rint(X * GRAN) / GRAN;} a242 1 fprintf(tfp, "\\if \\picturemode \\optpics\n"); d244 1 a244 3 fprintf(tfp, "\\setlinear \\plot %6.3f %6.3f %6.3f %6.3f /\n", x1, y1, x2, y2); a263 1 fprintf(tfp, "\\if \\picturemode \\optpics\n"); d265 1 a265 2 fprintf(tfp, "\\setlinear \\plot %6.3f %6.3f %6.3f %6.3f /\n", x2, y2, x, y); a377 1 fprintf(tfp, "\\if \\picturemode \\optpics\n"); d379 1 a379 2 fprintf(tfp, "\\ellipticalarc axes ratio %6.3f:%-6.3f 360 degrees from %6.3f %6.3f center at %6.3f %6.3f\n", width, height, x+width, y, x, y); d446 1 a446 1 fprintf(tfp, "\\setdots \n", dash_length / PIX_PER_INCH); a510 5 MASSAGE(x1); MASSAGE(y1); MASSAGE(x2); MASSAGE(y2); d548 1 a548 1 a563 5 MASSAGE(w); MASSAGE(h); MASSAGE(x); MASSAGE(y); d568 1 @ 1.4 log @makes optimization a run-time option, along with dotted and noplot output now needs fig2tex.tex to work right @ text @d36 2 a37 2 #define GRAN (PIX_PER_INCH/32.) #define MASSAGE(X) {X = rint(X / GRAN) * GRAN;} d56 1 a56 1 int size, type, style, thickness, direction; d75 1 a75 1 while ((c = getopt(argc, argv, "dnOf:l:p:m:")) != EOF) d79 3 d129 1 a129 1 fprintf(tfp, "\\beginpicture\n"); d276 1 a276 1 x1, y1, x2, y2); d410 3 a412 1 fprintf(tfp, "\\put {\\hbox to %6.3fin{%s %s}} [lB] at %6.3f %6.3f\n", d414 3 d431 1 a431 1 fprintf(tfp, "\\endpicture\n"); a443 1 fprintf(tfp, "\\if \\picturemode \\pics\n"); a444 1 fprintf(tfp, "\\fi\n"); a449 1 fprintf(tfp, "\\if \\picturemode \\pics\n"); a450 1 fprintf(tfp, "\\fi\n"); a455 1 fprintf(tfp, "\\if \\picturemode \\pics\n"); a456 1 fprintf(tfp, "\\fi\n"); @ 1.3 log @fixed text placement and spacing problems @ text @d36 3 a46 1 int alldots, noplot, optimize; d63 1 a66 1 alldots = noplot = optimize = 0; a78 12 case 'd': /* all plotting in dots */ alldots = 1; break; case 'n': /* no plotting */ noplot = 1; break; case 'O': /* no plotting */ optimize = 1; break; a130 4 if (optimize) { fprintf(tfp, "\\unitlength=%6.3fin\n", mag); fprintf(tfp, "\\thicklines\n"); } d132 8 d158 1 a158 1 setstyle(alldots? DOTTED_LINE:style, dash_length); a175 4 if (optimize) { massage(&x1, &y1); massage(&x2, &y2); } d188 10 a197 12 if (!noplot) { if (b_arrow) setarrow(tfp, alldots, ((float)arrow_wid)/PIX_PER_INCH, ((float)arrow_ht)/PIX_PER_INCH, x1+(y1-y), y1-(x1-x), x1, y1); if (f_arrow) setarrow(tfp, alldots, ((float)arrow_wid)/PIX_PER_INCH, ((float)arrow_ht)/PIX_PER_INCH, x2-(y2-y), y2+(x2-x), x2, y2); fprintf(tfp, "\\circulararc %6.3f degrees from %6.3f %6.3f center at %6.3f %6.3f\n", theta, x1, y1, x, y); } d213 1 a213 1 setstyle(alldots? DOTTED_LINE:style, dash_length); a221 1 if (optimize) massage(&x1, &y1); d227 3 a229 4 if (!noplot) fprintf(tfp, "\setlinear\n\plot %6.3f,%6.3f %6.3f,%6.3f\n", x1, y1, x1, y1); break; a231 1 if (optimize) massage(&x2, &y2); a236 1 if (!noplot) { d238 7 a244 5 if (b_arrow) setarrow(tfp, alldots, ((float)arrow_wid)/PIX_PER_INCH, ((float)arrow_ht)/PIX_PER_INCH, x2, y2, x1, y1); if (!optimize || !latexline(x1, y1, x2, y2)) d247 5 a251 1 } a261 1 if (optimize) massage(&x, &y); d267 8 a274 4 if (!noplot) if (!optimize || !latexline(x2, y2, x, y)) fprintf(tfp, "\\setlinear \\plot %6.3f %6.3f %6.3f %6.3f /\n", x2, y2, x, y); d282 2 a283 2 if (!noplot && f_arrow) setarrow(tfp, alldots, d302 1 a302 1 setstyle(alldots? DOTTED_LINE:style, dash_length); a310 4 if (optimize) { massage(&x1, &y1); massage(&x2,&y2); } d319 1 a319 3 if (!noplot) { if (b_arrow) setarrow(tfp, alldots, a322 1 fprintf(tfp, "\\setquadratic \\plot %6.3f %6.3f %6.3f %6.3f", d324 2 a326 1 } a336 1 if (optimize) massage(&x, &y); d342 1 a342 1 if (!noplot) fprintf(tfp, "\n\t %6.3f %6.3f", x, y); d351 1 a351 1 if (!noplot) { d353 1 a353 2 fprintf(tfp, " /\n"); if (f_arrow) setarrow(tfp, alldots, a356 1 } d372 1 a372 1 setstyle(alldots? DOTTED_LINE:style, dash_length); a373 4 if (optimize) { massage(&x, &y); massage(&a, &b); } d383 2 a384 2 if (!noplot) if (!optimize || !latexcircle(width, height, x, y)) d386 6 a391 1 width, height, x+width, y, x, y); d418 1 d436 1 d438 1 d444 1 d446 1 d452 1 d454 1 d465 1 a465 1 setarrow(tfp, d, w, l, ex, ey, ax, ay) a466 1 int d; a470 6 if (d) { fprintf(tfp, "\\put {\\tt *} at %6.3f %6.3f\n", ax, ay); return; } a492 9 /* * massage - round coordinates to nearest 1/16 of inch */ massage(xp, yp) float *xp, *yp; { *xp = rint(*xp * (32 / PIX_PER_INCH)) * (PIX_PER_INCH / 32); *yp = rint(*yp * (32 / PIX_PER_INCH)) * (PIX_PER_INCH / 32); } d497 8 a504 8 float slopes[] = { 0., 1/1., 2/1., 3/1., 4/1., 5/1., 6/1., 1/2., 3/2., 5/2., 1/3., 2/3., 4/3., 5/3., 1/4., 3/4., 5/4., 1/5., 2/5., 3/5., 4/5., 6/5., 1/6., 5/6. -1.}; d506 1 a507 9 char *args[] = { "1,0", "1,1", "1,2", "1,3", "1,4", "1,5", "1,6", "2,1", "2,3", "2,5", "3,1", "3,2", "3,4", "3,5", "4,1", "4,3", "4,5", "5,1", "5,2", "5,3", "5,4", "5,6", "6,1", "6,5"}; d514 1 a514 2 char *lineargs = (char *)0; char *sign = " "; d516 1 d519 4 a522 1 if ((cur_style != SOLID_LINE) && !alldots) return(0); d524 2 d531 1 a531 1 lineargs = "0,1"; d533 1 a533 2 lineargs = "0,1"; sign = "-"; d549 1 a549 1 sign = "-"; d552 3 a554 2 for (i=0, delta=1.0; slopes[i] >= 0; i++) if ((t = fabs(atan(sl) - atan(slopes[i]))) < delta) { d556 1 a556 1 lineargs = args[i]; d562 2 a563 2 fprintf(tfp,"\\put {\\line(%c,%s%c){%6.3f}} [Bl] at %6.3f %6.3f\n", lineargs[0], sign, lineargs[2], len, x1, y1); d577 6 a582 1 if ((cur_style != SOLID_LINE) && !alldots) return(0); @ 1.2 log @Beta distribution version @ text @a46 18 float slopes[] = { 0., 1/1., 2/1., 3/1., 4/1., 5/1., 6/1., 1/2., 3/2., 5/2., 1/3., 2/3., 4/3., 5/3., 1/4., 3/4., 5/4., 1/5., 2/5., 3/5., 4/5., 6/5., 1/6., 5/6. -1.}; char *args[] = { "1,0", "1,1", "1,2", "1,3", "1,4", "1,5", "1,6", "2,1", "2,3", "2,5", "3,1", "3,2", "3,4", "3,5", "4,1", "4,3", "4,5", "5,1", "5,2", "5,3", "5,4", "5,6", "6,1", "6,5"}; d66 1 a66 1 textfont = "\\tt"; d422 2 a423 2 fprintf(tfp, "\\put {%s %s} [lb] at %6.3f %6.3f\n", textfont, text, x, y); d519 22 d608 1 a608 1 fprintf(tfp, "\\put {\\circle{%6.3f}} [Bl] at %6.3f %6.3f\n", @ 1.1 log @Initial revision @ text @d22 5 a26 4 #define MINMAX(X,Y) { min_x = min(X, min_x); \ min_y = min(Y, min_y); \ max_x = max(X, max_x); \ max_y = max(Y, max_y); } d28 5 d34 1 a34 1 #define CLOSE(a,b) (fabs(a-b) < EPSILON) d73 1 a73 1 int n, num_obj, first, font, object; d77 1 a77 1 float a, b, sx, sy, ex, ey; d134 1 a134 1 printf("Couldn't open %s\n", from); d140 1 a140 1 printf("Couldn't open %s\n", to); d176 1 a176 1 printf("Arc object (object #%d) is incomplete\n", d185 3 a187 11 t = x1; x1 = x2; x2 = t; t = y1; y1 = y2; y2 = t; n = f_arrow; f_arrow = b_arrow; b_arrow = n; d237 1 a237 1 printf("Line object (object #%d) is incomplete\n", d246 2 a247 1 printf("incomplete line object\n"); d283 1 a283 1 printf("Line object (object #%d) is incomplete\n", d321 1 a321 1 printf("Spline object (object #%d) is incomplete\n", d330 2 a331 1 printf("incomplete spline object\n"); d359 1 a359 1 for (;;) { d361 1 a361 1 printf("Spline object (object #%d) is incomplete\n", d381 1 d400 1 a400 1 printf("Ellipse object (object #%d) is incomplete\n", d408 4 a411 1 if (optimize) massage(&x, &y, &a, &b); d433 1 a433 1 printf("Text object (object #%d) is incomplete\n", d543 1 a543 1 char *sign = ""; d563 2 a564 7 t = x1; x1 = x2; x2 = t; t = y1; y1 = y2; y2 = t; d602 1 a602 1 if (w > 15.5/72.27) return(0); d604 2 a605 1 fprintf(tfp, "\\put {\\circle{%6.3f}} at %6.3f %6.3f\n", 2*w, x, y); @