7 void line(int type, Point p1, Point p2, Attr *desc) /* draw a line segment */
9 fprintf(tfd, "%s %s from %s",
10 type==LINE ? "line" : "arrow", desc_str(desc), xyname(p1));
11 fprintf(tfd, " to %s", xyname(p2)); /* 'cause xyname is botched */
17 void circle(double r, Point pt) /* draw a circle */
20 fprintf(tfd, "circle rad %g at %s\n", r, xyname(pt));
22 fprintf(tfd, "\"\\s-3\\(ob\\s0\" at %s\n", xyname(pt));
26 char *xyname(Point pt) /* generate xy name macro for point p */
34 ERROR "can't take log of x coord %g", pt.x FATAL;
39 ERROR "can't take log of y coord %g", pt.y FATAL;
42 sprintf(buf, "xy_%s(%g,%g)", p->name, pt.x, pt.y);
43 return buf; /* WATCH IT: static */
46 void pic(char *s) /* fire out pic stuff directly */
50 fprintf(tfd, "%s\n", s);
53 int auto_x = 0; /* counts abscissa if none provided */
55 void numlist(void) /* print numbers in default way */
60 static char *spot = "\\(bu";
63 p = pt.obj = lookup(curr_coord, 1);
70 if (p->attr && p->attr->sval)
72 for (i = 1; i < nnum; i++) {
74 if (p->attr == 0 || p->attr->type == 0) {
75 ap = makesattr(tostring(spot));
83 void plot(Attr *sl, Point pt) /* put stringlist sl at point pt */
85 fprintf(tfd, "%s at %s\n", slprint(sl), xyname(pt));
90 void plotnum(double f, char *fmt, Point pt) /* plot value f at point */
98 sprintf(buf, "%g", f);
100 sprintf(buf, "\\-%g", -f);
101 fprintf(tfd, "\"%s\" at %s\n", buf, xyname(pt));
105 void drawdesc(int type, Obj *p, Attr *desc, char *s) /* set line description for p */
110 p->first = 0; /* so it really looks new */
115 void next(Obj *p, Point pt, Attr *desc) /* add component to a path */
121 fprintf(tfd, "L%s: %s\n", p->name, xyname(pt));
123 fprintf(tfd, "line %s from L%s to %s; L%s: Here\n",
124 desc_str(desc->type ? desc : p->attr),
125 p->name, xyname(pt), p->name);
127 if (p->attr && (s=p->attr->sval)) {
128 /* BUG: should fix size here */
129 fprintf(tfd, "\"%s\" at %s\n", s, xyname(pt));