summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/plain/js-misc/xfig.tex
blob: 95a86cff5e9978fa35b697e5d16c9cbb3136cbce (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
% $Id: xfig.tex,v 1.4 1995/05/07 16:52:05 schrod Exp $
%------------------------------------------------------------
% Hacked together by Joachim Schrod <schrod@iti.informatik.th-darmstadt.de>
% Put into public domain.

%
% Support for xfig pictures in plain TeX
% orginally written for transfig 2.1.7
% support last checked for transfig 3.1.3
%


% USAGE:
%
% To include xfig figures in plain TeX documents, just input these
% macros and then input the (La)TeX file you got by exporting your
% figure as `LaTeX picture' or by calling fig2dev with option `-L
% latex'. No other ``language'' is supported by these macros; in
% particular, `Combined PS/LaTeX' is not supported.

% You can select the used types for text by redefining some macros:
% \FigFontType<type> (with <type> equal `rm', `bf', `it', `sf', or
% `tt') must expand to the external font name that's used for the
% respective xfig font selection.
%     \FigFontDefault specifies the font that's used for the `Default'
% font selection. That macro is only accessed if you use the new xfig,
% or if you repaired the no-NFSS code of fig2dev (in texfonts.h, see
% comments at \xfig@bindSetFigFont implementation below).
%
% At the start of each figure \pictureHook is evaluated, you might
% want to bind that to some code that does document-specific setup.
% Each figure is set in a group, so you can rebind other control
% sequences in that hook.


% ------------------------------------------------------------

% IMPLEMENTATION NOTES:
%
% The macros might not work in all circumstances, it's updated and improved
% by need...
%
% In particular:
%   -- The font selection in \SetFigFont could be improved.
%   -- The environment code (\begin/\end) is very rough and should
%      check for erroneous input.


% Code structure:
%
% After general setup, code from DEK that implements most parts of
% LaTeX's picture environment is used. Then we add definitions for the
% missing and xfig-specific tags.
%
% In Emacs, each section starts on a new page.


% ============================================================

% standard setup:

\ifx \CatEscape\undefined
    \chardef\CatEscape=0
    \chardef\CatOpen=1
    \chardef\CatClose=2
    \chardef\CatIgnore=9
    \chardef\CatLetter=11
    \chardef\CatOther=12
    \chardef\CatActive=13               % \active of plain.tex
    \chardef\CatInvalid=15

    \chardef\CatAtCode=\catcode`\@
    \chardef\CatUsCode=\catcode`\_
\fi

\catcode`\@=\CatLetter                  % top level macro file

\begingroup
    \catcode`\$=\CatIgnore
    \catcode`\:=\CatIgnore
    \message{xfig pictures, $Revision: 1.4 $}
\endgroup


% This macro file allocates registers and might be read in multiple
% times, in groups. (Actually, this occured for the first time when we
% wanted to use xfig pictures in Texinfo documents. There they are
% typeset in a `tex' environment, and xfig is read in anew for each
% figure.) As all register allocations are globally, we define some
% macros that help us to define them only once.

\def\xfig@newskip#1{%
    \ifx #1\undefined  \csname newskip\endcsname #1\fi
    }
\def\xfig@newdimen#1{%
    \ifx #1\undefined  \csname newdimen\endcsname #1\fi
    }
\def\xfig@newcount#1{%
    \ifx #1\undefined  \csname newcount\endcsname #1\fi
    }
\def\xfig@newbox#1{%
    \ifx #1\undefined  \csname newbox\endcsname #1\fi
    }


% ============================================================

%% First comes an implementation of the picture environment's features,
%% by the Grand Wizard of TeX Arcana himself. This is from picture.tex,
%% I deleted the \cpic macro and the squines. \makebox did not support
%% position specifiers, I substituted the definition by the one from
%% LaTeX2e. In addition, all register allocations are made with the
%% macros defined above.

% --------------------------------------------------

% Pictures (a subset of \LaTeX's conventions, plus squines)

%% [start of change to DEK's code]
%%
%% At's catcode is changed above already.
%% Allocation info for registers should go to log file.

% \chardef\CatcodeAt=\catcode`\@
% \catcode`\@=11 % enable private control sequences
% \def\wlog#1{} % don't put allocation info into the log

%% [end of change]

\xfig@newskip\hsssglue \hsssglue=0pt plus 1fill minus 1fill
\def\hsss{\hskip\hsssglue}

\xfig@newdimen\unitlength \xfig@newdimen\linethickness
\xfig@newdimen\@picheight \xfig@newdimen\@xdim \xfig@newdimen\@ydim \xfig@newdimen\@len
\xfig@newdimen\@save
\xfig@newcount\@multicount \xfig@newcount\@xarg \xfig@newcount\@yarg
\xfig@newbox\@picbox \xfig@newbox\@mpbox

\font\tenln=line10     \font\tenlnw=linew10
\font\tencirc=lcircle10 \font\tencircw=lcirclew10

\xfig@newdimen\@halfwidth

\def\thinlines{\let\linefont=\tenln \let\circlefont=\tencirc
  \linethickness=\fontdimen8\linefont \@halfwidth .5\linethickness}
\def\thicklines{\let\linefont=\tenlnw \let\circlefont=\tencircw
  \linethickness=\fontdimen8\linefont \@halfwidth .5\linethickness}
\thinlines

\def\beginpicture(#1,#2)(#3,#4){\@picheight=#2\unitlength
  \setbox\@picbox=\hbox to#1\unitlength\bgroup \let\line=\@line
    \kern-#3\unitlength \lower#4\unitlength\hbox\bgroup\ignorespaces}
\def\endpicture{\egroup\hss\egroup
  \ht\@picbox=\@picheight \dp\@picbox=\z@
  \leavevmode\box\@picbox}

\def\put(#1,#2)#3{\raise#2\unitlength\rlap{\kern#1\unitlength #3}\ignorespaces}

\def\multiput(#1,#2)(#3,#4)#5#6{\@multicount=#5\relax
 \@xdim=#1\unitlength \@ydim=#2\unitlength \setbox\@mpbox=\hbox{#6}%
 \loop\ifnum\@multicount>0
   \raise\@ydim\rlap{\kern\@xdim \unhcopy\@mpbox}%
   \advance\@xdim#3\unitlength \advance\@ydim#4\unitlength
   \advance\@multicount\m@ne \repeat\ignorespaces}

\def\@ifnextchar#1#2#3{\let\@tempe=#1\def\@tempa{#2}\def\@tempb{#3}\futurelet
    \@tempc\@ifnch}
\def\@ifnch{\ifx \@tempc \@sptoken \let\@tempd\@xifnch
      \else \ifx \@tempc \@tempe\let\@tempd\@tempa\else\let\@tempd\@tempb\fi
      \fi \@tempd}

%% [start of change to DEK's code]
%%
%% \makebox is called with an optional argument, the position
%% specifier. The code below is copied from the LaTeX2e beta-test
%% release.

\def\makebox(#1,#2){%
  \@ifnextchar[{\@makebox(#1,#2)}{\@makebox(#1,#2)[]}}

\def\@nnil{\@nil}
\def\@fornoop#1\@@#2#3{}
\def\@tfor#1:=#2\do#3{\def\@fortmp{#2}\ifx\@fortmp\empty \else
    \@tforloop#2\@nil\@nil\@@#1{#3}\fi}
\def\@tforloop#1#2\@@#3#4{\def#3{#1}\ifx #3\@nnil
       \let\@nextwhile\@fornoop \else
      #4\relax\let\@nextwhile\@tforloop\fi\@nextwhile#2\@@#3{#4}}

\long\def\@makebox(#1,#2)[#3]#4{%
  \vbox to#2\unitlength
   {\let\mb@b\vss \let\mb@l\hss\let\mb@r\hss
    \let\mb@t\vss
    \@tfor\@tempa :=#3\do{%
      \if s\@tempa
        \let\mb@l\relax\let\mb@r\relax
      \else
        \expandafter\let\csname mb@\@tempa\endcsname\relax
      \fi}%
    \mb@t
    \hbox to #1\unitlength{\mb@l #4\mb@r}%
    \mb@b
    \kern\z@}}

%% [end of change]

\newif\ifneg
\def\@line(#1,#2)#3{\@xarg=#1 \@yarg=#2 \@len=#3\unitlength \leavevmode
 \ifnum\@xarg<0 \reverseline \else \negfalse \@ydim=\z@\fi
 \ifnum\@xarg=0 \@vline
 \else\ifnum\@yarg=0 \@hline \else\@sline\fi\fi
 \ifneg\kern-\@len\else\@save=\@ydim\fi}
\def\reverseline{\negtrue \kern-\@len \@xarg=-\@xarg
 \@ydim=\@len \multiply\@ydim\@yarg \divide\@ydim\@xarg \@yarg=-\@yarg}

\def\@hline{\vrule height.5\linethickness depth.5\linethickness width\@len}
\def\@vline{\kern-.5\linethickness\vrule width\linethickness
  \ifnum\@yarg<0 height\z@ depth\else depth\z@ height\fi\@len
  \kern-.5\linethickness}

\def\@sline{\setbox\@picbox=\hbox{\linefont \count@=\@xarg \multiply\count@ 8
 \ifnum\@yarg>0 \advance\count@\@yarg \advance\count@-9
 \else \advance\count@-\@yarg \advance\count@ 55 \fi \char\count@}%
 \ifnum\@yarg<0 \@picheight=-\ht\@picbox \advance\@ydim\@picheight
 \else \@picheight=\ht\@picbox \fi
 \@xdim=\wd\@picbox \@save=\@ydim
 \loop\ifdim\@xdim<\@len \raise\@ydim\copy\@picbox
  \advance\@xdim\wd\@picbox \advance\@ydim\@picheight \repeat
 \advance\@xdim-\@len \kern-\@xdim
 \multiply\@xdim\@yarg \divide\@xdim\@xarg \advance\@ydim-\@xdim
 \raise\@ydim\box\@picbox}

\def\vector(#1,#2)#3{\@line(#1,#2){#3}%
 \ifnum\@xarg=0 \@vvector \else\ifnum\@yarg=0 \@hvector \else\@svector\fi\fi}
\def\@hvector{\ifneg\rlap{\linefont\char27}\else
 \smash{\llap{\linefont\char45}}\fi} % we have to smash because of font bug
\def\@vvector{\ifnum\@yarg<0 \raise-\@len\rlap{\linefont\char63}%
 \else\setbox\@picbox=\rlap{\linefont\char54}\advance\@len-\ht\@picbox
 \raise\@len\box\@picbox\fi}

\def\@svector{\setbox\@picbox=\hbox to\z@{\linefont
 \ifnum\@yarg<0 \count@=55 \@yarg=-\@yarg \else\count@=-9 \fi
 \ifneg\multiply\@xarg16 \multiply\@yarg2
 \else\hss % \llap
  \ifnum\@xarg>2 \multiply\@xarg9 \multiply\@yarg2 \advance\count@29
  \else\ifnum\@yarg>2 \multiply\@xarg16 \multiply\@yarg9 \advance\count@-20
   \else\multiply\@xarg24 \multiply\@yarg3 \fi\fi\fi
  \advance\count@\@xarg \advance\count@\@yarg \char\count@
  \ifneg\hss\fi}% \rlap
 \raise\@save\box\@picbox}

\def\disk#1{\@len=#1\unitlength \count@='160 \@diskcirc}
\def\circle#1{\@len=#1\unitlength \count@='140 \@diskcirc}
\def\@diskcirc{\setbox\@picbox=\hbox{\circlefont\char\count@}\@xdim=\wd\@picbox
 \leavevmode \ifdim\@len>15.499\@xdim \@bigdc \else \@smalldc\fi}
\def\@bigdc{\ifnum\count@<'160 \@bigcirc
 \else \@len=15\@xdim \@diskcirc\fi}
\def\@smalldc{{\advance\@len-.5\@xdim
 \loop\ifdim\@xdim<\@len \advance\count@\@ne \advance\@xdim\wd\@picbox\repeat
 \hbox{\circlefont\char\count@}}}
\def\@bigcirc{{\circlefont\count@=15
 \setbox\@picbox=\hbox{\char\count@}\@xdim=\wd\@picbox
 \ifdim\@len>2.5\@xdim \@len=2.5\@xdim\fi
 \advance\@len-.125\wd\@picbox
 \loop\ifdim\@xdim<\@len \advance\count@ 4 \advance\@xdim.25\wd\@picbox\repeat
 \@ydim=.5\@xdim \advance\@ydim.5\linethickness
 \setbox\@picbox=\vbox{\hbox{\char\count@\advance\count@-3\char\count@}%
  \nointerlineskip
  \hbox{\advance\count@\m@ne\char\count@\advance\count@\m@ne\char\count@}}%
 \kern-\@ydim\lower\@ydim\box\@picbox}}

\newif\ifovaltl \newif\ifovaltr \newif\ifovalbl \newif\ifovalbr
\ovaltltrue \ovaltrtrue \ovalbltrue \ovalbrtrue
\def\oval(#1,#2){\@xdim=#1\unitlength \@ydim=#2\unitlength
 {\circlefont \setbox\@picbox=\hbox{\char0}
 \ifdim\@xdim<\wd\@picbox \@xdim=\wd\@picbox\fi
 \ifdim\@ydim<\wd\@picbox \@ydim=\wd\@picbox\fi
 \@save=\@xdim \ifdim\@ydim<\@save \@save=\@ydim \fi
 \count@=39
 \loop \setbox\@picbox=\hbox{\char\count@}\ifdim\@save<\wd\@picbox
  \advance\count@-4 \repeat
 \setbox\strutbox=\hbox{\vrule height\ht\@picbox depth\dp\@picbox width\z@
   \kern\wd\@picbox}%
 \@save=.5\wd\@picbox \advance\@save-.5\linethickness
 \setbox0=\hbox to\@xdim{\ifovaltl\char\count@\else\strut\fi
  \kern-\@save\leaders\hrule height\ifovaltl\linethickness\else\z@\fi\hfil
  \leaders\hrule height\ifovaltr\linethickness\else\z@\fi\hfil\kern\@save
  \ifovaltr\advance\count@-3\char\count@\else\strut\fi\kern-\wd\@picbox}%
  \advance\count@\m@ne
 \setbox2=\hbox to\@xdim{\ifovalbl\char\count@\else\strut\fi
  \kern-\@save\leaders\hrule height\ifovalbl\linethickness\else\z@\fi\hfil
  \leaders\hrule height\ifovalbr\linethickness\else\z@\fi\hfil\kern\@save
  \ifovalbr\advance\count@\m@ne\char\count@\else\strut\fi\kern-\wd\@picbox}%
 \@save=\@ydim \advance\@save-\wd\@picbox \divide\@save 2
 \setbox\@picbox=\vbox{\box0\nointerlineskip
  \hbox to\@xdim{\vrule height\@save width\ifovaltl\linethickness\else\z@\fi
    \hfil\ifovaltr\vrule width\linethickness\kern-\linethickness\fi}%
  \nointerlineskip
  \hbox to\@xdim{\vrule height\@save width\ifovalbl\linethickness\else\z@\fi
    \hfil\ifovalbr\vrule width\linethickness\kern-\linethickness\fi}%
  \nointerlineskip\box2}%
  \@save=.5\@ydim \advance\@save.5\linethickness \leavevmode
  \kern-.5\@xdim \kern-.5\linethickness \lower\@save\box\@picbox}}

% ============================================================

%% More picture environment tags, output by fig2dev


%% The framebox tag was missing in DEK's code. Below is a copy from
%% the 1994/06/01 version of ltboxes.dtx. Actually, we need only the
%% \@framepicbox tag.

% \DescribeMacro\framebox
%  |\framebox| ...  : like |\makebox|, except it puts a `frame' around
%            the box.  The frame is made of lines of thickness
%            |\fboxrule|, separated by space |\fboxsep| from the
%            text -- except for |\framebox(X,Y)| ... , where the
%            thickness of the lines is as for the picture environment,
%            and there is no separation added.

\def\framebox(#1,#2){%
  \@ifnextchar[{\@framebox(#1,#2)}{\@framebox(#1,#2)[]}%  ] (Emacs)
  }
\long\def\@framebox(#1,#2)[#3]#4{%
  \frame{\makebox(#1,#2)[#3]{#4}}}

\long\def\frame#1{%
  \leavevmode
  \hbox{%
    \hskip-\linethickness
    \vbox{%
      \vskip-\linethickness
      \hrule height\linethickness
      \hbox{%
        \vrule width\linethickness
        #1%
        \vrule width\linethickness}%
      \hrule height\linethickness
      \vskip -\linethickness}%
    \hskip -\linethickness}}


%% The dashbox tag was also missing. We copy it from ltpictur.dtx,
%% 1994/05/22 v1.0e LaTeX Kernel (Picture Mode). The (missing)
%% indentation is from there, not introduced by me. Sorry, but this
%% must be emphasized.

% \@wholewidth -> \linethickness
% \@makepicbox -> \makebox

\xfig@newdimen\@dashdim
\xfig@newbox\@dashbox
\xfig@newcount\@dashcnt

\def\@whilenoop#1{}
\def\@whilenum#1\do #2{\ifnum #1\relax #2\relax\@iwhilenum{#1\relax
     #2\relax}\fi}
\def\@iwhilenum#1{\ifnum #1\let\@nextwhile\@iwhilenum
         \else\let\@nextwhile\@whilenoop\fi\@nextwhile{#1}}

\def\dashbox#1(#2,#3){\leavevmode\hbox to\z@{\baselineskip \z@skip
\lineskip \z@skip
\@dashdim #2\unitlength
\@dashcnt \@dashdim \advance\@dashcnt 200
\@dashdim #1\unitlength\divide\@dashcnt \@dashdim
\ifodd\@dashcnt\@dashdim \z@
\advance\@dashcnt \@ne \divide\@dashcnt \tw@
\else \divide\@dashdim \tw@ \divide\@dashcnt \tw@
\advance\@dashcnt \m@ne
\setbox\@dashbox \hbox{\vrule height \@halfwidth depth \@halfwidth
width \@dashdim}\put(0,0){\copy\@dashbox}%
\put(0,#3){\copy\@dashbox}%
\put(#2,0){\hskip-\@dashdim\copy\@dashbox}%
\put(#2,#3){\hskip-\@dashdim\box\@dashbox}%
\multiply\@dashdim \thr@@
\fi
\setbox\@dashbox \hbox{\vrule height \@halfwidth depth \@halfwidth
width #1\unitlength\hskip #1\unitlength}\count@\z@
\put(0,0){\hskip\@dashdim \@whilenum \count@ <\@dashcnt
\do{\copy\@dashbox\advance\count@ \@ne }}\count@\z@
\put(0,#3){\hskip\@dashdim \@whilenum \count@ <\@dashcnt
\do{\copy\@dashbox\advance\count@ \@ne }}%
\@dashdim #3\unitlength
\@dashcnt \@dashdim \advance\@dashcnt 200
\@dashdim #1\unitlength\divide\@dashcnt \@dashdim
\ifodd\@dashcnt \@dashdim \z@
\advance\@dashcnt \@ne \divide\@dashcnt \tw@
\else
\divide\@dashdim \tw@ \divide\@dashcnt \tw@
\advance\@dashcnt \m@ne
\setbox\@dashbox\hbox{\hskip -\@halfwidth
\vrule width \linethickness
height \@dashdim}\put(0,0){\copy\@dashbox}%
\put(#2,0){\copy\@dashbox}%
\put(0,#3){\lower\@dashdim\copy\@dashbox}%
\put(#2,#3){\lower\@dashdim\copy\@dashbox}%
\multiply\@dashdim \thr@@
\fi
\setbox\@dashbox\hbox{\vrule width \linethickness
height #1\unitlength}\count@\z@
\put(0,0){\hskip -\@halfwidth \vbox{\@whilenum \count@ <\@dashcnt
\do{\vskip #1\unitlength\copy\@dashbox\advance\count@ \@ne }%
\vskip\@dashdim}}\count@\z@
\put(#2,0){\hskip -\@halfwidth \vbox{\@whilenum \count@<\@dashcnt
\do{\vskip #1\unitlength\copy\@dashbox\advance\count@ \@ne }%
\vskip\@dashdim}}}\makebox(#2,#3)}


% ============================================================

%% Then we must supply the LaTeX tags that are inserted by fig2dev.

% \setlength is the LaTeX PC way of setting a register.
\def\setlength#1#2{#1=#2\relax}

% --------------------------------------------------

% \makeatletter is called to access private macros in the \SetFigFont
% definition. Since we never expand that definition, we could ignore
% the catcode change. But we should not define a macro with a nonsense
% name...
\ifx \makeatletter\undefined
    \def\makeatletter{\catcode`\@=11 }  % <-- Space
\fi

% --------------------------------------------------

% The real hassle in that macro file is the font switch code. Once
% there was an interface, in transfig 2.1.7 & 2.1.8: A macro named
% \SetFigFont was used to select the type for texts. The macro
% definition itself is written by fig2dev, it is part of the figure
% code.
%
% Then transfig 3 was released and the interface disappeared. There's
% still the macro \SetFigFont and the macro definition is still
% written by fig2dev, but it may be defined with 3 arguments or with 5
% arguments, one cannot determine what's used. The second form is used
% when NFSS is added to the defines of fig2dev and should be the
% default. (After all, LaTeX2e subsumed NFSS.) The first form must be
% used for LaTeX 2.09 w/OFSS.
%
% \SetFigFont is not defined if it is defined already when the figure
% code is read. OK, one might think, let's define a plain TeX version.
% (Actually, xfig.tex up to revision 1.3 did so.) But which interface
% shall we use for our definition? In a typical installation one has
% old documents with xfig pictures that were created with an old
% fig2dev, we must therefore support the three-arg-variant. Newly
% created figures will use the five-arg-variant, though. There is no
% obvious way to determine which variant will be used in the
% respective figure.

% Please note that the information above -- and the one below about
% the actual possible interfaces of \SetFigFont -- was determined by
% looking at the output of example files and the code in setfigfont.c
% and texfonts.h, as not even the comments in these files got updated
% when the new \SetFigFont interface was introduced. (Sigh.)
%
% The changes were not even marked in the list of changes, I learned
% about them when folks from the Net sent me complaints about revision
% 1.1 of xfig.tex. (I hadn't installed xfig 3 at this time.)
%
% Do I really have to tell you what I think about these kinds of
% changes, in terms of software quality? (Don't ask me when I'm in a
% bad mood if you want polite answers.)

% Well, here's the solution: As told above, I've analyzed the possible
% expansions of \SetFigFont. I'll define macros for every cseq that's
% in the expansion, one of these macros will bind \SetFigFont to
% \SetFigFontOFSS or \SetFigFontNFSS, respectively. Let's have a look:
%
% OFSS: evaluates \@setsize. This macro has supposed to have 4
% arguments (type, baselineskip, font-setup, font-setup). Then the
% type specifier is evaluated by a \csname. Passing nothing there will
% effectively be a nop.
%
% NFSS: The \SetFigfont expansion uses more cseqs, but is more
% regular, too. We may supply empty expansions for everything that
% shall setup the font parameters: \reset@font, \fontsize (2 args),
% \fontfamily & \fontseries & \fontshape (each 1 arg). Then
% \selectfont is evaluated, here we bind the appropriate expansion of
% \SetFigFont.

% Now we may setup the macro definitions, evaluate one pseudo
% \SetFigFont and \SetFigFont will be bound to the correct expansion.
%
% The first argument must be a number, as the OFSS \SetFigFont version
% assigns it to a count register.
\def\xfig@bindSetFigFont{%
    % OFSS
    \def\@setsize##1##2##3##4{\let\SetFigFont\SetFigFontOFSS}%
    % NFSS
    \let\reset@font\relax
    \def\fontsize##1##2{}%
    \def\fontfamily##1{}%
    \def\fontseries##1{}%
    \def\fontshape##1{}%
    \def\selectfont{\let\SetFigFont\SetFigFontNFSS}%
    % Now bind correct \SetFigFont by evaluating \SetFigFont.
    \SetFigFont{0}{}{}{}{}%
    }

% --------------------------------------------------

% The interface of \SetFigFontOFSS:
%   #1 is the size (w/o pt),
%   #2 the baselineskip (w/o pt),
%   #3 a plain TeX type specifier.
%      If #3 is empty we assume that a default font should be taken.
%      This default font can be named by \FigFontDefault. Note, that
%      this parameter is not empty if you choose the font `Default' in
%      xfig. You have to chang texfonts.h accordingly. I did it
%      already for 2.1.7 and sent the diffs to the maintainer, but
%      obviously he dumped them since they did not appear in 3.x.
%
% It's a pity, that we can't use the plain TeX type specifier. We
% demand an appropriate font scaled to the correct size. This is not
% the best solution, but nowadays most DVI drivers generate the fonts on
% the fly anyhow.

\def\FigFontDefault{cmr10}
\def\FigFontType{\FigFontDefault\space}
\def\FigFontTyperm{cmr10}
\def\FigFontTypebf{cmbx10}
\def\FigFontTypeit{cmti10}
\def\FigFontTypesf{cmss10}
\def\FigFontTypett{cmtt10}
\def\SetFigFontOFSS#1#2#3{%
    \font\FigFont \csname FigFontType#3\endcsname\space at #1pt
    \FigFont
    \baselineskip #2pt\relax
    }

% The interface of \SetFigFontNFSS:
%   #1 is the size (w/o pt),
%   #2 the baselineskip (w/o pt),
%   #3 the NFSS font family (as a cseq),
%   #4 the NFSS font series (as a cseq), and
%   #5 the NFSS font shape (as a cseq).
%
% The current font state is reset before the arguments take effect.
% The call to \SetFigFont doesn't use the full possibilities of NFSS;
% only fixed combinations of arguments are supplied, as xfig itself
% knows only about a fixed set of fonts (default, roman, bold, italic,
% sans serif, and typewriter).

% We map that interface back to the one of \SetFigFontOFSS. To do that
% we redefine the NFSS font specifiers locally to create plain TeX
% font specifiers. That's mostly easy, medium density (`md') series
% and upright (`up') shape are ignored in plain anyhow. The default is
% explicitely specified by \familydefault, we don't need to infer it.
% But there is one exception: bold is specified as `roman bold', ie,
% as `rmbf'. For that exception we just define a new FigFontType macro.

\def\FigFontTypermbf{\FigFontTypebf}
\def\SetFigFontNFSS#1#2#3#4#5{%
    \begingroup
        \let\familydefault\empty
        \def\rmdefault{rm}%
        \def\sfdefault{sf}%
        \def\ttdefault{tt}%
        \let\mddefault\empty
        \def\bfdefault{bf}%
        \let\updefault\empty
        \def\itdefault{it}%
        \xdef\FigFontSpec{#3#4#5}%
    \endgroup
    \SetFigFontOFSS{#1}{#2}{\FigFontSpec}%
    }

% --------------------------------------------------

% Environments are enclosed in \begin{foo} ... \end{foo}.
% I don't check if the call is ok -- this file is specific for
% machine-generated code, that shall be correct by definition.
%
% We need to setup the correct \SetFigFont binding, as explained above.
% And let's evaluate a hook to enable document specific adaptions.

\def\begin#1{%
    \begingroup
        \def\end##1{%
                \csname end##1\endcsname
            \endgroup
            }%
        \xfig@bindSetFigFont
        \csname #1Hook\endcsname
        \csname begin#1\endcsname
    }


% ============================================================

\catcode`\@=\CatAtCode

\endinput


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% $Log: xfig.tex,v $
% Revision 1.4  1995/05/07  16:52:05  schrod
%     Determine \SetFigFont variant automatically. \OldXfig is not
% looked at any more, \SetFigFontOld and \SetFigFontNew are renamed to
% \SetFigFontOFSS and \SetFigFontNFSS.
%
% Revision 1.3  1995/04/17  00:01:08  schrod
%     Don't allocate registers anew if xfig.tex is read in the second
% time.
%
% Revision 1.2  1995/03/16  01:15:51  schrod
%     Support output of transfig 3.1.1.
%
% Revision 1.1  1995/03/13  23:18:15  schrod
%     Started to manage this package with CVS. Made minor code cleanup.
%

% 94-06-10 js  Initial revision.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Local Variables:
mode: plain-tex
TeX-master: t
TeX-brace-indent-level: 4
page-delimiter: "^% ==*$"
End: