%
% SKTDEFS.MF
%
% Revision 1.0 1996/02/13 Charles Wikner [email protected]
% Revision 2.0 1996/11/27 Charles Wikner [email protected]
% Revision 2.1 1997/02/11 Charles Wikner [email protected]
%
% Copyright 1996 & 2002 Charles Wikner
% This program can be redistributed and/or modified under the terms
% of the LaTeX Project Public License Distributed from CTAN
% archives in directory macros/latex/base/lppl.txt; either
% version 1 of the License, or any later version.
%
% Make pen adjustments here.
%
 thin_weight := 2;                % factor to increase thin pen stroke
 penwd# := cap#/pen_scale;          % width of horizontal or vertical pen stroke
 penht# := penwd#;                  % ht = wd, at this stage anyway!
   thin# := (penwd#/6.5cosd(45))*thin_weight;     % pen stroke width at 135-deg
     thick# := (pen_ratio*6.25thin#)/thin_weight; % pen stroke width at 45-deg
%
 ht# := cap#;                       % character height at horizontal line
 wd# := charwd_scale*ht#;           % character width - nominal reference
%

define_pixels(penwd,penht,wd);
define_whole_pixels(ht);
define_blacker_pixels(thin,thick);
smoothing := 0;

font_slant := slant;
font_quad wd#;                % specifies width of `em'
font_x_height cap#;           % specifies height of `ex'
font_normal_space := .75wd#;  % inter-word spacing
font_normal_stretch := .5wd#; % glue for inter-word spacing
font_normal_shrink  := .2wd#; % glue for inter-word spacing

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%        P E N   D E F I N I T I O N S                                         %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

clear_pen_memory;

pickup pencircle xscaled thick yscaled thin rotated (pen_rot);
 main_pen := savepen;

if unknown squarepen :
 capsule_def (squarepen) makepen (unitsquare shifted (-.5,-.5)
 scaled thick rotated 135);
fi

if unknown penoffsquare :
 capsule_def (penoffsquare) makepen (unitsquare shifted (0,-.5));
fi

pickup penoffsquare xscaled (.8thick) yscaled (1.4thin) rotated pen_rot;
 mpen135 := savepen;

pickup penoffsquare xscaled (.8thick) yscaled (1.4thin) rotated (pen_rot-180);
 mpen315 := savepen;

pickup penoffsquare xscaled (.8thin) yscaled (1.4thick) rotated (pen_rot+90);
 mpen225 := savepen;

pickup penoffsquare xscaled (.8thin) yscaled (1.4thick) rotated (pen_rot-90);
 mpen45 := savepen;

pickup pencircle xscaled .667thick yscaled thin rotated (pen_rot);
 sub_pen := savepen;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%        M A C R O S                                                           %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

def mdraw expr p =
 pickup main_pen;
 draw p;
 cullit
enddef;

def bedraw expr p =
 picture savedpicture; savedpicture = currentpicture; clearit;
 pickup main_pen;
 draw p;
 cullit;
 trim (point 0 of p, 180+angle direction 0 of p);
 trim (point infinity of p, angle direction infinity of p);
 cullit;
 addto currentpicture also savedpicture
enddef;

def bdraw expr p =
 picture savedpicture; savedpicture = currentpicture; clearit;
 pickup main_pen;
 draw p;
 cullit;
 trim (point 0 of p, 180+angle direction 0 of p);
 cullit;
 addto currentpicture also savedpicture
enddef;

def edraw expr p =
 picture savedpicture; savedpicture = currentpicture; clearit;
 pickup main_pen;
 draw p;
 cullit;
 trim (point infinity of p, angle direction infinity of p);
 cullit;
 addto currentpicture also savedpicture
enddef;

vardef trim (expr z, theta) =
   if (theta <= 0) : alpha := (theta + 360) ;
   else : alpha := theta;
   fi
   if ((alpha < 120) or (alpha > 330)) : pickup mpen45;
   elseif ((alpha >= 120) and (alpha <= 150)) : pickup mpen135;
   elseif ((alpha >= 300) and (alpha <= 330)) : pickup mpen315;
   else : pickup mpen225;
   fi
 undrawdot z;
enddef;

def vector (expr z, length, theta) =
 z--z shifted (length * cosd theta, length * sind theta)
enddef;

def putdot expr z =
 pickup squarepen; drawdot z;
enddef;

def empty =
   pickup pencircle;
   draw (12W,0)--(12W,12H)--(0,0)--(12W,0)--(0,12H)--(12W,12H);
   draw (0,0)--(0,12H);
enddef;

% sdraw = mdraw with sub-pen
def sdraw expr p =
 pickup sub_pen;
 draw p;
 cullit
enddef;

% sbdraw = bdraw with subpen
def sbdraw expr p =
 picture savedpicture; savedpicture = currentpicture; clearit;
 pickup sub_pen;
 draw p;
 cullit;
 trim (point 0 of p, 180+angle direction 0 of p);
 cullit;
 addto currentpicture also savedpicture
enddef;

% sedraw = edraw with subpen
def sedraw expr p =
 picture savedpicture; savedpicture = currentpicture; clearit;
 pickup sub_pen;
 draw p;
 cullit;
 trim (point infinity of p, angle direction infinity of p);
 cullit;
 addto currentpicture also savedpicture
enddef;

% sbedraw = bedraw with subpen
def sbedraw expr p =
 picture savedpicture; savedpicture = currentpicture; clearit;
 pickup sub_pen;
 draw p;
 cullit;
 trim (point 0 of p, 180+angle direction 0 of p);
 trim (point infinity of p, angle direction infinity of p);
 cullit;
 addto currentpicture also savedpicture
enddef;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%        M A G I C    N U M B E R S                                            %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

def H  := ht/12 enddef;
def W  := H     enddef; % used to be wd/12, but because angles used in
                       % defining pen movements would also need to change
                       % with aspect ratio, it is simpler to work with a
                       % fixed grid and then use TRANSFORMATION to scale
                       % the x-axis.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%        F I N I S                                                             %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

currenttransform:=identity xscaled (wd#/ht#) slanted slant;