% do uverejneni clanku o INCPIC.TEX v TeX bulletinu mohou podlehat makra
% INCPIC.MF a INCPIC.TEX vyvojovym zmenam. Jakekoliv chyby, ktere se
% vyskytnou, mi laskave sdelte. Dekuji
%
% Macro for drawing simple pictures in METAFONT
% For each character the width and height is given also in user's units.
% All points are expressed in user's unit (without length units).
% For more comment see end of this file.
% Detail description appeared (in Czech) in TeXbulletin 1992, No 2,3
%
% Prague, July 29, 1992 Oldrich Ulrych
% Mathematical institute of Charles University
% email: oulrych@cspguk11.bitnet
%
% new definition for screen window
%
def openit = openwindow currentwindow
from origin to (640,480) at (-50,350); enddef;
%
% neither mesh nor rounding box are generated by default
%
showmesh:=0; % don't show given mesh
showbox:=0; % don't make box around
ou_showmesh:=0;
ou_showbox:=0;
%
% private mode for intial suggestion of pictures;
%
mode_def ouproof =
proofing:=2; % yes, we're making full proofs
fontmaking:=0; % no, we're not making a font
tracingtitles:=1; % yes, show titles online
pixels_per_inch:=100;% original is that's 36 pixels per pt
blacker:=0; % no additional blackness
fillin:=0; % no compensation for fillin
o_correction:=1; % no reduction in overshoot
showmesh:=1; % show given mesh
showbox:=1; % make box around
ou_showmesh:=1;
ou_showbox:=1;
enddef;
%
% choosing the mode
%
if unknown mode: mode=ouproof; fi % selection of private mode for proofing
%
% redefined beginch and endch for plotting pictures
%
def beginch(expr c, % code of character
w_sharp, % sharp width
h_sharp, % sharp height
d_sharp, % sharp depth
number_of_xunits, % width of char in user's units
number_of_yunits)= % height of char in user's units
begingroup
transform end_of_beginch;
charcode:=if known c: byte c else: 0 fi;
charwd:=w_sharp; charht:=h_sharp; chardp:=d_sharp; charic:=0;
w:=hround(charwd*hppp); h:=vround(charht*hppp); d:=vround(chardp*hppp);
fontdimen byte c-63 : w_sharp/number_of_xunits; %% measure of x-unit
fontdimen byte c-43 : h_sharp/number_of_yunits; %% measure of y-unit
x_unit:=w/number_of_xunits; nx_unit:=number_of_xunits; % auxiliary x-unit
y_unit:=h/number_of_yunits; ny_unit:=number_of_yunits; % auxiliary y-unit
w:=number_of_xunits; h:=number_of_yunits;
d:=h*d_sharp/h_sharp;
charic:=0; clearxy; clearit; clearpen; scantokens extra_beginchar;
aux_sx:=x_unit; aux_sy:=y_unit;
currenttransform:=identity xscaled aux_sx yscaled aux_sy;
shiftorigin(0,0);
end_of_beginch:=currenttransform;
enddef;
%
def endch =
currenttransform:=end_of_beginch;
gl_showmesh:=showmesh;
gl_showbox :=showbox;
showmesh:=ou_showmesh;
showbox :=ou_showbox;
if proofing>0: makebox(proofrule); fi % I don't like rules
if gl_showmesh>0: mesh; fi % show given mesh
if gl_showbox>0: roundingbox; fi % make box around
chardx:=w; % desired width of the character in pixels
charic:=orig_x_shift*charwd/nx_unit;
if orig_x_shift<>0: fontdimen charcode-23 : orig_y_shift*charht/ny_unit; fi;
scantokens extra_endchar;
shipit;
if displaying>0: showit; fi
endgroup enddef;
%
% macros used in endch;
%
def roundingbox =
pickup pencircle scaled 0.4pt;
draw(0,-d)--(w,-d)--(w,h)--(0,h)--(0,-d);
draw(0,0)--(w,0);
enddef;
def mesh =
pickup pencircle scaled 0.4pt;
for i=0 step 1 until w: draw (i,-d)--(i,h); endfor;
for i=0 step 1 until h: draw (0,i)--(w,i); endfor;
if d>0: for i=0 step 1 until d: draw (0,-i)--(w,-i); endfor; fi;
enddef;
%
% macro for shift of user's origin
%
def shiftorigin(expr x,y) =
orig_x_shift:=x; orig_y_shift:=y;
currenttransform:=currenttransform shifted
(-orig_x_shift*aux_sx,-orig_y_shift*aux_sy);
enddef;
%
% path for plotting arrow and axes;
%
path sharparrow;
sharparrow:=(-3,1)..{right}(0,0)&(0,0){left}..(-3,-1);
def axes expr bod =
draw (0+orig_x_shift,ypart bod)--(w+orig_x_shift,+ypart bod);
draw (xpart bod,-d+orig_y_shift)--(xpart bod,h+orig_y_shift);
filldraw arrow(hround(3mm#*hppp),90) shifted (xpart bod,h+orig_y_shift);
filldraw arrow(hround(3mm#*hppp), 0) shifted (w+orig_x_shift,ypart bod);
enddef;
def vector(expr poc,kon) =
draw poc--kon;
filldraw arrow(hround(2mm#*hppp),angle(kon-poc)) shifted kon;
enddef;
def arrow (expr delka, smer)=
begingroup turningcheck:=0;
((-delka,-2/7delka){dir45}..{right}(0,0)&(0,0){left}..{dir135}
(-delka, 2/7delka)&(-delka, 2/7delka)..controls (-3/4delka,0)..cycle)
rotated smer xscaled (1/aux_sx) yscaled (1/aux_sy)
endgroup
enddef;
%
% macro for dotted and dashed lines
%
s__r:=10;
def add_slen(expr a,b) =
s__x:=(xpart(b)-xpart(a))*x_unit/(hppp*s__r);
s__y:=(ypart(b)-ypart(a))*y_unit/(hppp*s__r);
s__:=s__+length((s__x,s__y));
enddef;
def cerchovane (expr a,b)=
s__:=0; add_slen(a,b);
ju:=round(s__);
for i=1 upto ju:
t1:=(2*i-2)/(2*ju-1);
t2:=(2*i-1)/(2*ju-1);
draw t1[a,b]--t2[a,b];
t1:=(2*i)/(2*ju-1);
if ieps_);
exitunless (t_rightp_count): t_right:=p_count; fi;
endfor;
tenkepero;
draw subpath (t_left,t_middlea) of g_path;
draw subpath (t_middleb,t_right) of g_path;
last_dif:=t_right-t_left;
t_left:=t_right;
exitunless (t_rightp_count): t_right:=p_count; fi;
endfor;
enddef;
%
% various pens
%
def penfordots = pickup pencircle scaled 10thinestline; enddef;
def thickpen = pickup pencircle scaled 4thinestline; enddef;
def middlepen = pickup pencircle scaled 2thinestline; enddef;
def thinpen = pickup pencircle scaled thinestline; enddef;
def drawdots (text t) = for $=t: drawdot $; endfor; enddef;
def cdrawdot expr bod =
drawdot bod; pickup currentpen scaled 2/3; erase drawdot bod;
pickup currentpen scaled 1.5;
enddef;
def cdrawdots (text t) =
for $=t: drawdot $; endfor;
pickup currentpen scaled 2/3;
for $=t: erase drawdot $; endfor;
pickup currentpen scaled 1.5;
enddef;
%
% Czech equivalents and equivalents of previous versions
%
let peronatecky=penfordots;
let peronapuntiky=penfordots;
let tenkepero=thinpen;
let strednipero=middlepen;
let tlustepero=thickpen;
let puntiky=drawdots;
let krouzek=cdrawdot;
let drawcontourdot=cdrawdot;
let drawcontourdots=cdrawdots;
let krouzky=cdrawdots;
let carkovane=dashed;
let carkovanacesta=dashedpath;
%
% call mode_setup
%
font_size 100mm#;
mode_setup;
thinestline:=0.4pt;
%endinput;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% The overview of the preparation of the picture is following:
% - make a chart of the picture on the paper with the regular scale.
% - put down the coordinate system (using mesh on the paper --- units
% correspond to the mesh)
% - mark the significant points for drawing
% - put the description into the picture
% - make oblong around the picture (using the mesh on the paper)
% in such a way that the description in the picture is included;
% this oblong corresponds to the rounding box of the the character
% in which the picture will be placed
% - choose the reference point (on the left side of the rounding box)
% of the character
% - create metafont source of the chart --- besides the usual commands
% of metafont the definitions from this package can simplify
% the writing of metafont source (see below) and enable to transfer
% some important information through font to the TeX document
% - place the character from the new font created into the TeX document;
% some significant dimensions are stored in fontdimens, so they can
% simplify the placing of the description into the picture
%
% Useful definitions from this macro package (with the context of the
% procedure described above):
%
% beginch(char,width,height,depth,x_units,y_units); introduces the
% created character; the parameters have the following meaning:
% char - code of the character (admissible values are: "A" to "I",
% (or "A" to "S" if macro shiftorigin is not used))
% width - width of the character in sharp units (for example 20mm#)
% height - height of the character in sharp units
% depth - depth of the character in sharp units
% x_units - width of the picture expressed in the number of the
% "squares" of the mesh on the paper (i.e. natural number
% just number without any units)
% y_units - height of the character (not depth) expressed in the
% number of the "squares" of the mesh on the paper (i.e.
% natural number just number without any units)
% Using this macro as the begin of the character, all points can be
% given in the number of the "squares" of the mesh on the paper (no
% measures are needed). (If c denotes code of the given character,
% then values width/x_units, height/y_units are stored in the
% fontdimen c-63, fontdimen c-43, respectively).
% endch; closing command for character.
% If before endch the variable showmesh is positive, then
% the character contains the mesh corresponding to the mesh on the
% paper.
% If before endch the variable showbox is positive, then
% the character contains the rounding box.
% Macros beginch and endch create group, so that changes
% betweenthem are local.
% shiftorigin(x,y); says the origin of the choosen coordinate system
% with respect to the reference point of the character is (x,y)
% (expressed in the "squares" of the mesh on the paper).
% Corresponding sharp value in the vertical direction is stored
% in the italic correction of the character. If value x is nonzero,
% than the corresponding sharp value is stored in the fontdimen c-23
% (see beginch above);
% sharparrow is the path --- simple arrow with the tip
% in the origin, the length of three units and width of two units,
% it has direstion of the x-axe
% axes z; puts the coordinate system into the picture; the
% intersection of axes is at the point z
% arrow (len,ang) is the outline of the arrow with the tip
% in the origin, with given length len and in given direction ang
% vector(sta,sto); is the vector from the point sta to the point sto
% cerchovane(sta,sto); plots dashed and dotted line from the point sta
% to the point sto
% dashed(sta,sto); plots dashed line from the point sta to the point sto
% dashedpath pat; plots dashed path pat
% penfordots; chooses circle pen of the width diameter 10*thinestline
% (for the value of thinnestline see below);
% thinpen; chooses circle pen of the width diameter thinestline
% middlepen; chooses circle pen of the width diameter 2*thinestline
% thickpen; chooses circle pen of the width diameter 4*thinestline
% drawdots(poi); draws dots (with choosen pen) from the list poi of
% points
% cdrawdot(poi); draws only contour of dot at the point poi
% cdrawdots(poi); at each point of the list poi draws contour of dot
%
% Default values of some variables:
% showmesh:=0; mesh is not shown
% showbox:=0; rounding box is not shown
% mode=ouproof; if no mode is specified (the output is shown on the
% screen and the values showmesh, showbox are set
% positive in the definition of beginch)
% eps_:=0.001; tolerance for iterativ process when the length of the
% dashes is computed (in dashedpath)
% len_given:=2; experimental value determining the length of the dashes
% (in dashedpath)
% s__r:=10; experimental value determining the length of the dashes
% (in dashed and cerchovane)
% font_size 100mm#; no value in the picture will be greater than 1.6m
% thinestline:=0.4pt; the thickness of the thinnest pen
%
% Czech equivalents for some macros:
% peronatecky is the same as penfordots
% peronapuntiky is the same as penfordots
% tenkepero is the same as thinpen
% strednipero is the same as middlepen
% tlustepero is the same as thickpen
% puntiky is the same as drawdots
% krouzek is the same as cdrawdot
% drawcontourdot is the same as cdrawdot
% krouzky is the same as cdrawdots
% drawcontourdots is the same as cdrawdots
% carkovane is the same as dashed
% carkovanacesta is the same as dashedline
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%