diff options
Diffstat (limited to 'Master/texmf-dist/tex/generic/pictex/texpictex.tex')
-rw-r--r-- | Master/texmf-dist/tex/generic/pictex/texpictex.tex | 244 |
1 files changed, 244 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/generic/pictex/texpictex.tex b/Master/texmf-dist/tex/generic/pictex/texpictex.tex new file mode 100644 index 00000000000..a8763cfd3c3 --- /dev/null +++ b/Master/texmf-dist/tex/generic/pictex/texpictex.tex @@ -0,0 +1,244 @@ +%NAME: texpictex.tex +% texpictex.tex -- The following macros over-ride certain definitions in the +% PiCTeX macro package. The net effect is that line-drawing is done using +% the \special's used by texpic (tpic). Several DVI printers understand +% and handle these specials. +% +% Currently, only straight lines are translated. Recently, I added a +% clipping routine to clip to the bounding box. +% +% If people extend this to included elliptic circles and quadratics, +% please forward the extensions to me (quads are used in the \arrow +% macro, making them very slow). +% +% Dirk Grunwald +% Univ. of Illinois +% grunwald@m.cs.uiuc.edu +% +\def\makebangletter{\catcode`\!=11\relax} +\def\makebangother{\catcode`\!=12\relax} +% +\makebangletter +% +% The units that texpic deals in. You should define it this way instead +% of simply saying ``0.001in'' because the difference in resolution +% actually makes a big difference +% +\newdimen\!tpu +\!tpu=1in +\divide\!tpu by 1000 +%%% +%% \!maptpus -- map a PiCTeX dimension to a TeXPiC dimension +%% using the \!tpu conversion factor. +%% +%% uses: dimen0 +%% +\def\!maptpus#1#2 {\dimen0=#1\divide \dimen0 by \!tpu #2=\dimen0} +% +% ** \setplotsymbol ({PLOTSYMBOL} [ ] < , >) +% ** Save PLOTSYMBOL away in an hbox for use with curve plotting routines +% ** See Subsection 5.2 of the manual. +\def\setplotsymbol(#1#2){% + \!setputobject{#1}{#2} + \setbox\!plotsymbol=\box\!putobject% + \!plotsymbolxshift=\!xshift + \!plotsymbolyshift=\!yshift +% +% Additions: compute size of dot, convert to TPUs and issue a pensize +% + \!dimenB=\wd\!plotsymbol + \!dimenC=\ht\!plotsymbol + \advance\!dimenC by \dp\!plotsymbol + \ifdim\!dimenB<\!dimenC \!dimenF=\!dimenC \else \!dimenF=\!dimenB\fi + \!maptpus{\!dimenF}{\!countC} + \special{pn \the\!countC} + \ignorespaces} + +\setplotsymbol({\fiverm .})% ** initialize plotsymbol + +% ** The following routine is used to draw a "solid" line between (xS,yS) +% ** and (xE,yE). Points are spaced nearly every \plotsymbolspacing length +% ** along the line. +% +% Note: this is a replacement for PicTeX \!linearsolid. +% If line clipping is enabled, the line to be drawn is +% clipped using \!clipline. If there's anything left +% to draw after clipping, it's drawn. If clipping is off, +% the line is simply drawn. In either case, line drawing +% is done by \!texpicline. +% +\def\!linearsolid{% + \let\!nextLinearAct=\!texpicline + \expandafter\ifx \!initinboundscheck \relax + \else \!clipline \if!InBounds \else \let\!nextLinearAct=\relax \fi \fi% + \!nextLinearAct% +} +% +% Texpic has increasing origin in the upper left corner, while +% pictex has origin in bottom left corner. Ergo, we flip the signs +% for y-coordinates. +% +\def\!texpicline{% +\advance\!xS by -\!xorigin +\advance\!xE by -\!xorigin +\advance\!yS by -\!yorigin +\advance\!yE by -\!yorigin +\!maptpus{\!xS}{\!countC} \!maptpus{\!yS}{\!countD} \!countD=-\!countD% +\special{pa \the\!countC \space \the\!countD}% +\!maptpus{\!xE}{\!countC} \!maptpus{\!yE}{\!countD} \!countD=-\!countD% +\special{pa \the\!countC \space \the\!countD}\special{fp}% +\ignorespaces} +% +%%% +% Code to support line clipping +% +% Line clipping routine. Clips to bounding box specified +% by (!checkleft, !checkbot) and (!checkright, !checktop). +% Note that this box is only defined if \initboundscheckon +% has been called. +% +% The clipping algorithm was published in ACM TOG Vol 3 No 1 +% by people at Berkeley, but I've forgotten the complete reference. +% This was translated from a version I wrote in C. +% +%% +% After calling \!cliplines, !InBounds tells you if the line contains +% any points within the clipping window. +% +\newif\if!InBounds +% +%% +% \!clipt -- this corresponds to the routine by the same name +% in the published algorithm. +% +% Dimens used are descibed below. All are grouped and know that +% PiCTeX doesn't use dimen0..9. Variable names are taken from +% the TOG article. The junk on the r.h.s. is indenting information +% +% Globals: dimen8 corresponds to t0 +% dimen9 corresponds to t1 +% +% clipt dimen0 corresponds to p +% dimen1 corresponds to q +% dimen2 corresponds to r +% +% !fastclip Uses bounding boxes +% +% !clipline passes dimen3 to clipt as p +% passes dimen4 to clipt as q +% uses dimen0, dimen2 +% +% +\def\!clipt#1#2{% + \dimen0=#1 \relax \dimen1=#2 \relax + \ifdim \dimen0 < \!zpt% >0 + \!divide{\dimen1}{\dimen0}{\dimen2}% + \ifdim \dimen2 > \dimen9% >1 + \global\!InBoundsfalse + \else% =1 + \ifdim \dimen2 > \dimen8 \dimen8=\dimen2 \fi + \fi% <1 + \else \ifdim \dimen0 > \!zpt% =0>1 + \!divide{\dimen1}{\dimen0}{\dimen2}% + \ifdim \dimen2 < \dimen8% >2 + \global\!InBoundsfalse + \else% =2 + \ifdim \dimen2 < \dimen9 \dimen9=\dimen2 \fi + \fi% <2 + \else% =1 + \ifdim \dimen1 < \!zpt \global\!InBoundsfalse \fi + \fi% <1 + \fi% <0 +} +% +% fastclipcheck +% +\def\!fastclip#1#2{% + \ifdim #1<\!checkleft \global\!InBoundsfalse \else + \ifdim #1>\!checkright \global\!InBoundsfalse \else + \ifdim #2<\!checkbot \global\!InBoundsfalse \else + \ifdim #2>\!checktop \global\!InBoundsfalse \else + \fi + \fi + \fi + \fi} +% +% clipline - clip a line to the current bounding box. +% assumes line is in (!xS, !yS) and extends to (!xE,!yE) and that +% \!xdiff and \!ydiff has been set up. This is normally done +% in \!lstart. +% +% \!clipline first checks to see if the start & end points are +% conainted in the clipping box. If the simple compare works, +% then no clipping is done, else \!doclip is called to +% do the actually clipping computations. +% +\def\!clipline{% + \!!initinboundscheck + \!InBoundstrue + \!fastclip{\!xS}{\!yS}% + \!fastclip{\!xE}{\!yE}% + \if!InBounds\else\!doclip\fi} +% +\def\!doclip{% +\begingroup% + \global\!InBoundstrue% + \dimen8=0pt + \dimen9=1pt + % + \dimen3=-\!xdiff + \dimen4=\!xS \advance\dimen4 by -\!checkleft% fromX-minX + \!clipt{\dimen3}{\dimen4}% +% + \if!InBounds% 0 + \dimen3=\!xdiff + \dimen4=\!checkright \advance\dimen4 by -\!xS% maxX - fromX + \!clipt{\dimen3}{\dimen4}% +% + \if!InBounds% 1 +% + \dimen3=-\!ydiff + \dimen4=\!yS \advance\dimen4 by -\!checkbot% fromY-minY + \!clipt{\dimen3}{\dimen4}% +% + \if!InBounds% 2 +% + \dimen3=\!ydiff + \dimen4=\!checktop \advance\dimen4 by -\!yS% maxY-fromY + \!clipt{\dimen3}{\dimen4}% +% + \if!InBounds% 3 + \dimen0=1pt +% +% The following \if's truncate the line based on the solution +% to the parametric solution to the bounding box. +% +% Note that we don't have a \!multiply, the equivilent to \!divide. +% The code below compute X * Y as (x / ( 1/ Y)), which is far +% from optimal. +% + \ifdim\dimen9 < \dimen0% 4 + \!divide{\dimen0}{\dimen9}{\dimen2}% +% + \dimen3=\!xdiff \!divide{\dimen3}{\dimen2}{\dimen4}% + \global\!xE=\dimen4 \global\advance\!xE by \!xS +% + \dimen3=\!ydiff \!divide{\dimen3}{\dimen2}{\dimen4}% + \global\!yE=\dimen4 \global\advance\!yE by \!yS + \fi% 4 + \ifdim\dimen8 > \!zpt% 4 + \!divide{\dimen0}{\dimen8}{\dimen2}% +% + \dimen3=\!xdiff \!divide{\dimen3}{\dimen2}{\dimen4}% + \global\advance\!xS by \dimen4 +% + \dimen3=\!ydiff \!divide{\dimen3}{\dimen2}{\dimen4}% + \global\advance\!yS by \dimen4 + \fi% 4 + \fi% 3 + \fi% 2 + \fi% 1 + \fi% 0 +\endgroup} +% +\makebangother |