summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/pointRuler/pointruler.mp
blob: 368ba25264fa25e5cc9644a462bea8da51bb9353 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
%%%%%%%%%%%%%%%%%%%%%%%%% 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