diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /graphics/fig2mfpic/mfpic.tex |
Initial commit
Diffstat (limited to 'graphics/fig2mfpic/mfpic.tex')
-rw-r--r-- | graphics/fig2mfpic/mfpic.tex | 422 |
1 files changed, 422 insertions, 0 deletions
diff --git a/graphics/fig2mfpic/mfpic.tex b/graphics/fig2mfpic/mfpic.tex new file mode 100644 index 0000000000..2c41e258a3 --- /dev/null +++ b/graphics/fig2mfpic/mfpic.tex @@ -0,0 +1,422 @@ +%%% +%%% File: mfpic.tex +%%% Version: 0.25 +%%% +%%% Principal Author: Thomas Leathrum +%%% Assistants: Bryan Green, Geoffrey Tobin +%%% + +% preliminary version of macros +% save catcode, as Michael Downes of AMS recommends. +\chardef\oldatcatcode=\catcode`@ +\catcode`@=11 % letter +\def\@wout{\immediate\write16\relax} +\@wout {} +\@wout + {mfpic version 0.25 - 19:20 GMT +10:00 Wed 13 Oct 93} +\@wout + {fixes for TFM, LaTeX (picture), fractions, catcode, sharp.} +\@wout + {tests for bad label options, mf char codes out of range (0 - 255).} +\@wout + {localised short-range declarations.} +\@wout {} +% test whether mfpic is used in LaTeX. +\newif\if@inlatex +% idea from _The TeXbook_ (1986), p. 384: +% \@mfundefined must remain undefined. +\ifx\picture\@mfundefined + \@inlatexfalse + \@wout {MFPIC: not in latex} +\else + \@inlatextrue + \@wout {MFPIC: in latex} +\fi +\@wout {} +% local declarations +\wlog {MFPIC: local declarations} +\newwrite\@outx +\newbox\@labeledgraph +\newdimen\@graphwd +\newcount\@code +% dimension parameters +\wlog {} +\wlog {MFPIC: dimension parameters} +\newdimen\mfpicunit +\newdimen\pointsize +\newdimen\shadespace +\newdimen\headlen +\newdimen\axisheadlen +\newdimen\hashlen +\newdimen\dashlen +\newdimen\dashspace +% default dimension settings +\mfpicunit=1pt +\pointsize=2pt +\shadespace=1pt +\headlen=3pt +\axisheadlen=5pt +\hashlen=4pt +\dashlen=4pt +\dashspace=4pt +% standard setting macros +\def\darkershade{% + \multiply\shadespace by 5 + \divide\shadespace by 6} +\def\lightershade{% + \multiply\shadespace by 6 + \divide\shadespace by 5} +\def\dashlineset{% + \dashlen=4pt + \dashspace=4pt} +\def\dotlineset{% + \dashlen=1pt + \dashspace=2pt} +% direct output to Metafont file +% only valid b/w \open- and \close- graphsfile. +\def\mfcmd#1{% + \immediate\write\@outx{#1}} +% pen size setting +\def\@pickup{% + \mfcmd{pickup pencircle scaled penwd;}} +\def\pen#1{% + \mfcmd{interim penwd:=#1;} + \@pickup} +% arrowhead shape setting +\def\headshape#1#2{% + \mfcmd{interim hdwdr:=#1; + interim hdten:=#2;}} +% open and close file +\def\opengraphsfile#1% +{% + \@code33 % first graphic is `!' + \immediate\openout\@outx=#1.mf + \batchmode + \font\@graph=#1 + \errorstopmode + \immediate\write16 {} + \ifx\@graph\nullfont + \font\@graph=dummy + \immediate\write16 + {MFPIC: ** Graphic's TFM file #1.tfm not found. **} + \immediate\write16 + {MFPIC: ** Process #1.mf! Then reprocess this file. **} + \immediate\write16 + {MFPIC: `Missing character' messages will log the graphic characters.} + \else + \immediate\write16 + {MFPIC: Graphic's TFM file found.} + \immediate\write16 + {MFPIC: Nevertheless, if PK font's changed, reprocess #1.mf.} + \immediate\write16 + {MFPIC: If TFM's changed, reprocess #1.mf, and then this TeX file.} + \fi + \immediate\write16 {} + \mfcmd{mag:=\number\mag/1000;} + \mfcmd{input graphbase.mf;} + % set global defaults + \mfcmd{mfpicenv;} + \headshape{1}{1} + \pen{0.5 pt}% +}% -- end \opengraphsfile +\def\closegraphsfile +{% + \mfcmd{} + \mfcmd{endmfpicenv;} + \mfcmd{end.} + \immediate\closeout\@outx +}% -- end \closegraphsfile +% a useful macro not in plain TeX. +\def\mf@gobble#1{} +% for output of # (c/o Donald Arseneau). +\def\mf@s{\expandafter\mf@gobble\string\#} +% beginning mfpicture environment +\def\@mfpicture#1#2#3#4#5#6{% + % dimension conversion: ##1 is a dimen. + \def\@xconv##1{% + \global\advance ##1 by -#3 \mfpicunit + \global ##1 = #1 ##1} + \def\@yconv##1{% + \global\advance ##1 by -#5 \mfpicunit + \global ##1 = -#2 ##1} + % set up TeX + \global\font\@tcurr=\fontname\font + \relax + \bgroup + \nullfont + \global\@graphwd = #4 \mfpicunit + \@xconv\@graphwd + \global\setbox\@labeledgraph=\vtop + {\hbox{\@graph\char\@code}} + % set up Metafont file + \mfcmd{} + \mfcmd{unitlen:=\the\mfpicunit\mf@s;} + \mfcmd{xscale:=#1*unitlen; yscale:=#2*unitlen; + xneg:=#3; xpos:=#4; + yneg:=#5; ypos:=#6;} + \mfcmd{beginchar (\the\@code, + (xpos-xneg)*xscale, + (ypos-yneg)*yscale, + 0);} + \mfcmd{setztr;} + \@pickup + % metafont drawing macros + % points, lines, and arrows + \def\point##1{% + \mfcmd{pointd(##1, \the\pointsize);}} + \def\line##1{% + \mfcmd{line(##1);}} + \def\arrow##1{% + \mfcmd{arrow(##1, \the\headlen);}} + \def\dottedline##1{% + \mfcmd{dottedline(##1, \the\dashlen, + \the\dashspace);}} + \def\dottedarrow##1{% + \mfcmd{dottedarrow(##1, \the\dashlen, + \the\dashspace, \the\headlen);}} + % axes and axis marks + \def\axes + {\mfcmd{axes(\the\axisheadlen);}} + \def\xmarks##1{% + \mfcmd{xmarks(\the\hashlen, ##1);}} + \def\ymarks##1{% + \mfcmd{ymarks(\the\hashlen, ##1);}} + % polygons + \def\rect##1{% + \mfcmd{rect(##1);}} + \def\dottedrect##1{% + \mfcmd{dottedrect(##1, + \the\dashlen, \the\dashspace);}} + \def\block##1{% + \mfcmd{block(##1);}} + \def\rectshade##1{% + \mfcmd{rectshade(\the\shadespace, ##1);}} + \def\polygon##1{% + \mfcmd{curve(false, true, ##1);}} + \def\polyshade##1{% + \mfcmd{cycleshade(\the\shadespace, + false, ##1);}} + \def\polyfill##1{% + \mfcmd{cycleshade(0, false, ##1);}} + % circles and ellipses + \def\circle##1{% + \mfcmd{circle(##1);}} + \def\ellipse##1{% + \mfcmd{ellipse(##1, 0);}} + \def\rotatedellipse##1{% + \mfcmd{ellipse(##1);}} + \def\circshade##1{% + \mfcmd{circshade(\the\shadespace, ##1);}} + \def\ellshade##1{% + \mfcmd{ellshade(\the\shadespace, ##1, 0);}} + \def\rotatedellshade##1{% + \mfcmd{ellshade(\the\shadespace, ##1);}} + \def\cdisk##1{% + \mfcmd{circshade(0, ##1);}} + \def\edisk##1{% + \mfcmd{ellshade(0, ##1, 0);}} + \def\rotatededisk##1{% + \mfcmd{ellshade(0, ##1);}} + % circular arcs + \def\arc##1{% + \mfcmd{arc(##1);}} + \def\arcarrow##1{% + \mfcmd{arcarrow(\the\headlen, ##1);}} + \def\arcshade##1{% + \mfcmd{arcshade(\the\shadespace, ##1);}} + \def\arcfill##1{% + \mfcmd{arcshade(0, ##1);}} + % polar coordinates + \def\linedir##1{% + \mfcmd{linedir(##1);}} + \def\arrowdir##1{% + \mfcmd{arrowdir(\the\headlen, ##1);}} + \def\arcth##1{% + \mfcmd{arcth(##1);}} + \def\arctharrow##1{% + \mfcmd{arctharrow(\the\headlen, ##1);}} + \def\wedgeshade##1{% + \mfcmd{wedgeshade(\the\shadespace, ##1);}} + \def\wedgefill##1{% + \mfcmd{wedgeshade(0, ##1);}} + % curves + \def\curve##1{% + \mfcmd{curve(true, false, ##1);}} + \def\polyline##1{% + \mfcmd{curve(false, false, ##1);}} + \let\polycurve=\polyline + \def\curvedarrow##1{% + \mfcmd{curvedarrow(true, + \the\headlen, ##1);}} + \def\polyarrow##1{% + \mfcmd{curvedarrow(false, + \the\headlen, ##1);}} + % cyclic curves + \def\cyclic##1{% + \mfcmd{curve(true, true, ##1);}} + \def\cycleshade##1{% + \mfcmd{cycleshade(\the\shadespace, + true, ##1);}} + \def\cyclefill##1{% + \mfcmd{cycleshade(0, true, ##1);}} + % functions + \def\function##1{% + \mfcmd{function(true, ##1);}} + \def\polyfunction##1{% + \mfcmd{function(false, ##1);}} + \def\parafcn##1{% + \mfcmd{parafcn(true, ##1);}} + \def\polyparafcn##1{% + \mfcmd{parafcn(false, ##1);}} + \def\shadefcn##1##2##3{% + \mfcmd{shadefcn(\the\shadespace, ##1) + (##2) (##3);}} + % labels + \def\@mflabel[##1##2]##3##4##5{% + % compute width of graph with label + % and reset size if necessary + {% local env. for \@btemp. + \chardef\@btemp=255\relax + \setbox\@btemp=\hbox{\@tcurr##5} + {% local env. for \@xtemp. + \dimendef\@xtemp=0\relax + \@xtemp = ##3 \mfpicunit + \@xconv\@xtemp + \advance\@xtemp by\wd\@btemp + \ifdim\@xtemp>\@graphwd + \global\@graphwd=\@xtemp\fi + }% end local env. + % set label onto picture + \global\setbox\@labeledgraph= + \vtop{\unvbox\@labeledgraph + \vbox to 0 pt{% + \if##1t\relax\else + \if##1c\kern-0.5\ht\@btemp\else + \if##1b\kern-\ht\@btemp\else + \immediate\write16 {} + \immediate\write16 + {MFPIC: label: vertical option `##1' unknown, will treat as `b'} + \immediate\write16 {} + \kern-\ht\@btemp + \fi\fi\fi + {% local env. for \@ytemp. + \dimendef\@ytemp=0\relax + \@ytemp = ##4 \mfpicunit + \@yconv\@ytemp + \kern\@ytemp + }% end local env. + \hbox{% + \if##2l\relax\else + \if##2c\kern-0.5\wd\@btemp\else + \if##2r\kern-\wd\@btemp\else + \immediate\write16 {} + \immediate\write16 + {MFPIC: label: horizontal option `##2' unknown, will treat as `l'} + \immediate\write16 {} + \fi\fi\fi + {% local env. for \@xtemp. + \dimendef\@xtemp=0\relax + \@xtemp = ##3 \mfpicunit + \@xconv\@xtemp + \kern\@xtemp + }% end local env. + \box\@btemp}% -- end \hbox + \vss}% -- end \vbox + \nointerlineskip}% -- end \vtop + }% end local env. + }% -- end \@mflabel + \def\@labeldefault{\@mflabel[bl]} + \def\@dolabel{% + \if[\@nchr\expandafter\@mflabel + \else\expandafter\@labeldefault\fi} + \def\mflabel{\futurelet\@nchr\@dolabel} + % captions + % \@docaption is called by \endmfpicture + \def\@docaption{} + \def\mfcaption##1{% + % redefine to set caption + \def\@docaption{% + % allow forced line breaks + \def\\{% + \global\font\@curr=\fontname\font + \relax\egroup \hbox\bgroup\@curr} + % compute adjustments to center + \chardef\@btemp=255\relax + \setbox\@btemp=\vbox + {\hbox{\@tcurr##1}} + \ifdim\wd\@btemp>\@graphwd + \global\@graphwd=\wd\@btemp\fi + % set caption onto picture + \global\setbox\@labeledgraph=\vbox + {\unvbox\@labeledgraph + \medskip\hbox + {\noindent + \dimendef\@centerskip=0\relax + \@centerskip=\@graphwd + \advance\@centerskip -\wd\@btemp + \divide\@centerskip by 2\relax + \kern\@centerskip + \box\@btemp + }% -- end \hbox + \vss + }% -- end \vbox + }% -- end \@docaption + }% -- end \mfcaption + % backward compatibility: + \let\label=\mflabel + \let\caption=\mfcaption + % end of object macros +}% -- end \@mfpicture +% setting up optional arguments +\def\@piciii#1#2#3#4{% + \@mfpicture{\@param}{\@param}% + {#1}{#2}{#3}{#4}} +\def\@picii[#1]#2#3#4#5{% + \@mfpicture{\@param}{#1}% + {#2}{#3}{#4}{#5}} +\def\@pici{% + \if[\@nchr\expandafter\@picii + \else\expandafter\@piciii\fi} +\def\mfpicture [#1]{% + {% local env. for \@outrange. + \def\@outrange {% + \immediate\write16 {} + \immediate\write16 + {MFPIC: ** Sorry, mfpic makes characters between 0 and 255, inclusive;} + \immediate\write16 + {MFPIC: ** if you want more, then I suggest you start another graphics font;} + \immediate\write16 + {MFPIC: * in the meantime mfpic will use the dummy font for new graphics.} + \immediate\write16 {} + \font\@graph=dummy\relax + }% -- end \@outrange + \ifx \@code < 0 \@outrange \else + \ifx \@code > 255 \@outrange \fi\fi + }% end local env. + \def\@param{#1}% + \futurelet\@nchr\@pici +}% -- end \mfpicture +% ending mfpicture environment: +\def\endmfpicture{% + \mfcmd{endchar;} + \@docaption\egroup + \hbox to\@graphwd{% + \box\@labeledgraph\hss} + \global\advance\@code1 +}% -- end \endmfpicture +% +% Abbreviations: +\let\mfpic=\mfpicture +\let\endmfpic=\endmfpicture +% +\if@inlatex + \relax +\else % NOT in LaTeX. + % backward compatibility: + \let\picture=\mfpicture + \let\endpicture=\endmfpicture +\fi +% restore catcode. +\catcode`@=\oldatcatcode +% +% end mfpic.tex |