%%%%%%%%%%%%%%%%%%%%%%%%% pointruler.mp (v0.1) %%%%%%%%%%%%%%%%%%%%%%%%%%% % % This file, when run through MetaPost, produces the same ruler as the % ruler.tex of the pointRuler package of Troy Henderson. That package % uses a couple of small C programs to generate a list of coordinates, % and then PiCTeX to connect them in various ways. % % This file is all-in-one and builds an eps file of much smaller size in % one step. The reduced size is mainly because MetaPost uses penstrokes, % while PiCTeX builds lines out of copies of a dot from the font cmr5. % % To create the ruler, run % mpost pointruler.mp % producing the eps file pointruler.mps (if the mpost version is .900 or % higher, otherwise pointruler.1), plus two temporary files mptextemp.mp % and mptextemp.mpx, which may be deleted. The extension .mps allows it to % be directly included as graphics in latex or pdflatex documents. % % (Included in the pointRuler package with the permission of % Troy Henderson.) % % -- Dan Luecking % % You should change prologues to 0 if you only intend to include the % figure in a TeX or LaTeX document. % % If your MetaPost is less than 0.900, probably you want prologues to be % 2 or 0. The value 3 is for embedding fonts, which early mpost couldn't % do. numeric version_num; if known mpversion: prologues:=3; version_num := scantokens (mpversion); else: prologues := 2; version_num := 0.642; fi % Set output filename to pointruler.mps: if version_num > 1.199: outputtemplate := "%j.mps"; elseif version_num > 0.899: filenametemplate %j.mps; fi % tertiarydef makes this like other relations. (Personally, % I would prefer relations bind more strongly than "and" and "or".) tertiarydef a divides b = ((b mod a) = 0) enddef; % Build most of the necessary labels in one call to LaTeX by writing % necessary code to mptextemp.mp (as in the TEX macro). They are % stored in the picture arrays P[] and Q[]. write "verbatimtex" to "mptextemp.mp"; write "%&latex" to "mptextemp.mp"; write "\documentclass[12pt]{article}" to "mptextemp.mp"; write "\begin{document}" to "mptextemp.mp"; write "etex" to "mptextemp.mp"; % The "pt" and "in" labels. write "P[0] := btex {\tiny pt} etex;" to "mptextemp.mp"; write "Q[0] := btex {\tiny in} etex;" to "mptextemp.mp"; % The 86 pictures P[10] through P[860] where, % e.g., P[10] = btex {\scriptsize 10} etex; for n=10 step 10 until 860: write "P[" & decimal n & "] := btex {" & if 20 divides n: "\scriptsize " else: "\tiny " fi & decimal n &"} etex;" to "mptextemp.mp"; endfor % the 12 pictures Q[1] through Q[12] where, % e.g., Q[1] = btex {\scriptsize 1} etex; for n= 1 upto 12: write "Q[" & decimal n & "] := btex {\scriptsize " & decimal n &"} etex;" to "mptextemp.mp"; endfor write EOF to "mptextemp.mp"; % close the file picture P[]; picture Q[]; % Generate the arrays of labels: input mptextemp.mp; numeric hh; path pp; pp := (0,0)--(0,1); % scaled to produce hashmarks. beginfig(0); pickup pencircle scaled .4pt; labeloffset := 2pt; % All the pt scale marks. Each 10th is labeled, the locations staggered % Each 20th is 28pt long, each 10th is 21pt, each 5th is 14 pt and % all the rest 7pt. for n=1 upto 867: if 20 divides n: hh := 28; label.top(P[n],(n*pt, 28pt)); elseif 10 divides n: hh := 21; label.top(P[n],(n*pt,21pt)); elseif 5 divides n: hh := 14; else : hh := 7; fi draw pp scaled (hh*pt) shifted (n*pt,0); endfor % All the inch scale marks. Each inch is labeled. The inch rules are % 28pt long; the 1/2inch are 21pt; the 1/4inch are 14 pt; the % 1/8 inch are 7pt, and the 1/16inch are 3.5pt long.. for n=1 upto 16*12-1 : if 16 divides n: hh:=28; label.bot (Q[n/16],(n*in/16,-28pt)); elseif 8 divides n: hh := 21; elseif 4 divides n: hh := 14; elseif 2 divides n: hh := 7; else: hh := 3.5; fi draw pp scaled (-hh*pt) shifted (n*in/16,0); endfor labeloffset := 0; % The 12th inch is special. No rule is drawn and the label is shifted: draw thelabel.llft (Q12,(12in,-28pt)) shifted (-1pt,-2pt); % The line down the middle and the border. draw (0,0)--(12in,0); draw (0,-in/2)--(12in,-in/2)--(12in, in/2)--(0,in/2)--cycle; % Little squares in two corners to hold the text labels "pt" and "in" draw (0, 28pt)--(10pt, 28pt)--(10pt, in/2); draw (0,-28pt)--(10pt,-28pt)--(10pt,-in/2); % Those text labels: label(P[0], (5pt,.5[ 28pt, in/2])); label(Q[0], (5pt,.5[-28pt,-in/2])); endfig; end