summaryrefslogtreecommitdiff
path: root/macros/plain/contrib/misc/texpictex.tex
diff options
context:
space:
mode:
Diffstat (limited to 'macros/plain/contrib/misc/texpictex.tex')
-rw-r--r--macros/plain/contrib/misc/texpictex.tex244
1 files changed, 244 insertions, 0 deletions
diff --git a/macros/plain/contrib/misc/texpictex.tex b/macros/plain/contrib/misc/texpictex.tex
new file mode 100644
index 0000000000..fa979d4b70
--- /dev/null
+++ b/macros/plain/contrib/misc/texpictex.tex
@@ -0,0 +1,244 @@
+%
+% 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