Annotation of OpenXM_contrib/gnuplot/term/metafont.trm, Revision 1.1.1.2
1.1 maekawa 1: /*
1.1.1.2 ! maekawa 2: * $Id: metafont.trm,v 1.8 1998/12/15 20:21:41 lhecking Exp $
1.1 maekawa 3: */
4:
5: /* GNUPLOT - metafont.trm */
6:
7: /*[
8: * Copyright 1986 - 1993, 1998 Thomas Williams, Colin Kelley
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: * GNUPLOT -- mf.trm
39: *
40: * This terminal driver supports:
41: * Metafont Plot Commands
42: *
43: * Written by : Pl Hedne
44: * Trondheim, Norway
45: * Pal.Hedne@termo.unit.no
46: */
47:
48: /*
49: * Improvements and bug fixes by Carsten Steger:
50: * - Set default plot size to 5 by 3 inches as in the latex- and eepic-
51: * drivers
52: * - Fixed some bugs concerning resolution dependent output
53: * - Added MF_scale function
54: * - Added MF_justify_text function and modified MF_put_text function and
55: * put_text macro accordingly
56: * - Modified MF_move and MF_vector to make output shorter and modified
57: * MF_text accordingly
58: * - Added various linetypes by plotting dashed lines; had to modify
59: * MF_linetype and MF_vector for this
60: * - Added MF_arrow function
61: * - All global variables and #define'd names begin with MF_ now
62: * As a consequence almost nothing of the original code by Pl Hedne remains
63: * but credit goes to him for the ingenious trick of storing the character
64: * images into picture variables, without which this driver would have been
65: * impossible for me to write.
66: *
67: * 10/03/95: Converted to new terminal layout by Carsten Steger.
68: */
69:
70: #include "driver.h"
71:
72: #ifdef TERM_REGISTER
73: register_term(mf)
74: #endif
75:
76: #ifdef TERM_PROTO
77:
78: #define MF_DPI (300)
79: /* resolution of printer we expect to use; the value itself is not
80: * particularly important... it is here only for compatibility to the
81: * LaTeX-driver and to get the spacing right. */
82:
83: /* 5 inches wide by 3 inches high (default) */
84: #define MF_XSIZE 5.0
85: #define MF_YSIZE 3.0
86: #define MF_XMAX (MF_XSIZE*MF_DPI)
87: #define MF_YMAX (MF_YSIZE*MF_DPI)
88:
89: #define MF_HTIC (5*MF_DPI/72)
90: #define MF_VTIC (5*MF_DPI/72)
91: #define MF_HCHAR (MF_DPI*53/10/72)
92: #define MF_VCHAR (MF_DPI*11/72)
93:
94: TERM_PUBLIC void MF_init __PROTO((void));
95: TERM_PUBLIC void MF_graphics __PROTO((void));
96: TERM_PUBLIC void MF_text __PROTO((void));
97: TERM_PUBLIC int MF_justify_text __PROTO((enum JUSTIFY mode));
98: TERM_PUBLIC int MF_text_angle __PROTO((int ang));
99: TERM_PUBLIC void MF_linetype __PROTO((int linetype));
100: TERM_PUBLIC void MF_move __PROTO((unsigned int x, unsigned int y));
101: TERM_PUBLIC void MF_vector __PROTO((unsigned int x, unsigned int y));
102: TERM_PUBLIC void MF_arrow __PROTO((unsigned int sx, unsigned int sy,
103: unsigned int ex, unsigned int ey,
104: TBOOLEAN head));
105: TERM_PUBLIC void MF_put_text __PROTO((unsigned int x, unsigned int y, char *str));
106: TERM_PUBLIC void MF_reset __PROTO((void));
107:
108: #define GOT_MF_PROTO
109:
110: #endif /* TERM_PROTO */
111:
112:
113: #ifndef TERM_PROTO_ONLY
114:
115: #ifdef TERM_BODY
116:
117:
118: /* Plot size in inches */
119: static double MF_xsize = MF_XSIZE;
120: static double MF_ysize = MF_YSIZE;
121: static int MF_char_code;
122: static int MF_ang;
123: static int MF_line_type;
124: static enum JUSTIFY MF_justify;
125: static double MF_dist_left;
126: static int MF_is_solid;
127: static int MF_picked_up_pen;
128: /*
129: * We keep track of where we are with respect to dashed lines by using
130: * the next five variables. MF_dash_index indicates which element of
131: * MF_lines[..].dashlen should be used. The MF_last.. variables keep
132: * track of the position of the pen.
133: */
134: static int MF_dash_index;
135: static unsigned int MF_last_x, MF_last_y;
136:
137: static struct {
138: int solid; /* Is the line solid? */
139: float thickness; /* Thickness of pen we are going to use */
140: int dashlen[4]; /* Length of individual segments; even: line; odd: gap */
141: } MF_lines[10] =
142: {
143: {
144: 1, 1.5, { 0, 0, 0, 0 }
145: },
146: {
147: 0, 1.0, { MF_DPI / 60, MF_DPI / 50, MF_DPI / 60, MF_DPI / 50 }
148: },
149: {
150: 1, 1.5, { 0, 0, 0, 0 }
151: },
152: {
153: 0, 1.5, { MF_DPI / 20, MF_DPI / 30, MF_DPI / 20, MF_DPI / 30 }
154: },
155: {
156: 0, 1.5, { MF_DPI / 30, MF_DPI / 20, MF_DPI / 30, MF_DPI / 20 }
157: },
158: {
159: 0, 1.5, { MF_DPI / 15, MF_DPI / 30, MF_DPI / 60, MF_DPI / 30 }
160: },
161: {
162: 0, 1.5, { MF_DPI / 30, MF_DPI / 50, MF_DPI / 30, MF_DPI / 50 }
163: },
164: {
165: 0, 1.5, { MF_DPI / 20, MF_DPI / 50, MF_DPI / 60, MF_DPI / 30 }
166: },
167: {
168: 0, 1.5, { MF_DPI / 30, MF_DPI / 50, MF_DPI / 30, MF_DPI / 30 }
169: },
170: {
171: 0, 1.5, { MF_DPI / 60, MF_DPI / 50, MF_DPI / 60, MF_DPI / 30 }
172: }
173: /* dash: line, gap, line, gap */
174: };
175:
176:
177:
178: TERM_PUBLIC void MF_init()
179: {
180: MF_char_code = 0;
181: MF_ang = 0;
182:
183: fputs("\
184: if unknown cmbase: input cmbase fi\n\n\
185: tracingstats:=1;\n\
186: picture r[];\n\
187: \ndef openit = openwindow currentwindow\n\
188: from (0,0) to (400,800) at (-50,500) enddef;\n\
189: \nmode_setup;\n", gpoutfile);
190:
191: fputs("\
192: \n%Include next eight lines if you have problems with the mode on your system..\n\
193: %proofing:=0;\n\
194: %fontmaking:=1;\n\
195: %tracingtitles:=0;\n\
196: %pixels_per_inch:=300;\n\
197: %blacker:=0;\n\
198: %fillin:=.2;\n\
199: %o_correction:=.6;\n\
200: %fix_units;\n", gpoutfile);
201:
202: /* Next lines must be included if text support is needed (CM base used) */
203: fputs("\
204: \ndef put_text(expr ts,xstart,ystart,rot,justification) =\n\
205: begingroup\n\
206: text_width:=0;text_height:=0;\n\
207: for ind:=0 step 1 until length(ts)-1:\n\
208: dec_num:=ASCII substring (ind,ind+1) of ts;\n\
209: if unknown r[dec_num]: dec_num:=32; fi\n\
210: if dec_num=32: \n\
211: text_width:=text_width+wd[65];\n\
212: text_height:=GPMAX(text_height,ht[65]+dp[65]);\n\
213: elseif dec_num>=0: \n\
214: text_width:=text_width+wd[dec_num];\n\
215: text_height:=GPMAX(text_height,ht[dec_num]+dp[dec_num]);\n\
216: fi\n\
217: endfor\n\
218: if rot=90:\n\
219: if justification=1: ynext:=ystart;\n\
220: elseif justification=2: ynext:=round(ystart-text_width/2);\n\
221: else: ynext:=round(ystart-text_width);\n\
222: fi\n\
223: xnext:=xstart+text_height/2;\n\
224: else:\n\
225: if justification=1: xnext:=xstart;\n\
226: elseif justification=2: xnext:=round(xstart-text_width/2);\n\
227: else: xnext:=round(xstart-text_width);\n\
228: fi\n\
229: ynext:=ystart-text_height/2;\n\
230: fi\n\
231: for ind:=0 step 1 until length(ts)-1:\n\
232: dec_num:=ASCII substring (ind,ind+1) of ts;\n\
233: if unknown r[dec_num]: dec_num:=32; fi\n\
234: if dec_num=32: \n\
235: xnext:=xnext+wd[65]*cosd rot;\n\
236: ynext:=ynext+wd[65]*sind rot;\n\
237: elseif dec_num>=0: \n\
238: currentpicture:=currentpicture+r[dec_num] shifted(xnext,ynext)\n\
239: rotatedaround ((xnext,ynext),rot); \n\
240: xnext:=xnext+wd[dec_num]*cosd rot;\n\
241: ynext:=ynext+wd[dec_num]*sind rot;\n\
242: fi\n\
243: endfor\n\
244: endgroup \n\
245: enddef;\n", gpoutfile);
246:
247: fputs("\
248: \ndef endchar =\n\
249: r[charcode]:=currentpicture;\n\
250: wd[charcode]:=w;ht[charcode]:=h;dp[charcode]:=d;\n\
251: message \"Picture of charcode no.\" & decimal charcode;\n\
252: endgroup;\n\
253: enddef;\n\
254: let endchar_ = endchar;\n\
255: let generate = relax;\n\
256: let roman = relax;\n", gpoutfile);
257:
258: fputs("\
259: input cmr10.mf\n\
260: if ligs>1: font_coding_scheme:=\"TeX text\";\n\
261: spanish_shriek=oct\"074\"; spanish_query=oct\"076\";\n\
262: else: font_coding_scheme:=\n\
263: if ligs=0: \"TeX typewriter text\"\n\
264: else: \"TeX text without f-ligatures\" fi;\n\
265: spanish_shriek=oct\"016\"; spanish_query=oct\"017\"; fi\n\
266: font_setup;\n\
267: input romanu.mf %Roman uppercase.\n\
268: input romanl.mf %Roman lowerrcase.\n\
269: input greeku.mf %Greek uppercase.\n\
270: input romand.mf %Numerals.\n\
271: input romanp.mf %Ampersand, question marks, currency sign.\n\
272: input romspl.mf %Lowercase specials (dotless \\i, ligature \\ae, etc.)\n\
273: input romspu.mf %Uppercase specials (\\AE, \\OE, \\O)\n\
274: input punct.mf %Punctuation symbols.\n\
275: \nminus=ASCII\"-\"; cmchar \"Minus sign\";\n\
276: beginarithchar(minus); \n\
277: pickup rule.nib;\n\
278: lft x1=hround 1.5u-eps;\n\
279: x2=w-x1; y1=y2=math_axis;\n\
280: draw z1--z2; % bar\n\
281: labels(1,2); \n\
282: endchar;\n", gpoutfile);
283:
284: fputs("\
285: \ncmchar \"Period\";\n\
286: numeric dot_diam#; dot_diam#:=if monospace: 5/4 fi\\ dot_size#;\n\
287: define_whole_blacker_pixels(dot_diam);\n\
288: beginchar(\".\",5u#,dot_diam#,0);\n\
289: adjust_fit(0,0); pickup fine.nib;\n\
290: pos1(dot_diam,0); pos2(dot_diam,90);\n\
291: lft x1l=hround(.5w-.5dot_diam); bot y2l=0; z1=z2; dot(1,2); % dot\n\
292: penlabels(1,2);\n\
293: endchar;\n", gpoutfile);
294:
295: fputs("\
296: \ndef endchar =\n\
297: % Next line should probably be removed if CM base is used\n\
298: l:=0; r:=w;\n\
299: %Include the next two lines if you want to\n\
300: %rotate the picture 90 deg.(Portrait to Landscape)\n\
301: %currentpicture:=currentpicture rotated 90 shifted (h,0);\n\
302: %tmp:=charht; charht:=charwd; charwd:=tmp;\n\
303: scantokens extra_endchar;\n\
304: if proofing>0: makebox(proofrule); fi\n\
305: chardx:=w;\n\
306: shipit;\n\
307: if displaying>0: makebox(screenrule); showit; fi\n\
308: endgroup \n\
309: enddef;\n\
310: let endchar_ = endchar;\n\
311: let generate = input;\n\
312: let roman = roman;\n", gpoutfile);
313:
314: /* font_size must be bigger than em#/16 by METAFONT rules.
315: * Therefore make it pretty big so big figures will be
316: * handled correctly. Setting font_size to 72pt# lets us
317: * handle characters up to 15.94 by 15.94 inches. */
318: fputs("\
319: \n\nfont_identifier:=\"GNUPLOT\";\n\
320: font_size 72pt#;\n\
321: th#=0.4pt#; define_whole_pixels(th);\n\
322: \npath arrowhead;\n\
323: arrowhead = (-7pt,-2pt){dir30}..(-6pt,0pt)..\
324: {dir150}(-7pt,2pt) &\n\
325: (-7pt,2pt)--(0pt,0pt)--(-7pt,-2pt) & cycle;\n", gpoutfile);
326: }
327:
328:
329: TERM_PUBLIC void MF_graphics()
330: {
331: register struct termentry *t = term;
332:
333: fprintf(gpoutfile, "\n\nbeginchar(%d,%gin#,%gin#,0);\n",
334: MF_char_code, MF_xsize, MF_ysize);
335: MF_char_code++;
336: fprintf(gpoutfile, "a:=w/%d;b:=h/%d;\n", t->xmax, t->ymax);
337: MF_picked_up_pen = 0;
338: }
339:
340:
341: TERM_PUBLIC void MF_text()
342: {
343: fputs("endchar;\n", gpoutfile);
344: }
345:
346:
347: TERM_PUBLIC int MF_justify_text(mode)
348: enum JUSTIFY mode;
349: {
350: MF_justify = mode;
351: return TRUE;
352: }
353:
354:
355: TERM_PUBLIC int MF_text_angle(ang)
356: int ang;
357: {
358: if (ang > 0)
359: MF_ang = 90;
360: else
361: MF_ang = 0;
362: return TRUE;
363: }
364:
365:
366: TERM_PUBLIC void MF_linetype(linetype)
367: int linetype;
368: {
369: if (linetype >= 8)
370: linetype %= 8;
371: linetype += 2;
372: /* Only output change in pens if it actually affects the pen used */
373: if ((MF_lines[linetype].thickness != MF_lines[MF_line_type].thickness) ||
374: (!MF_picked_up_pen)) {
375: fprintf(gpoutfile, "pickup pencircle scaled %gth;\n",
376: MF_lines[linetype].thickness);
377: MF_picked_up_pen = 1;
378: }
379: MF_line_type = linetype;
380: MF_dash_index = 0;
381: MF_dist_left = MF_lines[MF_line_type].dashlen[MF_dash_index];
382: MF_is_solid = MF_lines[MF_line_type].solid;
383: }
384:
385:
386: TERM_PUBLIC void MF_move(x, y)
387: unsigned int x, y;
388: {
389: MF_last_x = x;
390: MF_last_y = y;
391: MF_dash_index = 0;
392: MF_dist_left = MF_lines[MF_line_type].dashlen[MF_dash_index];
393: }
394:
395:
396: TERM_PUBLIC void MF_vector(x, y)
397: unsigned int x, y;
398: {
399: if (MF_is_solid) {
400: if (x == MF_last_x && y == MF_last_y)
401: fprintf(gpoutfile, "drawdot (%da,%db);\n", x, y);
402: else
403: fprintf(gpoutfile, "draw (%da,%db)--(%da,%db);\n",
404: MF_last_x, MF_last_y, x, y);
405: } else {
406: double dist_to_go, delta_x, delta_y, inc_x, inc_y;
407: double last_x_d, last_y_d, next_x_d, next_y_d;
408: unsigned int next_x, next_y;
409:
410: if (x == MF_last_x && y == MF_last_y) {
411: if (!(MF_dash_index & 1))
412: fprintf(gpoutfile, "drawdot (%da,%db);\n", x, y);
413: } else {
414: last_x_d = MF_last_x;
415: last_y_d = MF_last_y;
416: delta_x = x - last_x_d;
417: delta_y = y - last_y_d;
418: dist_to_go = sqrt(delta_x * delta_x + delta_y * delta_y);
419: inc_x = delta_x / dist_to_go;
420: inc_y = delta_y / dist_to_go;
421: while (MF_dist_left < dist_to_go) {
422: next_x_d = last_x_d + inc_x * MF_dist_left;
423: next_y_d = last_y_d + inc_y * MF_dist_left;
424: next_x = floor(next_x_d + 0.5);
425: next_y = floor(next_y_d + 0.5);
426: /* MF_dash_index & 1 == 0 means: draw a line; otherwise just move */
427: if (!(MF_dash_index & 1))
428: fprintf(gpoutfile, "draw (%da,%db)--(%da,%db);\n",
429: MF_last_x, MF_last_y, next_x, next_y);
430: MF_last_x = next_x;
431: MF_last_y = next_y;
432: last_x_d = next_x_d;
433: last_y_d = next_y_d;
434: dist_to_go -= MF_dist_left;
435: MF_dash_index = (MF_dash_index + 1) & 3;
436: MF_dist_left = MF_lines[MF_line_type].dashlen[MF_dash_index];
437: }
438: delta_x = x - last_x_d;
439: delta_y = y - last_y_d;
440: MF_dist_left -= sqrt(delta_x * delta_x + delta_y * delta_y);
441: if (!(MF_dash_index & 1)) {
442: if (x == MF_last_x && y == MF_last_y)
443: fprintf(gpoutfile, "drawdot (%da,%db);\n", x, y);
444: else
445: fprintf(gpoutfile, "draw (%da,%db)--(%da,%db);\n",
446: MF_last_x, MF_last_y, x, y);
447: }
448: }
449: }
450: MF_last_x = x;
451: MF_last_y = y;
452: }
453:
454:
455: TERM_PUBLIC void MF_arrow(sx, sy, ex, ey, head)
456: unsigned int sx, sy, ex, ey;
457: TBOOLEAN head;
458: {
459: int delta_x, delta_y;
460:
461: MF_move(sx, sy);
462: MF_vector(ex, ey);
463: if (head) {
464: delta_x = ex - sx;
465: delta_y = ey - sy;
466: fprintf(gpoutfile, "fill arrowhead rotated angle(%d,%d) shifted (%da,%db);\n",
467: delta_x, delta_y, ex, ey);
468: }
469: }
470:
471:
472: TERM_PUBLIC void MF_put_text(x, y, str)
473: unsigned int x, y;
474: char *str;
475: {
476: int i, j = 0;
477:
478: for (i = 0; i < strlen(str); i++)
479: if (str[i] == '"')
480: str[i] = '\''; /* Replace " with ' */
481: switch (MF_justify) {
482: case LEFT:
483: j = 1;
484: break;
485: case CENTRE:
486: j = 2;
487: break;
488: case RIGHT:
489: j = 3;
490: break;
491: }
492: fprintf(gpoutfile, "put_text(\"%s\",%da,%db,%d,%d);\n",
493: str, x, y, MF_ang, j);
494: }
495:
496:
497: TERM_PUBLIC void MF_reset()
498: {
499: fputs("end.\n", gpoutfile);
500: }
501:
502:
503: #endif /* TERM_BODY */
504:
505: #ifdef TERM_TABLE
506:
507: TERM_TABLE_START(mf_driver)
508: "mf", "Metafont plotting standard",
509: MF_XMAX, MF_YMAX, MF_VCHAR, MF_HCHAR,
510: MF_VTIC, MF_HTIC, options_null, MF_init, MF_reset,
511: MF_text, null_scale, MF_graphics, MF_move, MF_vector,
512: MF_linetype, MF_put_text, MF_text_angle,
513: MF_justify_text, line_and_point, MF_arrow, set_font_null
514: TERM_TABLE_END(mf_driver)
515:
516: #undef LAST_TERM
517: #define LAST_TERM mf_driver
518:
519: #endif /* TERM_TABLE */
520: #endif /* TERM_PROTO_ONLY */
521:
522:
523: #ifdef TERM_HELP
524: START_HELP(mf)
525: "1 mf",
526: "?commands set terminal mf",
527: "?set terminal mf",
528: "?set term mf",
529: "?terminal mf",
530: "?term mf",
531: "?mf",
532: "?metafont",
533: " The `mf` terminal driver creates a input file to the METAFONT program. Thus a",
534: " figure may be used in the TeX document in the same way as is a character.",
535: "",
536: " To use a picture in a document, the METAFONT program must be run with the",
537: " output file from `gnuplot` as input. Thus, the user needs a basic knowledge",
538: " of the font creating process and the procedure for including a new font in a",
539: " document. However, if the METAFONT program is set up properly at the local",
540: " site, an unexperienced user could perform the operation without much trouble.",
541: "",
542: " The text support is based on a METAFONT character set. Currently the",
543: " Computer Modern Roman font set is input, but the user is in principal free to",
544: " chose whatever fonts he or she needs. The METAFONT source files for the",
545: " chosen font must be available. Each character is stored in a separate",
546: " picture variable in METAFONT. These variables may be manipulated (rotated,",
547: " scaled etc.) when characters are needed. The drawback is the interpretation",
548: " time in the METAFONT program. On some machines (i.e. PC) the limited amount",
549: " of memory available may also cause problems if too many pictures are stored.",
550: "",
551: " The `mf` terminal has no options.",
552: "2 METAFONT Instructions",
553: "?commands set terminal mf detailed",
554: "?set terminal mf detailed",
555: "?set term mf detailed",
556: "?mf detailed",
557: "?metafont detailed",
558: "",
559: " - Set your terminal to METAFONT:",
560: " set terminal mf",
561: " - Select an output-file, e.g.:",
562: " set output \"myfigures.mf\"",
563: " - Create your pictures. Each picture will generate a separate character. Its",
564: " default size will be 5*3 inches. You can change the size by saying `set size",
565: " 0.5,0.5` or whatever fraction of the default size you want to have.",
566: "",
567: " - Quit `gnuplot`.",
568: "",
569: " - Generate a TFM and GF file by running METAFONT on the output of `gnuplot`.",
570: " Since the picture is quite large (5*3 in), you will have to use a version of",
571: " METAFONT that has a value of at least 150000 for memmax. On Unix systems",
572: " these are conventionally installed under the name bigmf. For the following",
573: " assume that the command virmf stands for a big version of METAFONT. For",
574: " example:",
575: "",
576: " - Invoke METAFONT:",
577: " virmf '&plain'",
578: " - Select the output device: At the METAFONT prompt ('*') type:",
579: " \\mode:=CanonCX; % or whatever printer you use",
580: " - Optionally select a magnification:",
581: " mag:=1; % or whatever you wish",
582: " - Input the `gnuplot`-file:",
583: " input myfigures.mf",
584: " On a typical Unix machine there will usually be a script called \"mf\" that",
585: " executes virmf '&plain', so you probably can substitute mf for virmf &plain.",
586: " This will generate two files: mfput.tfm and mfput.$$$gf (where $$$ indicates",
587: " the resolution of your device). The above can be conveniently achieved by",
588: " typing everything on the command line, e.g.:",
589: " virmf '&plain' '\\mode:=CanonCX; mag:=1; input myfigures.mf'",
590: " In this case the output files will be named myfigures.tfm and",
591: " myfigures.300gf.",
592: "",
593: " - Generate a PK file from the GF file using gftopk:",
594: " gftopk myfigures.300gf myfigures.300pk",
595: " The name of the output file for gftopk depends on the DVI driver you use.",
596: " Ask your local TeX administrator about the naming conventions. Next, either",
597: " install the TFM and PK files in the appropriate directories, or set your",
598: " environment variables properly. Usually this involves setting TEXFONTS to",
599: " include the current directory and doing the same thing for the environment",
600: " variable that your DVI driver uses (no standard name here...). This step is",
601: " necessary so that TeX will find the font metric file and your DVI driver will",
602: " find the PK file.",
603: "",
604: " - To include your pictures in your document you have to tell TeX the font:",
605: " \\font\\gnufigs=myfigures",
606: " Each picture you made is stored in a single character. The first picture is",
607: " character 0, the second is character 1, and so on... After doing the above",
608: " step, you can use the pictures just like any other characters. Therefore, to",
609: " place pictures 1 and 2 centered in your document, all you have to do is:",
610: " \\centerline{\\gnufigs\\char0}",
611: " \\centerline{\\gnufigs\\char1}",
612: " in plain TeX. For LaTeX you can, of course, use the picture environment and",
613: " place the picture wherever you wish by using the \\makebox and \\put macros.",
614: "",
615: " This conversion saves you a lot of time once you have generated the font;",
616: " TeX handles the pictures as characters and uses minimal time to place them,",
617: " and the documents you make change more often than the pictures do. It also",
618: " saves a lot of TeX memory. One last advantage of using the METAFONT driver",
619: " is that the DVI file really remains device independent, because no \\special",
620: " commands are used as in the eepic and tpic drivers."
621: END_HELP(mf)
622: #endif /* TERM_HELP */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>