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
|
%*****************************************************************************
% Copyright (c) 1989 by N. N. Billawala
%*****************************************************************************
% widths.mf a file containing width calculation information for the chars
% Essentially all width information is contained in this file to eliminate
% the need to alter the individual character files if width changes are desired.
% Parts of characters are separated so that amounts can be altered as shapes
% change for the lowercase, the stems are all generally of the same weight,
% with possible variation in diagonals.
% The uppercase has more variation in combination of thin/thick vertical
% stems, so the method for choosing widths was changed to depend on
% stem weights and an idea of proportions
% Fixed width characters and numbers have a constant total width,
% but reference and fitting proportions vary within this space
% Punctuation was partly based on uc/lc widths, but otherwise
% independent amounts given.
vardef variable_character_reference_widths=
save thick,thin,thickk,thinn,bowll;
thick=stem.uc#/max(width#,1); uc:=.35*boldness;
uc1=.35*boldness; uc4=.35; % always=.35;
uc2:=1+if boldness<1:.25 else:0 fi; % uc2 for diagonals
thin=thin_stem.uc#/max(width#,1); lc.arch_space:=.21*boldness;
thickk=stem.lc#/max(width#,1); lc.bowl_space:=.24*boldness;
thinn=thin_stem.lc#/max(width#,1); lc.o_space:=.27*boldness;
bowll=bowlstem.lc#/max(width#,1); lc.diagonal_space:=.3*boldness;
i_w=thickk; % i l the "_w" is for "width"
j_w=thickk+.55*lc.arch_space; % j
s_w=uc2*(thickk+lc.o_space); % s t z ***
c_w=uc2*(bowll+lc.o_space); % c ***
a_w=thickk+bowll+lc.arch_space; % a(halfbowl)
b_w=thickk+bowll+lc.bowl_space; % b a d e g p q k ss-lig
r_w=2thickk+.5*lc.arch_space; % r f
n_w=2thickk+lc.arch_space; % n h u
m_w=3thickk+2*lc.arch_space; % m
o_w=2bowll+lc.bowl_space; % g(halfbowl)
oo_w=2bowll+lc.o_space; % o
v_w=(uc2)*(thickk+thinn)+lc.diagonal_space; % v x y ***
w_w=(uc2)*(thickk+thinn)+thickk+1.5lc.diagonal_space; % w ***
oe_w=oo_w+o_w-bowll; % oe
ae_w=2b_w-bowll; % ae
accent_w=.8n_w; % accents
I_w=thick; % I
J_w=thick+.5uc; % J
E_w=thick+.85uc4; % E F L GAMMA ****
T_w=thick+1.25uc1; % T ****
B_w=2thick+.75uc; % B P
R_w=2thick+.85uc1; % R PI XI K ****SIGMA
H_w=2thick+uc; % H C
D_w=2thick+1.1uc; % D G
O_w=2thick+1.25uc; % O Q DELTA THETA
N_w=H_w; % N
S_w=thick+thin+.75uc; % S Z ****
U_w=thick+thin+uc; % U ****
A_w=(uc2)*(thick+thin)+1.25uc1; % A V Y LAMBDA X ****
M_w=(uc2)*2(thick+thin)+1.25uc; % M
W_w=(uc2)*(2thick+thin)+1.5uc1; % W ****
AE_w=E_w+2/3*A_w; % AEligature
OE_w=E_w+O_w-thick; % OEligature
v_a=.50; % for straight strokes the "v_" is for "variable"
v_b=.42; % for arches
v_c=.28; % for bowls
v_d=.24; % for thick diagonals
v_e=v_d-(thickk-thinn); % for thin diagonals
v_f=.20; % for half open shapes
v_g=.10; % for open strokes
v_h=.08; % for open strokes
v_A=.5; % for thick straight
v_B=v_A-(thick-thin); % for thin straight
v_C=.2; % for bowls
v_D=.16; % for thick diagonals
v_E=v_D-(thick-thin); % for thin diagonals
v_F=.2; % for half open sides
v_G=.16; % for half-very open sides
v_H=.12; % for very open sides
v_I=.1; % for the L
enddef;
variable_character_reference_widths;
%***** for numbers *****
num_width_a#=.2width#; num_fit_a#+num_width_a#=.55width#; % 1
num_width_b#=.4width#; num_fit_b#+num_width_b#=.55width#; % 2 3 5 7 $
num_width_c#=.44width#; num_fit_c#+num_width_c#=.55width#; % 6 9 0
num_width_d#=.47width#; num_fit_d#+num_width_d#=.55width#; % 8
num_width_e#=.50width#; num_fit_e#+num_width_e#=.55width#; % 4
%***** for single pitch fonts *****
% *_*mono# gives the character reference width within the total per char width
% *_mfit# is the amount of space left after the reference width is taken away
% *_*mono#+*_mfit# give the total width of the character
% In the case of single pitch fonts, the total width is always the same.
% In cases where, e.g., three instead of only one width is desired, the
% value of 1*mono# can be changed
a_mono#:=.6mono#; a_mfit#+a_mono#=mono#; % fjrJ',.:;
b_mono#:=.7mono#; b_mfit#+b_mono#=mono#; % "mid" width
c_mono#:=.75mono#; c_mfit#+c_mono#=mono#; % abdgkpq069
d_mono#:=.8mono#; d_mfit#+d_mono#=mono#; % eotvxyz4689CDGKOQ%&*^
e_mono#:=.9mono#; e_mfit#+e_mono#=mono#; % AVXY4
f_mono#:=.9mono#; f_mfit#+f_mono#=mono#; % mwMW@ ae oe AE OE
define_pixels(a_mono,b_mono,c_mono,d_mono,e_mono,f_mono,
a_mfit,b_mfit,c_mfit,d_mfit,e_mfit,f_mfit);
% The following give fit adjustments for single pitch characters
m_a=.5; % this amt is always .5
m_b=.55; m_bb+m_b=1; % BDEFGKPR7
m_c=.55; m_cc+m_c=1; % abdghkmnpqu()
m_d=.6; m_dd+m_d=1; % C
m_e=.65; m_ee+m_e=1; % cflrt AE []
m_f=.75; m_ff+m_f=1; % JL
%**********
% need to account for serifs
% recognizing that a straight ascender may carry different visual value as
% straight of x-height
%**********
|