summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/fonts/source/public/cb/cbaccent.mf
blob: 09ea74658c188b5b635abe74171bdba5e398170c (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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
% Copyright (C) 1997, 1999, 2001, 2002 Claudio Beccari
% file cbaccent.mf v.2.0f 2001/04/09
% Added cap-cedilla and sloping sides of nexus 2001/02/25
% modified circumflex for the cbleipzig fonts 2001/04/22
%
% The accent macros that follow  are  used  by  all  the  vowel  macros  for
% generating the ligatures; they mostly come from Computer Modern.
%
% CB added the tests on boolean  monotoniko whose value is set either by the
% driver files or it is false by default. Fixed the currentbreadth problem,
% and changed several dimensions so as to work well with different parameter
% settings.
%
% Several accents were completely redesigned, in particular grave and acute
% and their combinations with diaeresis or breaths are such that do not
% change  according to the letter they accompany;  in  a  different  way
% also the circumflex and the diaeresis have been modified accordingly.
%
% Booleans monotoniko and toniko are remains of a previous test version
% where the monotoniko accent  was the single one for modern Greek designed as
% a vertical stroke; thanks to Apostolos Syropoulos this feature has been
% eliminated.
% (1999) CB added definitions for adscript iota to be used with upper
% case Alpha, Eta and Omega, and for the corresponding small cap variants.
boolean toniko, squeeze;
% minimum distance between vowel and accent
def separator=max(1,vround(x_height/10)) enddef;
def grave(expr center) =
numeric acc_sgn,acc_displ; acc_displ:=center;
if monotoniko:
  acc_sgn:=0;
else:
  acc_sgn:=+1;
fi
generate_grave;
enddef;
def acute(expr center) =
numeric acc_sgn,acc_displ; acc_displ:=center;
if monotoniko:
  acc_sgn:=0;
else:
  acc_sgn:=-1;
fi
generate_grave;
enddef;
% The next definition draws both the grave (as its name suggests) and the
% acute accents, the difference being the value of acc_sgn, where
% acc_sgn=+1 tilts the accent to the left (grave)
% acc_sgn=-1 tilts the accent to the right (acute)
% acc_sgn=0 does not tilt the accent (monotoniko)
vardef generate_grave=
  numeric accent_tilt, alto, basso; accent_tilt:=if cbleipzig or cbroman:20else:30fi;
  alto:=h;  basso:=vround .8[h,x_height];
  1/3[x22,x21]=acc_displ;
if serifs: pickup crisp.nib;
  accent_tilt:= acc_sgn*(accent_tilt+angle(alto-basso,.5currentbreadth));
  pos22(max(stem/5,currentbreadth+eps),accent_tilt); pos21(stem,accent_tilt);
  if monotoniko:
    bot y22=basso; top y21=alto; x22-x21=(alto-basso)*sind accent_tilt;
  else:
    bot y22=basso; top y21+.5stem=alto;
    z21-z22=whatever*dir(90+accent_tilt);
  fi
  filldraw circ_stroke z21e--z22e;  % diagonal
else: pickup fine.nib;
  accent_tilt:= acc_sgn*accent_tilt;
  pos21(stem,0); pos22(vair,0);
  top y21=alto; bot y22=basso; x22-x21=(alto-basso)*sind accent_tilt;
  filldraw stroke z21e--z22e; % diagonal
fi
penlabels(21,22);
currentbreadth:=0;
enddef;
def circumflex(expr center)=
if monotoniko:
  grave(center);
else:
  generate_circumflex(center);
fi
enddef;
def generate_circumflex(expr center)=
numeric mid_width;
if slitex: %                            for slides it looks like a cap
  mid_width=vair;
  pos21(vair,-180); pos23(vair,0); y21=y23;
  lft x21r=hround(center-if monospace and (w<6u):1.5u else:max(3u,2w/5)fi);
  .5[rt x23r,lft x21r]=center;
  x22=center; pos22(mid_width,90);
  bot y23=vround(max(h-2mid_width,x_height+mid_width));
  top y22r=h+o;
  if bot y23>=top y22r: bot y23:= top y22r-mid_width; fi
  filldraw stroke z21e{up}...z22e...{down}z23e;
elseif cbleipzig:
 h':=if h=Circ_ht:h else:10/7x_height fi;
 numeric theta; theta=angle(1/6(6u-vair),1/4(asc_height-x_height));
 pickup crisp.nib;
 mid_width=.4[vair,stem];
 pos[21](vair,theta+90);
 pos[22](vair,theta+90);
 pos[23](vair,theta+90);
 pos[24](vair,theta+90);
 z[22]-z[21]= z[24]-z[23]=(mid_width-crisp)*dir theta;
 lft x[21]r=hround(center-max(3u,w/2-2.5u));
 rt x[24]l=hround(center+max(3u,w/2-2.5u));
 top y[24]r=h';
 pair delta;
 ypart delta=3(y[23]l-y[21]l);
 delta=whatever*dir theta;
 numeric deltay; deltay=vround(Circ_ht-(y24r-y23r)-(.4(bot y[21]l-top y[21]r)+2/3[x_height,Circ_ht]));
 bot y[21]l=y23l-deltay;
            %if h=Circ_ht:
            %    vround(bot y[21]l-top y[21]r+min(2/3[x_height,Circ_ht],y[23]l-.25vair));
            %else:
             %   vround(y[23]l-.5dot_size)
            %fi;
 filldraw z[21]l..controls(z[21]l+delta)and(z[23]l-delta)..z[23]l..z[24]l--z[24]r..
     controls(z[24]r-delta)and(z[22]r+delta)..z[22]r..z[21]r--cycle;  % stroke
else:
  mid_width:=if squeeze:.3 else: .5 fi [vair,stem];
  pickup fine.nib; 
  pos21(hround(mid_width-eps),180); 
  pos22(vair,90);
  pos23(mid_width,45); 
  pos24(vair,90); 
  pos25(hround(mid_width-eps),180);
  lft x21r=hround(center-if monospace: 
                            if(w<5u):1.5u else:max(3u,w/3)fi 
                         else:
                            max(3u,w/3)
                         fi);
  .5[rt x25l,lft x21r]=center;
  (x22-x21)=x23-x22=x24-x23=(x25-x24);
  if h=Circ_ht:
    bot y21l=bot y24l=vround(.45[h,x_height+.5mid_width]);
  else:
    bot y21l=bot y24l=vround(max(.5[h,x_height],x_height if not SansSerif:+o fi+separator));
  fi
  top y22r=top y25r=h;
  y23=.5[y22,y24];
  filldraw stroke z21e{up}...z22e{right}..z23e..{right}z24e...{up}z25e; % stroke
fi
penlabels(21,22,23,24,25);
currentbreadth:=0;
enddef;
vardef diaeresis(expr center)=
  generate_diaeresis(center,dot_size,dot_size+1.75u,h,x_height+separator);
enddef;
vardef diaeresis_acute(expr center)=
  acute(center);
  generate_diaeresis(center,6/8dot_size,13/8dot_size if cbleipzig or SansSerif:+u fi,.5[h,x_height],x_height+separator);
enddef;
vardef diaeresis_grave(expr center)=
  grave(center);
  generate_diaeresis(center,6/8dot_size,13/8dot_size if cbleipzig or SansSerif:+u fi,.5[h,x_height],x_height+separator);
enddef;
vardef diaeresis_circumflex(expr center)=
  if monotoniko:
    grave(center);
    generate_diaeresis(center,.9dot_size,-1,.5[h,x_height],x_height+separator);
  else:
    generate_circumflex(center);
    numeric sp_bottom, sp_top;
    if (not slitex):
      sp_top=vround(.15[bot y21l,x_height]);
      sp_top+sp_bottom=bot y21l+x_height;
    else:
      sp_top=vround(.5[bot y21l,bot y22l]-separator);
      sp_bottom=vround(x_height+separator);
    fi
    generate_diaeresis(center,6/8dot_size,11/8dot_size if cbleipzig:+u fi,sp_top,sp_bottom);
  fi
enddef;
vardef generate_diaeresis(expr center,target_dot_diam,sep,eff_h,base)=
pickup tiny.nib; numeric dot_diam;
dot_diam:=max(tiny.breadth,hround(target_dot_diam));
pos31(dot_diam,0); pos32(dot_diam,90); x31=x32; top y32r=vround(eff_h);
if bot y32l<base: y32l:=min(y32r-eps,base+.5currentbreadth); fi
y31=.5[y32l,y32r];
pos33(dot_diam,0); penpos34(y32r-y32l,90); y33=y34=y31; x33=x34;
if sep>=0 : 
  center=.5[x31,x33]; x33-x31=sep;
else:
  y35l=y35r=.5[y31,y32]; z35l=whatever[z21l,z22l]; z35r=whatever[z21r,z22r];
  rt x31r=hround((min(x35l,x35r)-.5currentbreadth)-.05w);
  lft x33l=hround((max(x35l,x35r)+.5currentbreadth)+.05w);
fi
dot(31,32); dot(33,34);
penlabels(31,32,33,34,35);
currentbreadth:=0;
enddef;
def rough(suffix $,@)(expr dot_size,depth,shear) =
 if (not monotoniko):
   pickup fine.nib; pos$(dot_size,90);
   if square_dots:
    pos$'(dot_size,180); z$'=z$; dot($',$);  % squarish dot
    comma_join_:=max(fine.breadth,floor .7dot_size);
    comma_bot_:=max(fine.breadth,floor .5dot_size);
    pos@0(comma_join_,180); pos@1(comma_join_,180);
    pos@2(comma_bot_,180); y@0=y$; y@1=y$l; y@2=y@1+dot_size-depth;
    x@0r=x@1r=x$'r; lft x@2r=good.x(x$-eps);
    filldraw stroke z@0e--z@1e..z@2e;  % tail
   else:
    tail_thick:=if cbleipzig:
                    max(.4dot_size,currentbreadth+eps);
                elseif SansSerif:
                    max(dot_size/2,currentbreadth+eps);
                else:
                    if (fine>.2dot_size):floor(min(fine.breadth,vair))
                    else:max(vair/2,currentbreadth+eps)fi
                fi;
    pos@1(tail_thick,90); pos@2(tail_thick,180); pos@3(tail_thick,-90);
    z@1r=z$r; lft x@2r=hround(x$-.5depth+.5shear if (cbleipzig and (top y$r<Circ_ht)):-.2dot_size fi);
    x@3+.5tail_thick=x$+.5dot_size+shear;
    y@2=.5[y@1,y@3]; bot y@3r=vround(top y@1r-depth);
    y_:=ypart((z@1{left}...z@2{down}...z@3)
     intersectiontimes (z$l{left}..{right}z$r)); if y_<0: y_:=1; fi
    filldraw z$r{right}..subpath (0,y_) of (z$l{left}..{right}z$r)--cycle; % dot
    if monospace:                                                          % tail
      draw z@1{left}...z@2{down}...{right}z@3;
    else:
      filldraw stroke z@1e{left}...z@2e{down}...{right}z@3e;
    fi
   fi
   penlabels(@1,@2,@3,$);
 fi
 currentbreadth:=0;
 enddef;
def smooth(suffix $,@)(expr dot_size,depth,shear) =
 if not monotoniko:
   pickup fine.nib; pos$(dot_size,90);
   if square_dots:
    pos$'(dot_size,0); z$'=z$; dot($',$);  % squarish dot
    comma_join_:=max(fine.breadth,floor .7dot_size);
    comma_bot_:=max(fine.breadth,floor .5dot_size);
    pos@0(comma_join_,0); pos@1(comma_join_,0);
    pos@2(comma_bot_,0); y@0=y$; y@1=y$l; y@2=y@1+dot_size-depth;
    x@0r=x@1r=x$'r; rt x@2r=good.x(x$-eps);
    filldraw stroke z@0e--z@1e..z@2e;  % tail
   else:
    tail_thick:=if cbleipzig:
                    max(.4dot_size,currentbreadth+eps);
                elseif SansSerif:
                    max(dot_size/2,currentbreadth+eps);
                else:
                    if (fine>.2dot_size):floor(min(fine.breadth,vair))
                    else:max(vair/2,currentbreadth+eps)fi
                fi;
    pos@1(tail_thick,90); pos@2(tail_thick,0); pos@3(tail_thick,-90);
    z@1r=z$r; rt x@2r=hround(x$+.5depth+.5shear if (cbleipzig and (top y$r<Circ_ht)):+.3dot_size fi);
    x@3-.5tail_thick=hround(x$-.5dot_size+shear);
    y@2=.5[y@1,y@3]; bot y@3r=vround(top y@1r-depth);
    y_:=ypart((z@1{right}...z@2{down}...z@3)
     intersectiontimes (z$l{right}..{left}z$r)); if y_<0: y_:=1; fi
    filldraw z$r{left}..subpath (0,y_) of (z$l{right}..{left}z$r)--cycle; % dot
    if monospace:                                                         % tail
      draw z@1{right}...z@2{down}...{left}z@3;
    else:
      filldraw stroke z@1e{right}...z@2e{down}...{left}z@3e;
    fi
   fi
   penlabels(@1,@2,@3,$);
 fi
 currentbreadth:=0;
 enddef;
vardef spirit(expr center) text type=
numeric sp_bottom, sp_height;
sp_bottom=h-sp_height=max(.8[h,x_height],x_height+o+separator);
numeric dot_diam#; dot_diam# = if SansSerif:1else:3/4fi dot_size#;
define_whole_blacker_pixels(dot_diam);
dot_diam:=max(fine.breadth,min(dot_diam,floor(2/3sp_height)));
x31 if1type0:-else:+fi.5dot_diam=hround(center if1type0:-else:+fi.5dot_diam);
y31+.5dot_diam=h;
if1type0:smooth else:rough fi (31,a,dot_diam,sp_height,0);
penlabels(31);
enddef;
vardef spirit_acute(expr center) text type =
numeric sp_bottom, sp_height, sp_box;
sp_box:=if cbleipzig:.95else:.8*fi(h-x_height);
sp_bottom=h-sp_height=max(.8[h,x_height],x_height+o+separator);
numeric dot_diam#; dot_diam# = if SansSerif:1else:3/4fi dot_size#;
define_whole_blacker_pixels(dot_diam);
dot_diam:=max(fine.breadth,min(dot_diam,floor(2/3sp_height)));
if monotoniko:
  grave(center);
else:
  acute(center+if slitex:6/20 else:4/20fi sp_box);
  if 1type0:
    x31=hround(lft x22l-if serifs:if cbleipzig:.51else:.5fi
                    elseif slitex: .2
                             else:.4
                                fi sp_box);% smooth acute
  else:
    x31+.5dot_diam=
        hround(lft x22l if serifs:-1/20
                    elseif slitex: -2/20
                             else:+1/20
                                fi sp_box); % rough acute
  fi
  y31+.5dot_diam=h;
  if1type0:smooth else:rough fi (31,a,dot_diam,sp_height,0);
fi
enddef;
vardef spirit_grave(expr center) text type =
numeric sp_bottom, sp_height,sp_box;
sp_box:=.8*(h-x_height);
sp_bottom=h-sp_height=max(.8[h,x_height],x_height+o+separator);
numeric dot_diam#; dot_diam# = if SansSerif:1else:3/4fi dot_size#;
define_whole_blacker_pixels(dot_diam);
dot_diam:=max(fine.breadth,min(dot_diam,floor(2/3sp_height)));
if monotoniko:
  grave(center);
else:
  grave(center+if serifs:if cbleipzig or cbroman:9else:11fi elseif slitex:10 else:9fi/20sp_box);
  if 1type0:
   x31=hround(lft x21l-.5sp_height if serifs:- 1/10sp_box fi); %smooth grave
  else:
   x31+.5dot_diam=hround(lft x21l if serifs or slitex:-3/20sp_box fi); % rough grave
  fi
  y31+.5dot_diam=h;
  if1type0:smooth else:rough fi (31,a,dot_diam,sp_height,0);
fi
enddef;
vardef spirit_circumflex(expr center) text type=
if monotoniko:
   grave(center);
else:
   generate_circumflex(center);
   numeric sp_bottom, sp_height, sp_top, box_top;
   box_top=bot if slitex: y22l else:  y23l if cbleipzig:-.5u fi fi;
   sp_top=sp_bottom+sp_height=vround(.15[box_top,x_height]);
   sp_bottom=x_height+separator;
   numeric dot_diam#; dot_diam# = 5/8dot_size#;
   define_whole_blacker_pixels(dot_diam);
   pickup fine.nib;
   dot_diam:=max(fine.breadth,min(dot_diam,floor(2/3sp_height-eps)));
   x31 if1type0:-else:+fi.5dot_diam=hround(center if1type0:-else:+fi.5dot_diam);
   y31+.5dot_diam=vround(sp_top);
   if1type0:smooth else:rough fi (31,a,dot_diam,sp_height,0);
fi
penlabels(31);
enddef;
def iota_sub(expr pos_stem) =
if not monotoniko:
  if known pic.iota:
    addto currentpicture also pic.iota shifted (hround(pos_stem),0);
  else:
    picture temp_picture; temp_picture=currentpicture; clearit;
    if cursive and serifs and not (monospace or small_caps):
      pickup pencircle xscaled stem yscaled hair;
      x51=0;
      top y51=vround(-o-separator);
      x52=x51;
      bot y52=vround(-desc_depth);
      draw  z52--z51;
      pickup pencircle scaled hair;
      y53=y52+1/2hair;
      lft x53=hround(x52+u);
      draw z53--(z52+(.5u,0))--z52;
    elseif cbleipzig or cbroman:
      pos50(stem,0);x50=0;top y50+.5stem=vround(-o-.5separator);
      pos51(stem,0) ; x51=x50; y51=y53;
      x52r=.5[x51r,x53r];x52l=.5[x51l,x53l];
      bot y52l=vround(-desc_depth); y52r-y52l=.3[hair,stem]; z52=.5[z52r,z52l];
      pos53(hair,if cbroman:135else:180fi);
      lft x53r=hround(x51r+3u/4);y53l=y52r+min(u/2,hair);
      filldraw double_circ_stroke z50e---z51e{down}...{right}z52e...{up}z53e;
    else:
      if small_caps:
        numeric iota_stem; iota_stem:=.5[vair,stem];
        pickup tiny.nib; pos51(iota_stem,0); pos52(iota_stem,0);
        lft x51l=lft x52l=hround(-.5iota_stem);
        top y51 - bot y52= 1.2iota_dp;
        .5[top y51,bot y52]=0;
      filldraw stroke z51e--z52e; % stem
        if serifs or slitex:
         if monospace:
           dish_serif(51,52,a,1/3,.3jut,b,1/3,.3jut); % upper serif
           dish_serif(52,51,c,1/3,.3jut,d,1/3,.3jut); % lower serif
         else:
           numeric s_jut; s_jut :=if slitex: .5iota_stem else:.5jut fi;
           dish_serif(51,52,a,1/3,s_jut,b,1/3,s_jut); % upper serif
           dish_serif(52,51,c,1/3,s_jut,d,1/3,s_jut); % lower serif
         fi
        fi
      else:
        pickup fine.nib;
        x51=0; pos51(stem,180); top y51=vround(-o-separator);
        x52=x51; pos52(stem,180); bot y52=-iota_dp;
        filldraw circ_stroke z52e--z51e;
      fi
    fi
    if not working_hard : picture pic.iota; pic.iota=currentpicture; fi
    currentpicture:=currentpicture shifted (hround(pos_stem),0);
    addto currentpicture also temp_picture;
  fi
fi
penlabels(51,52,53);
currentbreadth:=0;
enddef;
def Iota_sub(expr pos_stem) =
if not monotoniko:
  if known pic.Iota:
    addto currentpicture also pic.Iota shifted (hround(pos_stem),0);
  else:
    picture temp_picture; temp_picture=currentpicture; clearit;
    numeric I_stem; I_stem:=.6[hair,stem];
    pickup tiny.nib; pos51(I_stem,0); pos52(I_stem,0);
    lft x51l=lft x52l=hround(-.5I_stem);
    top y51 - bot y52=2(iota_dp-separator);.5[top y51,bot y52]=0;
    filldraw stroke z51e--z52e; % stem
    if serifs or slitex:
     if monospace:
       dish_serif(51,52,a,1/3,.3jut,b,1/3,.3jut); % upper serif
       dish_serif(52,51,c,1/3,.3jut,d,1/3,.3jut); % lower serif
     else:
       dish_serif(51,52,a,1/3,.7jut,b,1/3,.7jut); % upper serif
       dish_serif(52,51,c,1/3,.7jut,d,1/3,.7jut); % lower serif
     fi
    fi
    picture pic.Iota; pic.Iota=currentpicture;
    currentpicture:=currentpicture shifted (hround(pos_stem),0);
    addto currentpicture also temp_picture;
  fi % endfi " known pic.Iota"
fi %endfi "not monotoniko"
currentbreadth:=0;
enddef;
cmchar "Adscript Iota";
beginchar(oct"010",if monospace:9else:4fi u#,x_height#,desc_depth#);
adjust_fit(0,0);
toniko:=monotoniko; monotoniko:=false;
Iota_sub(.5w); monotoniko:=toniko;
endchar;% "Adscript Iota"
numeric acc_width#; acc_width#:=if monotoniko: 4u# else:9u# fi;
cmchar "Grave accent";
beginchar("`",if monospace:9else:3fi u#,acc_ht#,0);
adjust_fit(0,0);
numeric center;
numeric acc_sgn; acc_sgn:=+1;
grave(if monospace:19/36else:2/3fi w);
endchar;% "Grave accent"
cmchar "Acute accent";
beginchar("'",if monospace:9else:3fi u#,acc_ht#,0);
adjust_fit(0,0);
numeric center;
numeric acc_sgn; acc_sgn:=-1;
acute(if monospace:17/36else:1/3fi w);
endchar;% "Acute accent"
cmchar "Circumflex accent";
beginchar("~",if monospace:9else:6fi u#,circ_ht#,0);
adjust_fit(0,0);
numeric center;
numeric mid_width;
squeeze:=false;
generate_circumflex(w/2);
penlabels(21,22,23,24,25);
currentbreadth:=0;
endchar;% "Circumflex accent"
cmchar "Diaeresis";
beginchar(oct"042",if monospace:9else:4fi u#,circ_ht#,0);
adjust_fit(0,0);
numeric dot_diam, center, sep;
sep:=4u-tiny; center:=.5w;
dot_diam:=max(tiny.breadth,hround(dot_size));
pos31(dot_diam,0); pos32(dot_diam,90); x31=x32;
y32=.5[x_height+separator,circ_ht];
y31=.5[y32l,y32r];
pos33(dot_diam,0); penpos34(y32r-y32l,90); y33=y34=y31; x33=x34;
if sep>0 :
  center=.5[x31,x33]; x33-x31=sep;
else:
  y35l=y35r=.5[y31,y32]; z35l=whatever[z21l,z22l]; z35r=whatever[z21r,z22r];
  rt x31r=hround((min(x35l,x35r)-.5currentbreadth)-.05w);
  lft x33l=hround((max(x35l,x35r)+.5currentbreadth)+.05w);
fi
dot(31,32); dot(33,34);
penlabels(31,32,33,34,35);
endchar;% "Diaeresis"
cmchar "Rough breathing";
beginchar("<",if monospace:9else:4fi u#,acc_ht#,0);
adjust_fit(0,0);
toniko:=monotoniko; monotoniko:=false;
spirit(.5w)<; monotoniko:=toniko;
endchar;% "Rough breathing"
cmchar "Smooth breathing";
beginchar(">",if monospace:9else:4fi u#,acc_ht#,0);
adjust_fit(0,0);
toniko:=monotoniko; monotoniko:=false;
spirit(.5w)>; monotoniko:=toniko;
endchar;% "Smooth breathing"
cmchar "Rough breathing with acute";
beginchar(oct"126",if monospace:9else:5fi u#,acc_ht#,0);
adjust_fit(0,0);
toniko:=monotoniko; monotoniko:=false;
spirit_acute(.5w)<; monotoniko:=toniko;
endchar;% "Rough breathing with acute"
cmchar "Rough breathing with grave";
beginchar(oct"103",if monospace:9else:5fi u#,acc_ht#,0);
adjust_fit(0,0);
toniko:=monotoniko; monotoniko:=false;
spirit_grave(.5w)<; monotoniko:=toniko;
endchar;% "Rough breathing with grave"
cmchar "Rough breathing with circumflex";
beginchar(oct"100",if monospace:9else:6fi u#,Circ_ht#,0);
adjust_fit(0,0);
toniko:=monotoniko; monotoniko:=false;
squeeze:=true;
spirit_circumflex(.5w)<; monotoniko:=toniko;
endchar;% "Rough breathing with circumflex"
cmchar "Smooth breathing with acute";
beginchar(oct"136",if monospace:9else:5fi u#,acc_ht#,0);
adjust_fit(0,0);
toniko:=monotoniko; monotoniko:=false;
spirit_acute(.5w)>; monotoniko:=toniko;
endchar;% "Smooth breathing with acute"
cmchar "Smooth breathing with grave";
beginchar(oct"137",if monospace:9else:5fi u#,acc_ht#,0);
adjust_fit(0,0);
toniko:=monotoniko; monotoniko:=false;
spirit_grave(.5w)>; monotoniko:=toniko;
endchar;% "Smooth breathing with grave"
cmchar "Smooth breathing and circumflex";
beginchar(oct"134",if monospace:9else:6fi u#,Circ_ht#,0);
adjust_fit(0,0);
toniko:=monotoniko; monotoniko:=false;
squeeze:=true;
spirit_circumflex(.5w)>; monotoniko:=toniko;
endchar;% "Smooth breathing and circumflex"
cmchar "Diaeresis with acute";
beginchar(oct"043",if monospace:9else:5fi u#,acc_ht#,0);
adjust_fit(0,0);
toniko:=monotoniko; monotoniko:=false;
diaeresis_acute(.5w); monotoniko:=toniko;
endchar;% "Diaeresis with acute"
cmchar "Diaeresis with grave";
beginchar(oct"044",if monospace:9else:5fi u#,acc_ht#,0);
adjust_fit(0,0);
toniko:=monotoniko; monotoniko:=false;
diaeresis_grave(.5w); monotoniko:=toniko;
endchar;% "Diaeresis with grave"
cmchar "Diaeresis with circumflex";
beginchar(oct"040",if monospace:9else:8fi u#,Circ_ht#,0);
adjust_fit(0,0);
toniko:=monotoniko; monotoniko:=false;
squeeze:=true;
diaeresis_circumflex(.5w);
monotoniko:=toniko;
endchar;% "Diaeresis with circumflex"
cmchar "Iota subscript";
beginchar("|",if monospace:9else:2fi u#,0,.6desc_depth#);
adjust_fit(0,0);
toniko:=monotoniko; monotoniko:=false;
iota_sub(.5w); monotoniko:=toniko;
endchar;% "Iota subscript"
cmchar "Breve accent";
beginchar(oct"036",7u#,min(asc_height#,2x_height#),0);
italcorr h#*slant+.5vair#-1.5u#;
adjust_fit(0,0);
pickup crisp.nib; pos1(vair,-180); pos3(vair,0);
top y1=top y3=h; lft x1r=w-rt x3r=0;
numeric mid_thickness; mid_thickness=vround 1/3[vair,stem];
pos2(mid_thickness,-90); x2=.5w;
bot y2r=vround (1/3[x_height,h]+o-.5mid_thickness);
filldraw stroke z1e{down}...z2e{right}...{up}z3e;  % stroke
currentbreadth:=0;
endchar;% "Breve accent"
cmchar"Wide breve accent";
beginchar(oct"227",12u#,min(asc_height#,2x_height#),0);
italcorr h#*slant+.5vair#-1.5u#;
adjust_fit(0,0);
pickup crisp.nib; pos1(vair,-180); pos3(vair,0);
top y1=top y3=h; lft x1r=w-rt x3r=0;
numeric mid_thickness; mid_thickness=vround 1/3[vair,stem];
pos2(mid_thickness,-90); x2=.5w;
bot y2r=vround (1/3[x_height,h]+o-.5mid_thickness);
filldraw stroke z1e{(1,-1)}...z2e{right}...{1,1}z3e;  % stroke
currentbreadth:=0;
penlabels(1,2,3,4,5);
endchar;% "Wide breve accent"
cmchar "Macron (bar) accent";
numeric macron_breadth#; macron_breadth#=.2[vair#,stem#];
beginchar(oct"037",7u#,.15[x_height#,asc_height#]+macron_breadth#,0);
italcorr h#*slant-.75u#;
adjust_fit(0,0);
numeric macron_breadth; macron_breadth:=Vround .2[vair,stem];
pickup if serifs: crisp.nib else: fine.nib fi;
pos1(macron_breadth,90); pos2(macron_breadth,90);
%top y1r=top y2r=h+o; 
lft x1=w-rt x2=0;
bot y1l=bot y2l=vround (h+o);
filldraw stroke z1e--z2e;  % bar
currentbreadth:=0;
endchar;% "Macron (bar) accent"
cmchar "Lowered cap to go under iota or upsilon";
beginchar(oct"001",6u#,0,desc_depth#);
adjust_fit(0,0);
numeric mid_width;mid_width=1/3[vair,stem];
pickup if serifs: crisp.nib else: fine.nib fi;
pos1(vair,135); pos2(mid_width,90); pos3(vair,45);
lft x1r=0; rt x3r=w; bot y1l=max(-d,-3mid_width)-separator=bot y3l;
x2=.5[lft x1r,rt x3r]; top y2r=-separator;
filldraw double_circ_stroke z1e..z2e..z3e;
penlabels(1,2,3);
currentbreadth:=0;
endchar;% "Lowered cap to go under iota or upsilon"
cmchar "Small tie to go under any letter";
beginchar(oct"024",6u#,0,desc_depth#);
adjust_fit(0,0);
numeric mid_width;mid_width=1/3[vair,stem];
pickup if serifs: crisp.nib else: fine.nib fi;
pos1(vair,-135); pos2(mid_width,-90); pos3(vair,-45);
lft x1r=0; rt x3r=w; top y1l=-separator=top y3l;
x2=.5[lft x1r,rt x3r]; bot y2r=max(-d,-3mid_width)-separator;
filldraw double_circ_stroke z1e..z2e..z3e;
penlabels(1,2,3);
currentbreadth:=0;
endchar;% "Small tie to go under any letter"
%endinput;
% questi sono i due lati di un circonflesso ^ col vertice alla base
cmchar "Left side of nexus";
beginchar(oct"020",2.5u#,0,desc_depth#);
adjust_fit(0,0);
pickup if serifs: crisp.nib else: fine.nib fi;
pos1(hair,135); pos2(1.5u,angle((-slant,1)));
lft x1r=0; bot y1l=-d; rt x2l=hround(w+eps); top y2r=h;
filldraw circ_stroke z1e--z2e;
penlabels(1,2);
endchar;% "Left side of nexus"
cmchar "Right side of nexus";
beginchar(oct"021",3.5u#,0,desc_depth#);
adjust_fit(0,0);
pickup if serifs: crisp.nib else: fine.nib fi;
pos2(hair,45); pos1(1.5u,angle((-slant,1)));
lft x1l=hround(0-eps); top y1r=h; rt x2r=w; bot y2l=-d;
filldraw circ_stroke z2e--z1e;
penlabels(1,2);
endchar;% "Right side of nexus"
endinput;