summaryrefslogtreecommitdiff
path: root/fonts/elvish
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /fonts/elvish
Initial commit
Diffstat (limited to 'fonts/elvish')
-rw-r--r--fonts/elvish/README85
-rw-r--r--fonts/elvish/cirth.mf779
-rw-r--r--fonts/elvish/cirth.pk300bin0 -> 5256 bytes
-rw-r--r--fonts/elvish/cirth.pk360bin0 -> 6132 bytes
-rw-r--r--fonts/elvish/cirth.tfmbin0 -> 620 bytes
-rw-r--r--fonts/elvish/teng.tex32
-rw-r--r--fonts/elvish/teng10.mf31
-rw-r--r--fonts/elvish/teng10.pk300bin0 -> 5392 bytes
-rw-r--r--fonts/elvish/teng10.pk360bin0 -> 6604 bytes
-rw-r--r--fonts/elvish/teng10.tfmbin0 -> 700 bytes
-rw-r--r--fonts/elvish/tengdev.mf350
-rw-r--r--fonts/elvish/tengmacs.mf221
-rw-r--r--fonts/elvish/tengmain.mf296
-rw-r--r--fonts/elvish/tengsecs.mf311
-rw-r--r--fonts/elvish/tengteht.mf195
15 files changed, 2300 insertions, 0 deletions
diff --git a/fonts/elvish/README b/fonts/elvish/README
new file mode 100644
index 0000000000..74c467f009
--- /dev/null
+++ b/fonts/elvish/README
@@ -0,0 +1,85 @@
+(README changed 09/06/99; conditions relaxed)
+
+28/06/91 As a concession to those who for some reason don't have Metafont,
+the following files are now included: teng10.tfm and cirth.tfm (the font
+metric files), and {teng10,cirth}.pk{300,360} (the pk files generated
+with mode imagen (i.e. Laserwriter) at normal size and at magstep 1).
+
+
+(README changed 13/06/90; conditions relaxed)
+
+*** Important Note ***
+
+These files are copyright (c) 1987 J.C. Bradfield.
+They are distributed on the following conditions:
+ (a) You may use the source and generated fonts for any purpose,
+ and may distribute the files, provided that all files including
+ this copyright notice remain intact.
+ (b) You may make modifications for your own use. You may distribute
+ modified versions of these files PROVIDED that this copyright
+ notice remains intact AND that you include the original files
+ clearly labelled as such.
+ If you produce modifications that seem useful, you are asked to
+ send them to me, so that they can be incorporated into the master
+ files.
+
+There are still things I would like to do with these fonts, in
+particular, to provide virtual fonts for Quenya etc. If you have
+suggestions or comments, please contact me.
+
+******************************************
+
+The only file that needs to be input is teng10.mf ; all the other
+files are called by it. Hence, on a Unix system, the following
+should generate a tengwar font at magnification \magstep1 for
+the Apple Laserwriter:
+mf '\mode:=imagen; mag := magstep1; input teng10'
+
+If you have difficulties, contact your local Metafont guru in
+the first instance.
+
+*****************************************
+
+The cirth font is rather hastily put together, and is not properly
+organized as yet. It is therefore distributed as a single stand-alone
+file, so again all you have to do is:
+mf '\mode:=imagen; mag := magstep1; input cirth'
+
+*****************************************
+
+The file teng.tex contains the macros I use for setting tenwar
+when using TeX. I'm afraid they're not commented---tough! The general
+idea is that the ^ character is used to put a vowel over its consonant,
+so for example to print
+ Ai! laurie lantar lassi s\'urinen
+in tengwar, I would type
+{\quenya ^Ia l^Ua^ri^@e ^la^DaR ^la^Zi s^*u^ri^nen}
+
+You'll have to note which ASCII character corresponds to which
+tengwa for yourself; I don't have a table prepared. A point to watch
+out for is that in Quenya, 'v' usually transcribes vilya, which is
+represented by the ASCII character w ; v represents the tengwa
+amba (i.e. the encoding is basically set up for use with English).
+
+*****************************************
+
+Contacting me:
+
+I can be contacted by post at:
+ J.C. Bradfield
+ Dept of Computer Science
+ The King's Buildings
+ Mayfield Road
+ EDINBURGH
+ U.K. EH9 3JZ
+
+I can be contacted by electronic mail as:
+ jcb@dcs.ed.ac.uk (in Internet domain ordering)
+
+If that doesn't work, you should kick your postmaster, and then
+get him/her to tell you how to reach that address. (Well, maybe
+you kick after you get the info!)
+
+
+Happy typesetting,
+Julian Bradfield.
diff --git a/fonts/elvish/cirth.mf b/fonts/elvish/cirth.mf
new file mode 100644
index 0000000000..790da12fe0
--- /dev/null
+++ b/fonts/elvish/cirth.mf
@@ -0,0 +1,779 @@
+designsize:=10pt# ;
+autorounding := 1 ;
+mode_setup;
+em#:=10pt#; ; desc#:=10/3pt#; ex#:=8pt#; o#:=1/8pt#;
+% parameters
+
+font_normal_space(0.4em#) ; font_x_height(ex#) ;
+font_quad(em#) ; font_normal_stretch(0.2em#) ;
+font_normal_shrink(0.1em#) ;
+
+penangle := 30 ;
+penwidth# := 1/12em# ; penthickness# := 1/50em# ;
+define_pixels(em,desc,ex);
+define_blacker_pixels(penwidth,penthickness) ;
+tehta_penwidth# = 0.8penwidth# ;
+define_blacker_pixels(tehta_penwidth) ;
+define_corrected_pixels(o);
+straight_sidebar# = 1/12em#; curve_sidebar# = 1/18em#;
+define_whole_pixels(straight_sidebar,curve_sidebar) ;
+
+fudge := 0.05 ex ; % fudge for lowering calma luva
+u# := em#/18 ;
+define_pixels(u) ;
+tailjut# := 12u# - 10u# ;
+define_whole_pixels(tailjut) ;
+luva_width# = 0.5em# ; define_pixels(luva_width) ;
+pickup pencircle xscaled penwidth yscaled penthickness rotated penangle;
+main_nib := savepen ;
+pickup pencircle xscaled tehta_penwidth yscaled penthickness rotated penangle;
+tehta_nib := savepen ;
+
+
+
+def draw_stem(suffix i,j)(expr serifs) = % serifs = t,b,tb for Top & Bottom
+ z.i.$ = z.i + 0.05em * dir(penangle+180) ;
+ z.i.$$ = z.i + 0.1em * down ;
+ z.j.$ = z.j + 0.05em * dir(penangle) ;
+ z.j.$$ = z.j + 0.1em * up ;
+ draw z.i .. z.j ;
+ if (serifs = "t") or (serifs = "tb"):
+ filldraw z.i -- z.i.${dir(penangle-90)}
+ .. {down}z.i.$$ & z.i.$$ .. z.i & cycle ; fi
+ if (serifs = "b") or (serifs = "tb"):
+ filldraw z.j -- z.j.${dir(penangle+90)}
+ .. {up}z.j.$$ & z.j.$$ .. z.j & cycle ; fi
+ labels(i,j)
+ enddef ;
+
+def diag(suffix i,j) = % diag from i to j with serif at j
+ draw z.i -- z.j ;
+ theta :=
+ if x.j > x.i:
+ if y.j > y.i: penangle - 90 else: penangle fi
+ else:
+ if y.j > y.i: -penangle else: penangle + 90 fi fi ;
+ draw z.j -- (z.j + 0.05em*dir theta) ;
+enddef ;
+
+beginchar("p",10u#,ex#,0) ; "The rune p" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; lft x1 = lft x2 = straight_sidebar ;
+ draw_stem(1,2,"tb") ;
+ bot z4 = 0.4[z2,z1] ;
+ rt x3 = w - curve_sidebar ; y3 = 1/2[y4,y1] ;
+ draw z1 -- z3 -- z4 ;
+endchar ;
+
+beginchar("b",12u#,ex#,0) ; "The rune b" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; lft x1 = lft x2 = straight_sidebar ;
+ draw_stem(1,2,"tb") ;
+ bot z4 = 0.4[z2,z1] ;
+ rt x3 = w - curve_sidebar - tailjut ; y3 = 1/2[y4,y1] ;
+ draw z1 -- z3 -- z4 ;
+ y5 = y2 ; rt x5 = w - curve_sidebar ;
+ bot y4' = round y4 ; x4 = x4' ;
+ diag(4',5) ;
+endchar ;
+
+beginchar("f",10u#,ex#,0) ; "The rune f" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; rt x1 = rt x2 = w - straight_sidebar ;
+ draw_stem(1,2,"b") ;
+ bot z4 = 0.4[z2,z1] ;
+ lft x3 = curve_sidebar ; y3 = 1/2[y4,y1] ;
+ draw z1 -- z3 -- z4 ;
+endchar ;
+
+beginchar("v",12u#,ex#,0) ; "The rune v" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; rt x1 = rt x2 = w - straight_sidebar ;
+ draw_stem(1,2,"b") ;
+ bot z4 = 0.45[z2,z1] ;
+ lft x3 = curve_sidebar+tailjut ; y3 = 1/2[y4,y1] ;
+ draw z1 -- z3 -- z4 ;
+ y5 = y2 ; lft x5 = curve_sidebar ;
+ diag(4,5) ;
+endchar ;
+
+beginchar("W",19u#,ex#,0) ; "The rune hw" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; x1 = x2 = good.x 0.5w ;
+ draw_stem(1,2,"b") ;
+ bot z4 = 0.4[z2,z1] ;
+ rt x3 = w - curve_sidebar ; y3 = 1/2[y4,y1] ;
+ draw z1 -- z3 -- z4 ;
+ lft x5 = curve_sidebar ; y5 = y3 ;
+ draw z1 -- z5 -- z4 ;
+endchar ;
+
+beginchar("m",10u#,ex#,0) ; "The rune m" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; lft x1 = lft x2 = straight_sidebar ;
+ draw_stem(1,2,"b") ;
+ top z4 = 0.55[z2,z1] ;
+ rt x3 = w - curve_sidebar ; y3 = 1/2[y4,y1] ;
+ draw z1 -- z3 -- z4 ;
+ y5 = 1/2[y4,y2] ;
+ rt x5 = w - 1/2curve_sidebar ;
+ draw z4 -- z5 -- z2 ;
+endchar ;
+
+beginchar("M",10u#,ex#,0); "The rune mb" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; rt x1 = rt x2 = w- straight_sidebar ;
+ draw_stem(1,2,"b") ;
+ top z4 = 0.55[z2,z1] ;
+ lft x3 = curve_sidebar ; y3 = 1/2[y4,y1] ;
+ draw z1 -- z3 -- z4 ;
+ y5 = 1/2[y4,y2] ;
+ lft x5 = 1/2curve_sidebar ;
+ draw z4 -- z5 -- z2 ;
+endchar ;
+
+beginchar("t",10u#,ex#,0) ; "The rune t" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; lft x1 = lft x2 = straight_sidebar ;
+ draw_stem(1,2,"tb") ;
+ rt x3 = w - curve_sidebar ; y3 = .7[y2,y1] ;
+ diag(1,3) ;
+endchar ;
+
+beginchar("d",10u#,ex#,0) ; "The rune d" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; lft x1 = lft x2 = straight_sidebar ;
+ draw_stem(1,2,"tb") ;
+ rt x3 = w - curve_sidebar ; y3 = .7[y2,y1] ;
+ diag(1,3) ;
+ x4 = x1 ; x5 = x3 ; bot y4 = round (.5[y1,y2]) ; y4 - y1 = y5 - y3 ;
+ diag(4,5) ;
+endchar ;
+
+beginchar("T",10u#,ex#,0) ; "The rune th" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; rt x1 = rt x2 = w - straight_sidebar ;
+ draw_stem(1,2,"b") ;
+ lft x3 = curve_sidebar ; y3 = .7[y2,y1] ;
+ diag(1,3) ;
+endchar ;
+
+beginchar("D",10u#,ex#,0) ; "The rune dh" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; rt x1 = rt x2 = w - straight_sidebar ;
+ draw_stem(1,2,"b") ;
+ lft x3 = curve_sidebar ; y3 = .7[y2,y1] ;
+ diag(1,3) ;
+ x4 = x1 ; x5 = x3 ; bot y4 = round(.5[y1,y2]) ; y4 - y1 = y5 - y3 ;
+ diag(4,5) ;
+endchar ;
+
+beginchar("n",17u#,ex#,0) ; "The rune n" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; x1 = x2 = good.x .5w ;
+ draw_stem(1,2,"b") ;
+ lft x3 = curve_sidebar = w - rt x4 ; y3 = y4 = .7[y2,y1] ;
+ diag(1,3) ; diag(1,4) ;
+endchar ;
+
+beginchar("c",12u#,ex#,0) ; "The rune ch" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; lft x1 = lft x2 = straight_sidebar ;
+ bot y3 = .45[y1,y2] ; x3 = x1 ;
+ rt x4 = w - curve_sidebar ; y4 = y2 ;
+ draw_stem(1,2,"tb") ;
+ diag(3,4) ;
+endchar ;
+
+beginchar("j",13u#,ex#,0) ; "The rune j" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; lft x1 = lft x2 = straight_sidebar ;
+ bot y3 = .4[y1,y2] ; x3 = x1 ;
+ rt x4 = w - curve_sidebar ; y4 = y2 ;
+ draw_stem(1,2,"tb") ;
+ diag(3,4) ;
+ y5 = .5[y2,y3] ; x5 = x1 ; y6 = y4 ; z6 - z5 = whatever*(z4 - z3) ;
+ diag(5,6) ;
+endchar ;
+
+beginchar("C",11u#,ex#,0) ; "The rune sh" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; rt x1 = rt x2 = w - straight_sidebar ;
+ bot y3 = .45[y1,y2] ; x3 = x1 ;
+ lft x4 = curve_sidebar ; y4 = y2 ;
+ draw_stem(1,2,"tb") ;
+ diag(3,4) ;
+endchar ;
+
+beginchar("J",12u#,ex#,0) ; "The rune zh" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; rt x1 = rt x2 = w - straight_sidebar ;
+ bot y3 = .4[y1,y2] ; x3 = x1 ;
+ lft x4 = curve_sidebar ; y4 = y2 ;
+ draw_stem(1,2,"tb") ;
+ diag(3,4) ;
+ y5 = .5[y2,y3] ; x5 = x1 ; y6 = y4 ; z6 - z5 = whatever*(z4 - z3) ;
+ diag(5,6) ;
+endchar ;
+
+beginchar("Y",18u#,ex#,0) ; "The rune nj" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; x1 = x2 = good.x .5w ;
+ bot y3 = .45[y1,y2] ; x3 = x1 ;
+ y4 = y5 = y2 ; x4 = curve_sidebar = w - x5 ;
+ draw_stem(1,2,"tb") ;
+ diag(3,4) ; diag(3,5) ;
+endchar ;
+
+beginchar("k",11u#,ex#,0) ; "The rune k" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; lft x1 = lft x2 = straight_sidebar ;
+ top y3 = .55[y1,y2] ; x3 = x1 ;
+ y4 = y1 ; rt x4 = w - curve_sidebar ;
+ draw_stem(1,2,"tb") ;
+ draw z3{dir 35} .. tension 1 .. {dir 80}z4 -- z4 + 0.03em*left ;
+endchar ;
+
+beginchar("g",12u#,ex#,0) ; "The rune g" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; lft x1 = lft x2 = straight_sidebar ;
+ top y3 = .6[y1,y2] ; x3 = x1 ;
+ y4 = y1 ; rt x4 = w - curve_sidebar ;
+ draw_stem(1,2,"tb") ;
+ draw z3{dir 35} .. tension 1 .. {dir 80}z4 -- z4 + 0.03em*left ;
+ z5 = .55[z1,z3] ; z6 = .5[z1,z4] ;
+ draw z5{dir 40} .. tension 2 .. z6 -- z6 + 0.03em*left ;
+endchar ;
+
+beginchar("K",11u#,ex#,0) ; "The rune kh" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; rt x1 = rt x2 = w - straight_sidebar ;
+ top y3 = .55[y1,y2] ; x3 = x1 ;
+ y4 = y1 ; lft x4 = curve_sidebar ;
+ draw_stem(1,2,"tb") ;
+ draw z3{dir 135} .. tension 1 .. {dir 100}z4 -- z4 + 0.03em*left ;
+endchar ;
+
+beginchar("G",12u#,ex#,0) ; "The rune gh" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; rt x1 = rt x2 = w - straight_sidebar ;
+ top y3 = .6[y1,y2] ; x3 = x1 ;
+ y4 = y1 ; lft x4 = curve_sidebar ;
+ draw_stem(1,2,"tb") ;
+ draw z3{dir 145} .. tension 1 .. {dir 100}z4 -- z4 + 0.03em*left ;
+ z5 = .55[z1,z3] ; z6 = .5[z1,z4] ;
+ draw z5{dir 145} .. tension 1 .. {dir 100}z6 -- z6 + 0.03em*left ;
+endchar ;
+
+beginchar("N",16u#,ex#,0) ; "The rune ng" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; x1 = x2 = good.x .5w ;
+ top y3 = .55[y1,y2] ; x3 = x1 ;
+ y4 = y1 ; lft x4 = curve_sidebar ;
+ draw_stem(1,2,"tb") ;
+ draw z3{dir 145} .. tension 1 .. {dir 100}z4 -- z4 + 0.03em*left ;
+ y5 = y4 ; x5 = w - x4 ;
+ draw z3{dir 35} .. tension 1 .. {dir 80}z5 -- z5 + 0.03em*left ;
+endchar ;
+
+beginchar(43,13u#,ex#,0) ; "The rune kw" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; lft x1 = lft x2 = straight_sidebar ;
+ draw_stem(1,2,"tb") ;
+ rt x4 = w - curve_sidebar ; x3 = .5[x1,x4] ; y4 = y1 ; y3 = .7[y2,y1] ;
+ draw z1 -- z3 ; diag(3,4) ;
+endchar ;
+
+beginchar(39,13u#,ex#,0) ; "The rune gw" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; lft x1 = lft x2 = straight_sidebar ;
+ draw_stem(1,2,"tb") ;
+ rt x4 = w - curve_sidebar ; x3 = .5[x1,x4] ; y4 = y1 ; y3 = .7[y2,y1] ;
+ draw z1 -- z3 ; diag(3,4) ;
+ x5 = x1 ; top y5 = .6[y2,y1] ; z5 - z1 = z6 - z3 = z7 - z4 ;
+ draw z5 -- z6 ; diag(6,7) ;
+endchar ;
+
+beginchar(11,13u#,ex#,0) ; "The rune khw" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; rt x1 = rt x2 = w - straight_sidebar ;
+ draw_stem(1,2,"b") ;
+ lft x4 = curve_sidebar ; x3 = .5[x1,x4] ; y4 = y1 ; y3 = .7[y2,y1] ;
+ draw z1 -- z3 ; diag(3,4) ;
+endchar ;
+
+beginchar(7,13u#,ex#,0) ; "The rune ghw" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; rt x1 = rt x2 = w - straight_sidebar ;
+ draw_stem(1,2,"b") ;
+ lft x4 = curve_sidebar ; x3 = .5[x1,x4] ; y4 = y1 ; y3 = .7[y2,y1] ;
+ draw z1 -- z3 ; diag(3,4) ;
+ x5 = x1 ; top y5 = .6[y2,y1] ; z5 - z1 = z6 - z3 = z7 - z4 ;
+ draw z5 -- z6 ; diag(6,7) ;
+endchar ;
+
+beginchar(14,22u#,ex#,0) ; "The rune ngw" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; x1 = x2 = good.x .5w ;
+ draw_stem(1,2,"b") ;
+ lft x4 = curve_sidebar ; x3 = .5[x1,x4] ; y4 = y1 ; y3 = .7[y2,y1] ;
+ draw z1 -- z3 ; diag(3,4) ;
+ x6 = w - x4 ; y6 = y4 ; y5 = y3 ; x5 = w - x3 ;
+ draw z1 -- z5 ; diag(5,6) ;
+endchar ;
+
+beginchar(46,13u#,ex#,0) ; "The rune nw" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; lft x1 = lft x2 = straight_sidebar ;
+ draw_stem(1,2,"") ;
+ rt x4 = w - curve_sidebar ; x3 = .5[x1,x4] ; y4 = y1 ; y3 = .7[y2,y1] ;
+ draw z1 -- z3 ; diag(3,4) ;
+ x6 = x4 ; y6 = h - y4 ; y5 = h - y3 ; rt x5 = round x3 ;
+ draw z2 -- z5 ; diag(5,6) ;
+endchar ;
+
+beginchar("r",10u#,ex#,0) ; "The rune r" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; lft x1 = lft x2 = straight_sidebar ;
+ y3 = .5[y1,y2] ; x3 = x1 ;
+ y4 = y1 ; rt x4 = w - curve_sidebar ;
+ draw_stem(1,2,"tb") ;
+ draw z3{dir 45} .. tension 2 .. {dir 80}z4 -- z4 + 0.03em*left ;
+ y5 = y2 ; x5 = x4 ;
+ draw z3{dir -20} .. z5{dir -80} ;
+endchar ;
+
+beginchar("R",10u#,ex#,0) ; "The rune rh" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; rt x1 = rt x2 = w - straight_sidebar ;
+ y3 = .5[y1,y2] ; x3 = x1 ;
+ y4 = y1 ; lft x4 = curve_sidebar ;
+ draw_stem(1,2,"tb") ;
+ draw z3{dir 135} .. tension 2 .. {dir 100}z4 -- z4 + 0.03em*left ;
+ y5 = y2 ; x5 = x4 ;
+ draw z3{dir 200} .. z5{dir -100} ;
+endchar ;
+
+beginchar("l",12u#,ex#,0) ; "The rune l" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; x1 = x2 = good.x .5w ;
+ top y3 = round .85h ; rt x3 = w - curve_sidebar ;
+ x4 = w - x3 ; y4 = h - y3 ;
+ draw_stem(1,2,"tb") ;
+ draw z3{dir -100} .. {dir -100}z4 .. z4 + 0.03em*dir -70 ;
+endchar ;
+
+beginchar("L",12u#,ex#,0) ; "The rune lh" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; x1 = x2 = good.x .5w ;
+ top y3 = round .85h ; lft x3 = curve_sidebar ;
+ x4 = w - x3 ; y4 = h - y3 ;
+ draw_stem(1,2,"tb") ;
+ draw z3 + 0.03em*dir70 .. z3{dir -80} .. {dir -100}z4 .. z4 + 0.03em*dir -110 ;
+endchar ;
+
+beginchar(1,12u#,ex#,0) ; "The rune ng--nd" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; x1 = x2 = good.x .5w ;
+ top y3 = round .85h ; lft x3 = curve_sidebar ;
+ x4 = w - x3 ; y4 = h - y3 ;
+ draw_stem(1,2,"tb") ;
+ draw z3 + 0.03em*dir70 .. z3{dir -80} .. {dir -100}z4 .. z4 + 0.03em*dir -110 ;
+ top y5 = round .85h ; rt x5 = w - curve_sidebar ;
+ x6 = w - x5 ; y6 = h - y5 ;
+ draw z5{dir -100} .. {dir -100}z6 .. z6 + 0.03em*dir -70 ;
+endchar ;
+
+beginchar("s",10u#,ex#,0) ; "The rune s" ;
+ pickup main_nib ;
+ lft x1 = lft x3 = curve_sidebar = w - rt x2 ;
+ top y1 = h = h - bot y3 ; y2 = .5[y1,y3] ;
+ diag(2,1) ; diag(2,3) ;
+endchar ;
+
+beginchar("S",10u#,ex#,0) ; "The rune s---variant" ;
+ pickup main_nib ;
+ rt x1 = rt x3 = w - curve_sidebar = w - lft x2 ;
+ top y1 = h = h - bot y3 ; y2 = .5[y1,y3] ;
+ diag(2,1) ; diag(2,3) ;
+endchar ;
+
+beginchar("z",14u#,ex#,0) ; "The rune z" ;
+ pickup main_nib ;
+ lft x1 = curve_sidebar = w - rt x2 = w - rt x4 = lft x3 ;
+ top y1 = top y2 = h = h - bot y3 = h - bot y4 ;
+ z5 = .5[z1,z4] ;
+ diag(5,1) ; diag(5,2) ; diag(5,3) ; diag(5,4) ;
+endchar ;
+
+beginchar(2,14u#,ex#,0) ; "The rune ng---variant" ;
+ pickup main_nib ;
+ lft x1 = curve_sidebar = w - rt x2 = w - rt x4 = lft x3 ;
+ top y1 = top y2 = h = h - bot y3 = h - bot y4 ;
+ z5 = .5[z1,z4] ;
+ diag(5,1) ; diag(5,2) ; diag(5,3) ; diag(5,4) ;
+ x1' = x4' = x5 ; y2' = y3' = y5 ;
+ top y1' = round .85h = h - bot y4' ;
+ z2' - z1' = z4' - z3' = whatever*(z4 - z1) ;
+ draw z1' -- z2' -- z4' -- z3' -- cycle ;
+endchar ;
+
+beginchar(3,15u#,ex#,0) ; "The rune nd" ;
+ pickup main_nib ;
+ lft x1 = lft x3 = w - rt x2 = w - rt x4 = straight_sidebar ;
+ top y1 = top y2 = h - bot y3 = h - bot y4 = h ;
+ draw z1 -- z4 -- z2 -- z3 -- cycle ;
+endchar ;
+
+beginchar(4,14u#,ex#,0) ; "The rune nd---variant" ;
+ pickup main_nib ;
+ lft x1 = lft x3 = w - rt x2 = w - rt x4 = straight_sidebar ;
+ top y1 = top y2 = h - bot y3 = h - bot y4 = h ;
+ draw_stem(1,3,"b") ; draw_stem(2,4,"b") ;
+ x5 = x1 ; x6 = x2 ; y5 = y6 = .45[y1,y3] ;
+ draw z1 -- z6 ; draw z2 -- z5 ;
+endchar ;
+
+beginchar("i",4u#,ex#,0) ; "The rune i" ;
+ pickup main_nib ;
+ x1 = x2 = good.x .5w ;
+ top y1 = h ; bot y2 = 0 ;
+ draw_stem(1,2,"tb") ;
+endchar ;
+
+beginchar("y", 9u#,ex#,0) ; "The rune y" ;
+ pickup main_nib ;
+ lft x1 = lft x2 = straight_sidebar = w - rt x3 = w - rt x4 ;
+ top y1 = h ; bot y4 = 0 ;
+ y2 = good.y .25h ; y3 = good.y .75h ;
+ draw_stem(1,2,"t") ; draw_stem(3,4,"b") ; draw z2 -- z3 ;
+endchar ;
+
+beginchar("H", 9u#,ex#,0) ; "The rune y" ;
+ pickup main_nib ;
+ lft x1 = lft x2 = straight_sidebar = w - rt x3 = w - rt x4 ;
+ bot y1 = 0 ; top y4 = h ;
+ y2 = good.y .75h ; y3 = good.y .25h ;
+ draw_stem(2,1,"b") ; draw_stem(4,3,"t") ; draw z2 -- z3 ;
+endchar ;
+
+beginchar("u",14u#,ex#,0) ; "The rune u" ;
+ pickup main_nib ;
+ lft x4 = curve_sidebar = w - rt x2 ;
+ x3 = good.x .5w ;
+ x1 = good.x .3[x4,x3] = w - x5 ;
+ top y3 = h ;
+ bot y1 = bot y5 = 0 ;
+ y2 = y4 = good.y .6h ;
+ diag(2,1) ; diag(4,5) ; draw z2 -- z3 -- z4 ;
+endchar ;
+
+beginchar("U",10u#,ex#,0) ; "The rune long u" ;
+ pickup main_nib ;
+ lft x1 = lft x3 = curve_sidebar = w - rt x2 ;
+ top y1 = h = h - bot y3 ; y2 = .5[y1,y3] ;
+ diag(2,1) ; diag(2,3) ;
+ x5 = x1 ; y5 = y2 ; x4 = x6 = x2 ; y4 = y1 ; y6 = y3 ;
+ diag(5,4) ; diag(5,6) ;
+endchar ;
+
+beginchar("w",12u#,ex#,0) ; "The rune w" ;
+ pickup main_nib ;
+ lft x1 = curve_sidebar = w - rt x3 ;
+ x2 = x4 = x5 = good.x .5w ;
+ top y2 = h ; bot y5 = 0 ; y4 = good.y .35h ; y1 = y3 = .5[y2,y4] ;
+ draw_stem(4,5,"b") ; draw z1 -- z2 -- z3 -- z4 -- cycle ;
+endchar ;
+
+beginchar(21,12u#,ex#,0) ; "The rune ue" ;
+ pickup main_nib ;
+ lft x4 = curve_sidebar = w - rt x2 ;
+ x3 = good.x .5w ;
+ x1 = good.x .3[x4,x3] = w - x5 ;
+ top y3 = h ;
+ y1 = y5 = good.y .3h ;
+ y2 = y4 = good.y .6[y1,y3] ;
+ diag(2,1) ; diag(4,5) ; draw z2 -- z3 -- z4 ;
+ z6 = (z2 -- z1) intersectionpoint (z4--z5) ;
+ x7 = x6 ; bot y7 = 0 ; draw_stem(6,7,"b") ;
+endchar ;
+
+beginchar(53,12u#,ex#,0) ; "The rune ue---variant" ;
+ pickup main_nib ;
+ lft x4 = curve_sidebar = w - rt x2 ;
+ x3 = good.x .5w ;
+ x1 = good.x .3[x4,x3] = w - x5 ;
+ top y3 = h ;
+ y1 = y5 = good.y .3h ;
+ y2 = y4 = good.y .6[y1,y3] ;
+ diag(2,1) ; diag(4,5) ; draw z2 -- z3 -- z4 ;
+ z6 = (z2 -- z1) intersectionpoint (z4--z5) ;
+ x7 = x6 ; bot y7 = 0 ; draw_stem(3,7,"b") ;
+endchar ;
+
+beginchar("e",10u#,ex#,0) ; "The rune e" ;
+ pickup main_nib ;
+ lft x1 = lft x2 = straight_sidebar = w - rt x3 = w - rt x4 ;
+ top y1 = top y3 = h ; bot y2 = bot y4 = 0 ;
+ draw_stem(1,2,"tb") ; draw_stem(3,4,"tb") ;
+ x5 = x1 ; x6 = x3 ; .5[y5,y6] = vround .52h ;
+ top y5 = vround .67h ; draw z5 -- z6 ;
+endchar ;
+
+beginchar("E",10u#,ex#,0) ; "The rune long e" ;
+ pickup main_nib ;
+ lft x1 = lft x2 = straight_sidebar = w - rt x3 = w - rt x4 ;
+ top y1 = top y3 = h ; bot y2 = bot y4 = 0 ;
+ draw_stem(1,2,"tb") ; draw_stem(3,4,"tb") ;
+ x5 = x7 = x1 ; x6 = x8 = x3 ; .5[y5,y8] = vround .52h ;
+ top y5 = vround .8h ;
+ top y6 = vround .67h ; y7 - y8 = y5 - y6 ;
+ draw z5 -- z6 ; draw z7 -- z8 ;
+endchar ;
+
+beginchar("a",10u#,ex#,0) ; "The rune a" ;
+ pickup main_nib ;
+ lft x1 = lft x2 = straight_sidebar = w - rt x3 = w - rt x4 ;
+ top y1 = h ; top y3 = vround .75h ; bot y2 = bot y4 = 0 ;
+ draw_stem(1,2,"b") ; draw_stem(3,4,"b") ;
+ draw z1 -- z3 ;
+endchar ;
+
+beginchar("A",10u#,ex#,0) ; "The rune long a" ;
+ pickup main_nib ;
+ lft x1 = lft x2 = straight_sidebar = w - rt x3 = w - rt x4 ;
+ top y1 = h ; top y3 = vround .75h ; bot y2 = bot y4 = 0 ;
+ draw_stem(1,2,"b") ; draw_stem(3,4,"b") ;
+ draw z1 -- z3 ;
+ x5 = x1 ; x6 = x3 ; y5 = vround .6h ; y5 - y6 = y1 - y3 ;
+ draw z5 -- z6 ;
+endchar ;
+
+beginchar("o",12u#,ex#,0) ; "The rune o" ;
+ pickup main_nib ;
+ lft x1 = curve_sidebar = w - rt x3 ; x2 = good.x .5w ;
+ bot y1 = bot y3 = 0 ; top y2 = h ;
+ diag(2,3) ; diag(2,1) ;
+endchar ;
+
+beginchar("O",16u#,ex#,0) ; "The rune long o" ;
+ pickup main_nib ;
+ lft x1 = curve_sidebar = w - rt x6 ;
+ rt x3 = hround .7w = w - lft x4 ;
+ x2 = good.x .5[x1,x3] ; x5 = good.x .5[x4,x6] ;
+ top y2 = top y5 = h ;
+ bot y1 = 0 ; y1 = y3 = y4 = y6 ;
+ diag(2,1) ; diag(2,3) ; diag(5,4) ; diag(5,6) ;
+endchar ;
+
+beginchar(15,15u#,ex#,0) ; "The rune long o---variant" ;
+ pickup main_nib ;
+ lft x1 = lft x2 = straight_sidebar = w - rt x4 = w - rt x5 ;
+ x3 = good.x .5[x1,x4] ;
+ top y1 = top y4 = h ; bot y2 = bot y5 = 0 = bot y3 ;
+ draw_stem(1,2,"b") ; draw_stem(4,5,"b") ; draw z1 -- z3 -- z4 ;
+endchar ;
+
+beginchar(47,12u#,ex#,0) ; "The rune oe" ;
+ pickup main_nib ;
+ lft x1 = curve_sidebar = w - rt x3 ; x2 = good.x .5w ;
+ bot y1 = bot y3 = 0 ; top y2 = h ;
+ diag(2,3) ; diag(2,1) ;
+ x4 = x2 ; y4 = y1 ; draw_stem(2,4,"b") ;
+endchar ;
+
+beginchar("0",12u#,ex#,0) ; "The rune oe---variant" ;
+ pickup main_nib ;
+ lft x1 = curve_sidebar = w - rt x3 ; x2 = good.x .5w ;
+ bot y1 = bot y3 = 0 ; top y2 = h ;
+ diag(2,3) ; diag(2,1) ;
+ x4 = x2 = x5 ; top y4 = vround .4h ; y5 = y1 ; draw z4 -- z5 ;
+endchar ;
+
+beginchar(5,12u#,ex#,0) ; "The rune n---another one" ;
+ pickup main_nib ;
+ lft x1 = curve_sidebar = w - rt x3 ;
+ x2 = x4 = good.x .5w ;
+ top y1 = top y3 = h ; bot y4 = 0 ; y2 = good.y .45h ;
+ draw_stem(2,4,"b") ; diag(1,2) ; diag(2,3) ;
+endchar ;
+
+beginchar("h",12u#,ex#,0) ; "The rune h" ;
+ pickup main_nib ;
+ lft x1 = curve_sidebar = w - rt x3 ;
+ x2 = x4 = good.x .5w ;
+ bot y1 = bot y3 = 0 ; top y4 = h ; y2 = good.y .55h ;
+ draw_stem(4,2,"t") ; diag(1,2) ; diag(2,3) ;
+endchar ;
+
+beginchar(6,8u#,ex#,0) ; "The cup rune" ;
+ pickup main_nib ;
+ lft x1 = lft x2 = lft x3 = straight_sidebar ; rt x4 = w - curve_sidebar ;
+ top y1 = h ; bot y2 = 0 ; .5[y3,y4] = vround .52h ; top y3 = vround .7h ;
+ draw_stem(1,2,"tb") ; diag(3,4) ;
+endchar ;
+
+beginchar(8,8u#,ex#,0) ; "The evanescent cup rune" ;
+ pickup main_nib ;
+ lft x3 = curve_sidebar ; rt x4 = w - curve_sidebar ;
+ .5[y3,y4] = vround .52h ; top y3 = vround .7h ;
+ diag(3,4) ; diag(4,3) ;
+endchar ;
+
+beginchar(9,8u#,ex#,0) ; "The schwa rune" ;
+ pickup main_nib ;
+ rt x1 = rt x2 = rt x3 = w - straight_sidebar ; lft x4 = curve_sidebar ;
+ top y1 = h ; bot y2 = 0 ; .5[y3,y4] = vround .52h ; top y3 = vround .7h ;
+ draw_stem(1,2,"tb") ; diag(3,4) ;
+endchar ;
+
+beginchar(10,8u#,ex#,0) ; "The evanescent schwa rune" ;
+ pickup main_nib ;
+ rt x3 = w - curve_sidebar ; lft x4 = curve_sidebar ;
+ .5[y3,y4] = vround .52h ; top y3 = vround .7h ;
+ diag(3,4) ; diag(4,3) ;
+endchar ;
+
+beginchar(16,10u#,ex#,0) ; "The rune ps" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; lft x1 = lft x2 = straight_sidebar ;
+ draw_stem(1,2,"tb") ;
+ bot y4 = vround 0.2[y2,y1] ; top y5 = vround .8[y2,y1] ;
+ x4 = x1 ; x5 = x2 ;
+ rt x3 = w - curve_sidebar ; y3 = 1/2[y4,y5] ;
+ draw z5 -- z3 -- z4 ;
+endchar ;
+
+beginchar(20,10u#,ex#,0) ; "The rune ts" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; rt x1 = rt x2 = w - straight_sidebar ;
+ draw_stem(1,2,"tb") ;
+ bot y4 = vround 0.2[y2,y1] ; top y5 = vround .8[y2,y1] ;
+ x4 = x5 = x1 ;
+ lft x3 = curve_sidebar ; y3 = 1/2[y4,y5] ;
+ draw z5 -- z3 -- z4 ;
+endchar ;
+
+beginchar(12,4u#,ex#,0) ; "The aspiration rune" ;
+ pickup main_nib ;
+ x1 = x2 = good.x .5w ;
+ bot y2 = vround .3h ; top y1 = vround .75h ;
+ draw_stem(1,2,"tb") ;
+endchar ;
+
+beginchar("&",8u#,ex#,0) ; "The ampersand rune" ;
+ pickup main_nib ;
+ x1 = x2 = good.x .5w ; lft x3 = curve_sidebar = w - rt x4 ;
+ top y1 = h ; bot y2 = 0 ;
+ bot y3 = vround .7h = h - top y4 ;
+ draw_stem(1,2,"") ; diag(1,3) ; diag(2,4) ;
+endchar ;
+
+beginchar(18,11u#,ex#,0) ; "The OE rune wyn" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; lft x1 = lft x2 = straight_sidebar ;
+ top y3 = .55[y1,y2] ; x3 = x1 ;
+ y4 = y1 ; rt x4 = w - curve_sidebar ;
+ draw_stem(1,2,"tb") ;
+ draw z3 -- z4 -- z1 ;
+endchar ;
+
+beginchar(19,15u#,ex#,0) ; "The OE rune daeg---variant" ;
+ pickup main_nib ;
+ lft x1 = lft x3 = w - rt x2 = w - rt x4 = straight_sidebar ;
+ top y1 = top y2 = h - bot y3 = h - bot y4 = h ;
+ draw z1 -- z4 -- z2 -- z3 -- cycle ; draw z1 -- z2 ; draw z3 -- z4 ;
+endchar ;
+
+beginchar(22,13u#,ex#,0) ; "The OE rune ac" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; lft x1 = lft x2 = straight_sidebar ;
+ draw_stem(1,2,"tb") ;
+ rt x4 = w - curve_sidebar ; x3 = .5[x1,x4] ; y4 = y1 ; y3 = .7[y2,y1] ;
+ draw z1 -- z3 ; diag(3,4) ;
+ x5 = x1 ; top y5 = .6[y2,y1] ; z5 - z1 = z6 - z3 = z7 - z4 ;
+ diag(5,6) ;
+endchar ;
+
+beginchar(23,14u#,ex#,0) ; "The OE rune yr" ;
+ pickup main_nib ;
+ lft x1 = lft x2 = straight_sidebar = w - rt x3 = w - rt x4 ;
+ top y1 = h ; top y3 = vround .75h ; bot y2 = bot y4 = 0 ;
+ draw_stem(1,2,"b") ; draw_stem(3,4,"b") ;
+ draw z1 -- z3 ;
+ x5 = x1 ; x6 = x3 ; y5 = vround .6h ; y5 - y6 = y1 - y3 ;
+ draw z5 -- z6 ;
+ z7 = .5[z5,z6] ; x7 := good.x x7 ; x8 = x7 ; y8 = y2 ; draw_stem(7,8,"b") ;
+endchar ;
+
+beginchar(24,13u#,ex#,0) ; "The OE rune calc" ;
+ pickup main_nib ;
+ lft x1 = lft x2 = straight_sidebar ; top y1 = h ; bot y2 = 0 ;
+ draw_stem(1,2,"tb") ;
+ .5[y3,y4] = vround .52h ; bot y3 = vround .4h ;
+ x3 = x1 ;
+ rt x5 = w - curve_sidebar ; y5 = y2 ; x4 = .5[x3,x5] ;
+ draw z3 -- z4 ; diag(4,5) ;
+endchar ;
+
+beginchar(25,12u#,ex#,0) ; "The OE rune feoh" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; lft x1 = lft x2 = straight_sidebar ;
+ top y3 = .6[y1,y2] ; x3 = x1 ;
+ y4 = y1 ; rt x4 = w - curve_sidebar ;
+ draw_stem(1,2,"tb") ;
+ diag(3,4) ;
+ z5 = .55[z1,z3] ; z6 = .5[z1,z4] ;
+ diag(5,6) ;
+endchar ;
+
+beginchar(26,14u#,ex#,0) ; "The Ereborian rune ai" ;
+ pickup main_nib ;
+ lft x1 = lft x2 = straight_sidebar = w - rt x3 = w - rt x4 ;
+ top y1 = h ; top y3 = vround .75h ; bot y2 = bot y4 = 0 ;
+ draw_stem(1,2,"b") ; draw_stem(3,4,"b") ;
+ draw z1 -- z3 ;
+ x5 = x1 ; x6 = x3 ; y5 = vround .6h ; y5 - y6 = y1 - y3 ;
+ z7 = .5[z5,z6] ; x7 := good.x x7 ; x8 = x7 ; y8 = y2 ; draw_stem(7,8,"tb") ;
+endchar ;
+
+beginchar(27,14u#,ex#,0) ; "The Ereborian ea rune" ;
+ pickup main_nib ;
+ lft x1 = lft x2 = straight_sidebar = w - rt x3 = w - rt x4 ;
+ bot y2 = bot y4 = 0 ; y1 = y3 = good.y .5h ;
+ draw_stem(1,2,"b") ; draw_stem(3,4,"b") ;
+ x5 = good.x .5w ; top y5 = h ; x6 = x5 ; y6 = y2 ;
+ draw z1 -- z5 -- z3 ; draw_stem(5,6,"b") ;
+endchar ;
+
+beginchar(28,13u#,ex#,0) ; "The Ereborian ew rune" ;
+ pickup main_nib ;
+ lft x1 = lft x3 = w - rt x2 = w - rt x4 = straight_sidebar ;
+ top y1 = top y2 = h - bot y3 = h - bot y4 = h ;
+ draw_stem(1,3,"b") ; draw_stem(2,4,"b") ;
+ x5 = x7 = x1 ; x6 = x8 = x2 ; y5 = y6 = .75[y1,y3] = h - y7 = h - y8 ;
+ draw z5 -- z8 ; draw z7 -- z6 ;
+endchar ;
+
+beginchar(29,16u#,ex#,0) ; "The rune number 4" ;
+ pickup main_nib ;
+ lft x1 = curve_sidebar = w - rt x6 ;
+ rt x3 = hround .7w = w - lft x4 ;
+ x2 = good.x .5[x1,x3] ; x5 = good.x .5[x4,x6] ;
+ bot y2 = bot y5 = 0 ;
+ top y1 = h ; y1 = y3 = y4 = y6 ;
+ diag(2,1) ; diag(2,3) ; diag(5,4) ; diag(5,6) ;
+endchar ;
+
+beginchar(30,16u#,ex#,0) ; "The rune number 5" ;
+ pickup main_nib ;
+ top y1 = h ; bot y2 = 0 ; x1 = x2 = good.x .5w ;
+ top y3 = .55[y1,y2] ; x3 = x1 ;
+ y4 = y1 ; lft x4 = curve_sidebar ;
+ draw_stem(1,2,"tb") ;
+ diag(3,4) ;
+ y5 = y4 ; x5 = w - x4 ;
+ diag(3,5) ;
+endchar ;
+
+end.
diff --git a/fonts/elvish/cirth.pk300 b/fonts/elvish/cirth.pk300
new file mode 100644
index 0000000000..f390e21626
--- /dev/null
+++ b/fonts/elvish/cirth.pk300
Binary files differ
diff --git a/fonts/elvish/cirth.pk360 b/fonts/elvish/cirth.pk360
new file mode 100644
index 0000000000..d589629c79
--- /dev/null
+++ b/fonts/elvish/cirth.pk360
Binary files differ
diff --git a/fonts/elvish/cirth.tfm b/fonts/elvish/cirth.tfm
new file mode 100644
index 0000000000..8212036e97
--- /dev/null
+++ b/fonts/elvish/cirth.tfm
Binary files differ
diff --git a/fonts/elvish/teng.tex b/fonts/elvish/teng.tex
new file mode 100644
index 0000000000..f87a2fbd7f
--- /dev/null
+++ b/fonts/elvish/teng.tex
@@ -0,0 +1,32 @@
+% Version 1.0 dated 31/01/90
+% macros for tengwar in Quenya and Sindarin
+\font\teng=teng10
+\def\qac#1#2{\accent`#2#1}
+\def\sac{\accent`}
+\catcode`\^^I=12 % want to get at tab
+{\catcode`\^=13%
+% Because we define various things that conflict with plain TeX
+% macros, we do all definitions inside the tengwar section, though
+% this is of course expensive
+\gdef\quenya{\teng\catcode`\^=13\let^=\qac\dotengdefs}
+\gdef\sindarin{\teng\catcode`\^=13\let^=\sac\dotengdefs}}
+\def\dotengdefs{%
+\def\lap##1##2{\ooalign{##2\crcr\hidewidth##1\hidewidth}}%
+\def\raisedlap##1##2{\ooalign{##2\crcr\hidewidth\raise0.35ex\hbox{##1}\hidewidth}}%
+\def\lowlap##1##2{\ooalign{##2\crcr\hidewidth\vbox{\vskip0.2ex%
+\hbox{##1}\vskip-.2ex}\hidewidth}}%
+\def\verylowlap##1##2{\ooalign{##2\crcr\hidewidth\lower0.3ex%
+\hbox{##1}\hidewidth}}%
+\def\ssy{\verylowlap^^Zz}%
+\def\ldot{\raisedlap^^El}%
+\def\S{\kern-0.15em^^S}%
+\def\s{\kern-0.15em^^T}%
+%%%%\def\ll{\raisedlap^^Bl}%
+\def\ll{\lap^^Cl}%
+\def\,{\lap^^E}%
+\def\y{\lap^^Y}\def\z{\lap^^Z}\def\Y{\lap"}\def\b{\lap^^B}\def\c{\lap^^C}%
+\def\N{\lap^^N}\def\.{\accent`i}\def\\{\accent`e}\def\U{\accent`^^V}%
+% control sequences for the extended tengwar
+\chardef\xT=12\chardef\xf=16\chardef\xC=27\chardef\xK=11%
+\chardef\xD=4\chardef\xv=18\chardef\xJ=10\chardef\xG=7%
+} % end \dotengdefs
diff --git a/fonts/elvish/teng10.mf b/fonts/elvish/teng10.mf
new file mode 100644
index 0000000000..2ccf66bfee
--- /dev/null
+++ b/fonts/elvish/teng10.mf
@@ -0,0 +1,31 @@
+designsize:=10pt#;
+% parameter settings
+em#:=10pt#; asc#:=8pt#; desc#:=10/3pt#; ex#:=14/3pt#; o#:=1/8pt#;
+% parameters
+tp_bow_stem_y = 0.55 ;
+cq_bow_stem_y = 0.45 ;
+tc_bow_arch_x = 0.55 ; % new value for experimental defn of luva
+pq_bow_arch_x = 0.5 ;
+tc_bow_side_y = 0.4 ;
+pq_bow_side_y = 0.5 ;
+tc_bow_end_x = 0.5 ;
+pq_bow_end_x = 0.6 ;
+tinco_fudge = 0 ; % for raising the top of tinco at low resolution;
+
+font_normal_space(0.4em#) ; font_x_height(ex#) ;
+font_quad(em#) ; font_normal_stretch(0.2em#) ;
+font_normal_shrink(0.1em#) ;
+
+penangle := 40 ;
+penwidth# := 1/9em# ; penthickness# := 1/70em# ;
+tehta_penwidth# = 0.8penwidth# ;
+straight_sidebar# = 1/12em#; curve_sidebar# = 1/18em#;
+fudge# := 0.05 ex# ; % fudge for lowering calma luva
+tinco_width# := 0.70em# ;
+parma_width# := 0.72em# ;
+romen_width# = 0.60em# ;
+luva_width# = 0.5em# ;
+
+% now make the font
+input tengmacs;input tengmain;input tengsecs;
+input tengteht; input tengdev ;
diff --git a/fonts/elvish/teng10.pk300 b/fonts/elvish/teng10.pk300
new file mode 100644
index 0000000000..d8f6385f15
--- /dev/null
+++ b/fonts/elvish/teng10.pk300
Binary files differ
diff --git a/fonts/elvish/teng10.pk360 b/fonts/elvish/teng10.pk360
new file mode 100644
index 0000000000..16c47de752
--- /dev/null
+++ b/fonts/elvish/teng10.pk360
Binary files differ
diff --git a/fonts/elvish/teng10.tfm b/fonts/elvish/teng10.tfm
new file mode 100644
index 0000000000..064febd287
--- /dev/null
+++ b/fonts/elvish/teng10.tfm
Binary files differ
diff --git a/fonts/elvish/tengdev.mf b/fonts/elvish/tengdev.mf
new file mode 100644
index 0000000000..c1b2d56e7f
--- /dev/null
+++ b/fonts/elvish/tengdev.mf
@@ -0,0 +1,350 @@
+
+ def draw_refl_luva(suffix i,j,k,l)
+ (expr luva_type,bow_stem_y,bow_arch_x,
+ bow_side_y,bow_end_x) =
+ y.i = bow_stem_y * ex ;
+ x.j - x.i = bow_arch_x * (x.k - x.i) ;
+ y.k = (if (luva_type = "calma") or (luva_type = "quesse"): 1 - fi bow_side_y) * ex ;
+ x.l - x.i = bow_end_x * (x.k - x.i) ;
+ numeric x.luva_serif,y.luva_serif ;
+ z.luva_serif = z.l + 0.03em *
+ if luva_type = "tinco": dir 135 else: dir 315 fi ;
+
+ path luva_path ;
+ luva_path = z.i{dir( if (luva_type = "tinco") or (luva_type = "parma"):
+ 180-penangle else: -penangle fi)}
+ .. z.j{if (luva_type = "tinco") or (luva_type = "parma"):
+ left else: right fi}
+ .. z.k ..
+ if (luva_type = "parma") or (luva_type = "quesse"): {curl 0.3}z.l
+ else: z.l .. {curl 2}z.luva_serif fi ;
+ draw luva_path ;
+ labels(i,j,k,l)
+ enddef ;
+
+def draw_refl_parma_luva(suffix i,j,k,l) =
+ % this draws a complete reflected parma luva
+ rt x.i = w - straight_sidebar ; % intersection with stem
+ top y.j = round(ex + o) ; % top
+ lft x.k = round (x.i - luva_width) ; % right
+ y.l = 0 ;% bottom
+ draw_refl_luva(i,j,k,l)("parma",tp_bow_stem_y,
+ pq_bow_arch_x,
+ pq_bow_side_y,
+ pq_bow_end_x )
+ enddef ;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+beginchar("0",.8tinco_width#,ex#,0); "The tengwa number zero";
+ pickup main_nib ;
+ lft x1 = curve_sidebar = w - rt x3 ; x2 = .5[x1,x3 ] ;
+ x4 = .2w ;
+ top y2 = h ;
+ y1 = .7h ; y3 = .55h ; y4 = 0 ;
+ z1' = z1 + .03em*dir(penangle-90) ;
+ draw z1'{dir(penangle+90)} .. z1 .. z2{right} .. z3{down} .. z4 ;
+endchar ;
+
+beginchar("1",.9tinco_width#,ex#,0) ; "The tengwa number one" ;
+ pickup main_nib ;
+ lft x1 = straight_sidebar = w - rt x2 ; top y1 = h = top y2 ;
+ draw_bar(1,2,"r") ;
+ x3 = x1 ; y3 = .4h = y5 ;
+ x4 = .4w ; bot y4 = 0 - o ;
+ rt x5 = .75w ;
+ z5' = z5 + 0.05em*dir140 ;
+ draw_telco(1,3,"t") ;
+ draw z3{down} .. z4{right} .. z5 %%%.. z5' ;
+endchar ;
+
+beginchar("2",1.4tinco_width#,ex#,0) ; "The tengwa number two" ;
+ pickup main_nib ;
+ lft x1 = straight_sidebar = w - rt x3 ; top y1 = top y2 = top y3 = h ;
+ draw_bar(1,3,"r") ;
+ rt x2 = round(.9*.75tinco_width) ; x2 = x6 ;
+ y4 = y6 = y8 = .4h ;
+ bot y5 = bot y7 = 0 ;
+ x8 - x6 = x6 - x4 ;
+ x5 = .4*.9tinco_width ; x4 = x1 ;
+ x5 - x4 = x7 - x6 ;
+ z8' = z8 + 0.05em*dir140 ;
+ draw_telco(1,4,"t") ; draw z2 -- z6 ;
+ draw z4{down} .. z5{right} .. z6 ;
+ draw z6{down} .. z7{right} .. z8 %%%.. z8' ;
+endchar ;
+
+beginchar("3",1.9tinco_width#,ex#,0) ; "The tengwa number three" ;
+ pickup main_nib ;
+ lft x1 = straight_sidebar = w - rt x3 ;
+ top y1 = top y2 = top y2' = top y3 = h ;
+ draw_bar(1,3,"r") ;
+ rt x2 = round(.9*.75tinco_width) ; x2 = x6 ;
+ x2' = x8 ;
+ y4 = y6 = y8 = y10 = .4h ;
+ bot y5 = bot y7 = bot y9 = 0 ;
+ x8 - x6 = x6 - x4 = x10 - x8 ;
+ x5 = .4*.9tinco_width ; x4 = x1 ;
+ x5 - x4 = x7 - x6 = x9 - x8 ;
+ z10' = z10 + 0.05em*dir140 ;
+ draw_telco(1,4,"t") ; draw z2 -- z6 ; draw z2' -- z8 ;
+ draw z4{down} .. z5{right} .. z6 ;
+ draw z6{down} .. z7{right} .. z8 ;
+ draw z8{down} .. z9{right} .. z10 %%%.. z10' ;
+endchar ;
+
+beginchar("4",.9tinco_width#,asc#,desc#) ; "The tengwa number four" ;
+ pickup main_nib ;
+ lft x1 = straight_sidebar = w - rt x2 ; top y1 = round ex = top y2 ;
+ x1' = x1 ; top y1' = h ;
+ %%draw_bar(1,2,"r") ;
+ x3 = x1 ; top y3 = 0 = y5 ;
+ x4 = .4w ; bot y4 = vround(-.7d-o) ;
+ rt x5 = .85w ;
+ z5' = z5 + 0.05em*dir140 ;
+ draw_telco(1',3,"t") ;
+ draw z3{down} .. z4{right} .. z5 %%%%.. z5' ;
+endchar ;
+
+beginchar("5",1.4tinco_width#,asc#,desc#) ; "The tengwa number five" ;
+ pickup main_nib ;
+ lft x1 = straight_sidebar = w - rt x3 ;
+ x1' = x1 ; top y1' = h ;
+ top y1 = top y2 = top y3 = round ex ;
+ draw_bar(1,3,"r") ;
+ rt x2 = round(.9*.75tinco_width) ; x2 = x6 ;
+ top y4 = -.1d ; y6 = y8 = .4ex ;
+ bot y5 = vround(-.7d-o) ; bot y7 = 0 ;
+ x8 - x6 = x6 - x4 ;
+ x5 = .4*.9tinco_width ; x4 = x1 ;
+ x5 - x4 = x7 - x6 ; x5' = .5[x4,x7] ; y5' = y5 ;
+ z8' = z8 + 0.05em*dir140 ;
+ draw_telco(1',4,"t") ; draw z2 -- z6 ;
+ draw z4{down} .. z5'{right} ... z7 ;
+ draw z6{down} .. z7{right} .. z8 %%%.. z8' ;
+endchar ;
+
+beginchar("6",1.9tinco_width#,asc#,desc#) ; "The tengwa number six" ;
+ pickup main_nib ;
+ lft x1 = straight_sidebar = w - rt x3 ;
+ x1' = x1 ; top y1' = h ;
+ top y1 = top y2 = top y3 = round ex ;
+ draw_bar(1,3,"r") ;
+ rt x2 = round(.9*.75tinco_width) ; x2 = x6 ;
+ x2' - x2 = x2 - x1 ; y2' = y2 ;
+ top y4 = -.1d ; y6 = y8 = y10 = .4ex ;
+ bot y5 = vround(-.7d-o) ; bot y7 = bot y9 = 0 ;
+ x8 - x6 = x6 - x4 = x10 - x8 ;
+ x5 = .4*.9tinco_width ; x4 = x1 ;
+ x5 - x4 = x7 - x6 = x9 - x8 ; x5' = .5[x4,x7] ; y5' = y5 ;
+ z8' = z8 + 0.05em*dir140 ;
+ draw_telco(1',4,"t") ; draw z2 -- z6 ; draw z2' -- z8 ;
+ draw z4{down} .. z5'{right} ... z7 ;
+ draw z6{down} .. z7{right} .. z8 ; %%%.. z8' ;
+ draw z8{down} .. z9{right} .. z10 ;
+endchar ;
+
+beginchar("7",.9parma_width#,ex#,desc#); "The tengwa number 7";
+ pickup main_nib ;
+ lft x1 = straight_sidebar ;
+ x5 = x1+hround(.6parma_width) ; top y5 = asc ; % top of stem
+ x6 = x5 ; y6 = 0 ; % bottom of stem
+ draw_telco(5,6)("t") ;
+ lft x9 = curve_sidebar ; top y9 = -.3d ;
+ x10 = .5[x6,x9] ; bot y10 = vround(-d-o) ;
+ x6' = x6 ; y6' = -.3d ;
+ draw z6 .. z6'{down} .. z10{left} .. z9 ;
+ endchar ;
+
+
+def draw_number_luva(suffix i,j,k,l) =
+ % this draws a complete number luva
+ lft x.i = hround(.6parma_width) + straight_sidebar ; % intersection with stem
+ top y.j = round(ex + o) ; % top
+ rt x.k = round (x.i + luva_width) ; % right
+ y.l = 0 ;% bottom
+ draw_luva(i,j,k,l)("parma",tp_bow_stem_y,
+ pq_bow_arch_x,
+ pq_bow_side_y,
+ pq_bow_end_x )
+ enddef ;
+
+beginchar("8",1.6parma_width#,ex#,desc#); "The tengwa number 8";
+ pickup main_nib ;
+ draw_number_luva(1,2,3,4) ;
+ x5 = x1 ; top y5 = asc ; % top of stem
+ x6 = x5 ; y6 = 0 ; % bottom of stem
+ draw_telco(5,6)("t") ;
+ x7 = x5 ; y7 = good.y o = y8 ; x8 = x3 + 0.05em ; % N.B. praps bot y7 = bot y8 = 0
+ draw_bar(7,8)("r") ;
+ lft x9 = curve_sidebar ; top y9 = -.1d ;
+ x10 = .5[x5,x9] ; bot y10 = vround(-d-o) ;
+ x6' = x6 ; y6' = -.3d ;
+ draw z6 .. z6'{down} .. z10{left} .. z9 ;
+ endchar ;
+
+def draw_double_number_luva(suffix i,j,k,l,ii,jj,kk,ll) =
+ % this draws a complete umbar luva
+ % first bow
+ lft x.i = hround(.6parma_width)+straight_sidebar ; % intersection with stem
+ top y.j = round(ex + o) ; % top
+ rt x.k = round (x.i + luva_width) ; % right
+ y.l = 0 ;% bottom
+ draw_luva(i,j,k,l)("parma",tp_bow_stem_y,
+ pq_bow_arch_x,
+ pq_bow_side_y,
+ pq_bow_end_x ) ;
+ %second bow
+ z.second = ( (x.i+pt,y.i) .. (infinity,y.i) ) intersectionpoint luva_path ;
+ x.ii = good.x (xpart z.second) ;
+ y.jj = y.j ;
+ rt x.kk = round (x.ii + luva_width) ; % right
+ y.ll = y.l ;
+ draw_luva(ii,jj,kk,ll)("parma",tp_bow_stem_y,
+ pq_bow_arch_x,
+ pq_bow_side_y,
+ pq_bow_end_x )
+ enddef ;
+
+beginchar("9",2.25parma_width#,ex#,desc#); "The tengwa number 9";
+ pickup main_nib ;
+ draw_double_number_luva(1,2,3,4,9,10,11,12) ;
+ x5 = x1 ; top y5 = asc ; % top of stem
+ x6 = x5 ; y6 = 0 ; % bottom of stem
+ draw_telco(5,6)("t") ;
+ x7 = x5 ; y7 = good.y o = y8 ; x8 = x11 + 0.05em ;
+ draw_bar(7,8)("r") ;
+ lft x13 = curve_sidebar ; top y13 = -.1d ;
+ x14 = .5[x5,x13] ; bot y14 = vround(-d-o) ;
+ x6 = x6' ; y6' = -.3d ;
+ draw z6 .. z6'{down} .. z14{left} .. z13 ;
+ endchar ;
+
+beginchar("+",0.9*tinco_width#,asc#,0) ; "The tengwa number 10" ;
+ pickup main_nib ;
+ rt x4 = w - curve_sidebar ; y4 = 0.65ex ; % right side of bow
+ bot y3 = round(-o) ; x3 = good.x 0.5w ; % bottom
+ x2 = w - x4 ; y2 = 0.45ex ; % left side of bow
+ x1 = good.x 0.3w ; y1 = 0.7ex ; % end of bow
+ z1' = z1 + 0.03em*dir(10) ; % serif
+ x5 = 0.25w ; y5 = 0.95asc ; % top end of letter
+ z6 = z5 + 0.05em*(dir(penangle+80)) ; % for serif
+ draw z1'{dir(180+penangle)} .. z1 .. z2 .. z3
+ .. z4{up} .. tension 0.9 and 3 .. z5 ;
+ labels(1,1',2,3,4,5,6) ;
+endchar ;
+
+beginchar("-",0.85tinco_width#,asc#,desc#) ; "The tengwa number" ;
+ pickup main_nib ;
+ numeric t[] ;
+ % top bow first - make a path for later use
+ x1 = 0.25w ; y1 = 0.95asc ; % top
+ z1' = z1 + 0.05em*dir(penangle+80) ; % serif
+ rt x2 = w - curve_sidebar ; y2 = 0.5h ; % right side of top bow ;
+ x3 = 0.5w ; y3 = good.y 0.2h ; % bottom of top bow
+ x4 = 0.3w ; y4 = 0.5h ; % end of bow
+ z4' = z4 + 0.03em*dir(10) ; % serif
+ path p ;
+ p = z4'{dir(penangle+180)} .. z4 .. z3{right} .. z2{up} ..
+ tension 0.9 and 2.5 .. z1 ;
+ draw p ;
+ x5' = x1 ; y5'-y7 = y1-y3 ; % top of bottom bow
+ x6 = x2 ; y6 - y7 = y2 - y3 ; % side
+ x7 = x3 ; bot y7 = round(-0.9desc) ; % bottom
+ z8 - z7 = z4 - z3 ; % end
+ z8' - z8 = z4' - z4 ;
+ path pa ;
+ pa = z8'{dir(penangle+180)} .. z8 .. z7{right} .. z6{up} ..
+ tension 0.9 and 1.3 .. z5' ;
+ (t1,t2) = p intersectiontimes pa ;
+ draw subpath(0,t2) of pa ;
+ labels(1,2,3,4,5,6,7,8) ;
+endchar ;
+
+beginchar("/",0.9*tinco_width#,ex#,desc#); "The tengwa number 12";
+ pickup main_nib ;
+ lft x2 = curve_sidebar ; y2 = 0.6 ex ; % left
+ top y3 = round(ex+o) ; x3 = 0.55w ; % top
+ rt x4 = w - curve_sidebar ; y4 = 0.4 ex ;
+ x1 = x2 + 0.45w ; y1 = 0.2 ex ; % curly end
+ x5 = x2 ; y5 = -0.9desc ;
+ draw z1{dir(penangle+180)} .. z2{up} .. z3{right} ..
+ z4{down} .. tension 3 .. z5 ;
+ labels(1,2,3,4,5) ;
+endchar ;
+
+beginchar("{",0.2em#,1.5ex#,0) ; "The circle-over tehta" ;
+ pickup tehta_nib ;
+ x1 = x3 = good.x .5w ; bot y3 = vround(1.3ex) ;
+ y1 = y3 + vround .45ex ; y1 - y3 = x2 - x4 ;
+ y2 = y4 = .5[y1,y3] ; x1 = .5[x2,x4] ;
+ draw z1 .. z2 .. z3 .. z4 .. cycle ;
+endchar ;
+
+beginchar("}",0.2em#,0,desc#) ; "The circle-over tehta" ;
+ pickup tehta_nib ;
+ x1 = x3 = good.x .5w ; top y1 = vround -.3ex ;
+ y1 = y3 + vround .45ex ; y1 - y3 = x2 - x4 ;
+ y2 = y4 = .5[y1,y3] ; x1 = .5[x2,x4] ;
+ draw z1 .. z2 .. z3 .. z4 .. cycle ;
+endchar ;
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+beginchar(28,parma_width#,ex#,desc#); "Reflected parma"; % ^^\
+ pickup main_nib ;
+ draw_refl_parma_luva(1,2,3,4) ;
+ x5 = x1 ; top y5 = ex ; % top of stem
+ x6 = x5 ; bot y6 = -desc ; % bottom of stem
+ draw_telco(5,6)("tb") ;
+ x7 = x5 ; y7 = good.y o = y8 ; x8 = x3 - 0.05em ; % N.B. praps bot y7 = bot y8 = 0
+ draw_bar(7,8)("r") ;
+ endchar ;
+
+beginchar(29,parma_width#,ex#,0); "Reflected formen";
+ pickup main_nib ;
+ draw_refl_parma_luva(1,2,3,4) ;
+ x5 = x1 ; top y5 = asc ; % top of stem
+ x6 = x5 ; y6 = 0 ; % bottom of stem
+ draw_telco(5,6)("t") ;
+ x7 = x5 ; y7 = good.y o = y8 ; x8 = x3 - 0.05em ; % N.B. praps bot y7 = bot y8 = 0
+ draw_bar(7,8)("r") ;
+ endchar ;
+
+beginchar("(",0.4em#,asc#,0) ; "Left paren" ;
+ pickup main_nib ;
+ top y1 = round asc ; bot y3 = 0 ; y2 = 1/2[y1,y3] ;
+ lft x2 = straight_sidebar = w - rt x1 = w - rt x3 ;
+ draw z1 .. z2 .. z3 ;
+endchar ;
+
+beginchar(")",0.4em#,asc#,0) ; "Right paren" ;
+ pickup main_nib ;
+ top y1 = round asc ; bot y3 = 0 ; y2 = 1/2[y1,y3] ;
+ lft x1 = lft x3 = straight_sidebar = w - rt x2 ;
+ draw z1 .. z2 .. z3 ;
+endchar ;
+
+beginchar("`",0.5em#,ex#,0) ; "Left guillemet" ;
+ pickup tehta_nib ;
+ y2 = 0.6ex = 1/2[y1,y3] ;
+ y1 - y3 = 0.4ex ;
+ lft x2 = straight_sidebar = w - rt x1 - 0.2em ; x1 = x3 ;
+ draw z1 .. z2 .. z3 ;
+ forsuffixes i=1,2,3: x.i' = x.i + round(0.2em) ; y.i' = y.i ; endfor ;
+ draw z1' .. z2' .. z3' ;
+endchar ;
+
+beginchar("'",0.5em#,ex#,0) ; "Right guillemet" ;
+ pickup tehta_nib ;
+ y2 = 0.6ex = 1/2[y1,y3] ;
+ y1 - y3 = 0.4ex ;
+ rt x2 = w - straight_sidebar = w - lft x1 + 0.2em ; x1 = x3 ;
+ draw z1 .. z2 .. z3 ;
+ forsuffixes i=1,2,3: x.i' = x.i - round(0.2em) ; y.i' = y.i ; endfor ;
+ draw z1' .. z2' .. z3' ;
+endchar ;
+
+end.
diff --git a/fonts/elvish/tengmacs.mf b/fonts/elvish/tengmacs.mf
new file mode 100644
index 0000000000..b28eb37aa9
--- /dev/null
+++ b/fonts/elvish/tengmacs.mf
@@ -0,0 +1,221 @@
+autorounding := 1 ;
+mode_setup;
+define_pixels(em,asc,desc,ex);
+define_blacker_pixels(penwidth,penthickness) ;
+define_blacker_pixels(tehta_penwidth) ;
+define_corrected_pixels(o);
+define_whole_pixels(straight_sidebar,curve_sidebar) ;
+
+define_pixels(fudge, tinco_width, parma_width, romen_width) ;
+define_pixels(luva_width) ;
+pickup pencircle xscaled penwidth yscaled penthickness rotated penangle;
+main_nib := savepen ;
+pickup pencircle xscaled tehta_penwidth yscaled penthickness rotated penangle;
+tehta_nib := savepen ;
+
+def draw_luva(suffix i,j,k,l)
+ (expr luva_type,bow_stem_y,bow_arch_x,
+ bow_side_y,bow_end_x) =
+ y.i = bow_stem_y * ex ;
+ x.j - x.i = bow_arch_x * (x.k - x.i) ;
+ y.k = (if (luva_type = "calma") or (luva_type = "quesse"): 1 - fi bow_side_y) * ex ;
+ x.l - x.i = bow_end_x * (x.k - x.i) ;
+ numeric x.luva_serif,y.luva_serif ;
+ z.luva_serif = z.l + 0.03em *
+ if luva_type = "tinco": dir 135 else: dir 315 fi ;
+
+ path luva_path ;
+ luva_path = z.i{dir( if (luva_type = "tinco") or (luva_type = "parma"):
+ penangle else: penangle+180 fi)}
+ .. z.j{if (luva_type = "tinco") or (luva_type = "parma"):
+ right else: left fi}
+ .. z.k ..
+ if (luva_type = "parma") or (luva_type = "quesse"): {curl 0.3}z.l
+ else: z.l .. {curl 2}z.luva_serif fi ;
+ draw luva_path ;
+ labels(i,j,k,l)
+ enddef ;
+
+def draw_tinco_luva(suffix i,j,k,l) =
+ % this draws a complete tinco luva, using the four given suffices
+ % for the control points. ALL the information about the control
+ % points is determined within the macro; they are provided only for
+ % information and later use.
+ lft x.i = straight_sidebar ; % intersection with stem
+ top y.j = round(ex + o + tinco_fudge) ; % top
+ rt x.k = round (x.i + luva_width) ; % right
+ bot y.l = 0; % round (- o) ; % bottom, with fudge factor
+ draw_luva(i,j,k,l)("tinco",tp_bow_stem_y,
+ tc_bow_arch_x,
+ tc_bow_side_y,
+ tc_bow_end_x )
+
+ enddef ;
+
+def draw_ando_luva(suffix i,j,k,l,ii,jj,kk,ll) =
+ % this draws a complete ando luva
+ % first bow
+ lft x.i = straight_sidebar ; % intersection with stem
+ top y.j = round(ex + o + tinco_fudge) ; % top
+ rt x.k = round (x.i + luva_width) ; % right
+ bot y.l = round (- o) ; % bottom, with fudge factor
+ draw_luva(i,j,k,l)("tinco",tp_bow_stem_y,
+ tc_bow_arch_x,
+ tc_bow_side_y,
+ tc_bow_end_x ) ;
+ % now the second luva
+ z.second = ( (x.i+pt,y.i) .. (infinity,y.i) ) intersectionpoint luva_path ;
+ x.ii = good.x (xpart z.second) ;
+ y.jj = y.j ;
+ rt x.kk = round (x.ii + luva_width) ; % right
+ y.ll = y.l ;
+ draw_luva(ii,jj,kk,ll)("tinco",tp_bow_stem_y,
+ tc_bow_arch_x,
+ tc_bow_side_y,
+ tc_bow_end_x )
+ enddef ;
+
+def draw_parma_luva(suffix i,j,k,l) =
+ % this draws a complete parma luva
+ lft x.i = straight_sidebar ; % intersection with stem
+ top y.j = round(ex + o) ; % top
+ rt x.k = round (x.i + luva_width) ; % right
+ bot y.l = 0 ;% bottom
+ draw_luva(i,j,k,l)("parma",tp_bow_stem_y,
+ pq_bow_arch_x,
+ pq_bow_side_y,
+ pq_bow_end_x )
+ enddef ;
+
+def draw_umbar_luva(suffix i,j,k,l,ii,jj,kk,ll) =
+ % this draws a complete umbar luva
+ % first bow
+ lft x.i = straight_sidebar ; % intersection with stem
+ top y.j = round(ex + o) ; % top
+ rt x.k = round (x.i + luva_width) ; % right
+ bot y.l = 0 ;% bottom
+ draw_luva(i,j,k,l)("parma",tp_bow_stem_y,
+ pq_bow_arch_x,
+ pq_bow_side_y,
+ pq_bow_end_x ) ;
+ %second bow
+ z.second = ( (x.i+pt,y.i) .. (infinity,y.i) ) intersectionpoint luva_path ;
+ x.ii = good.x (xpart z.second) ;
+ y.jj = y.j ;
+ rt x.kk = round (x.ii + luva_width) ; % right
+ y.ll = y.l ;
+ draw_luva(ii,jj,kk,ll)("parma",tp_bow_stem_y,
+ pq_bow_arch_x,
+ pq_bow_side_y,
+ pq_bow_end_x )
+ enddef ;
+
+def draw_calma_luva(suffix i,j,k,l) =
+ % this draws a complete calma luva
+ rt x.i = w - straight_sidebar ; % intersection with stem
+ y.j = good.y 0 ; % bottom
+ lft x.k = round (x.i - luva_width) ; % left
+ top y.l = round(ex - fudge) ; % top
+ draw_luva(i,j,k,l)("calma",cq_bow_stem_y,
+ tc_bow_arch_x,
+ tc_bow_side_y,
+ tc_bow_end_x )
+ enddef ;
+
+def draw_anga_luva(suffix i,j,k,l,ii,jj,kk,ll) =
+ % this draws a complete anga luva
+ % first bow
+ rt x.i = w - straight_sidebar ; % intersection with stem
+ y.j = good.y 0 ; % bottom
+ lft x.k = round (x.i - luva_width) ; % left
+ top y.l = round(ex - fudge) ; % top
+ draw_luva(i,j,k,l)("calma",cq_bow_stem_y,
+ tc_bow_arch_x,
+ tc_bow_side_y,
+ tc_bow_end_x ) ;
+ % now the second luva
+ z.second = ( (x.i-pt,y.i) .. (-infinity,y.i) ) intersectionpoint luva_path ;
+ x.ii = good.x (xpart z.second) ;
+ y.jj = y.j ;
+ lft x.kk = round (x.ii - luva_width) ; % left
+ y.ll = y.l ;
+ draw_luva(ii,jj,kk,ll)("calma",cq_bow_stem_y,
+ tc_bow_arch_x,
+ tc_bow_side_y,
+ tc_bow_end_x )
+ enddef ;
+
+def draw_quesse_luva(suffix i,j,k,l) =
+ % this draws a complete quesse luva
+ rt x.i = w - straight_sidebar ; % intersection with stem
+ y.j = good.y 0 ; % bottom
+ lft x.k = round (x.i - luva_width) ; % left
+ top y.l = round(ex) ; % top
+ draw_luva(i,j,k,l)("quesse",cq_bow_stem_y,
+ pq_bow_arch_x,
+ pq_bow_side_y,
+ pq_bow_end_x )
+ enddef ;
+
+def draw_ungwe_luva(suffix i,j,k,l,ii,jj,kk,ll) =
+ % this draws a complete ungwe luva
+ % first bow
+ rt x.i = w - straight_sidebar ; % intersection with stem
+ y.j = good.y 0 ; % bottom
+ lft x.k = round (x.i - luva_width) ; % left
+ top y.l = round(ex) ; % top
+ draw_luva(i,j,k,l)("quesse",cq_bow_stem_y,
+ pq_bow_arch_x,
+ pq_bow_side_y,
+ pq_bow_end_x ) ;
+ % second bow
+ z.second = ( (x.i-pt,y.i) .. (-infinity,y.i) ) intersectionpoint luva_path ;
+ x.ii = good.x (xpart z.second) ;
+ y.jj = y.j ;
+ lft x.kk = round (x.ii - luva_width) ; % left
+ y.ll = y.l ;
+ draw_luva(ii,jj,kk,ll)("quesse",cq_bow_stem_y,
+ pq_bow_arch_x,
+ pq_bow_side_y,
+ pq_bow_end_x )
+ enddef ;
+
+
+
+def draw_telco(suffix i,j)(expr serifs) = % serifs = t,b,tb for Top & Bottom
+ z.i.$ = z.i + 0.05em * dir(penangle+180) ;
+ z.i.$$ = z.i + 0.1em * down ;
+ z.j.$ = z.j + 0.05em * dir(penangle) ;
+ z.j.$$ = z.j + 0.1em * up ;
+ draw z.i .. z.j ;
+ if (serifs = "t") or (serifs = "tb"):
+ filldraw z.i -- z.i.${dir(penangle-90)}
+ .. {down}z.i.$$ & z.i.$$ .. z.i & cycle ; fi
+ if (serifs = "b") or (serifs = "tb"):
+ filldraw z.j -- z.j.${dir(penangle+90)}
+ .. {up}z.j.$$ & z.j.$$ .. z.j & cycle ; fi
+ labels(i,j)
+ enddef ;
+
+def draw_bar(suffix i,j)(expr serifs) = % serifs = r,l,rl for Right/Left
+ z.right_serif1 = z.j + 0.04em * left ;
+ z.right_serif2 = z.j + 0.04em * dir penangle ;
+ z.left_serif1 = z.i + 0.04em * right ;
+ z.left_serif2 = z.i + 0.04em * dir(penangle+180) ;
+ draw if (serifs = "l") or (serifs = "rl"):
+ z.left_serif2{dir penangle} .. z.left_serif1 else: z.i fi
+ ---
+ if (serifs = "r") or (serifs = "rl"):
+ z.right_serif1 .. {dir penangle}z.right_serif2 else: z.j fi ;
+labels(i,j)
+ enddef ;
+
+
+def draw_dot(suffix i) =
+ % calculate width of pen
+ numeric penwdth ;
+ 1.1penwdth = (pen_rt - pen_lft) ++ (pen_top - pen_bot) ;
+ z.i.$ = z.i + 1/2penwdth*dir(penangle+90) ;
+ z.i.$$ = z.i + 1/2penwidth*dir(penangle-90) ;
+ draw z.i.$$ -- z.i.$ ; drawdot z.i.$$ ; drawdot z.i.$ ;
+enddef ;
diff --git a/fonts/elvish/tengmain.mf b/fonts/elvish/tengmain.mf
new file mode 100644
index 0000000000..189aa26de1
--- /dev/null
+++ b/fonts/elvish/tengmain.mf
@@ -0,0 +1,296 @@
+
+beginchar("t",tinco_width#,ex#,desc#); "The tengwa tinco";
+ pickup main_nib ;
+ draw_tinco_luva(1,2,3,4) ;
+ x5 = x1 ; top y5 = ex ; % top of stem
+ x6 = x5 ; bot y6 = -desc ; % bottom of stem
+ draw_telco(5,6)("tb") ;
+endchar ;
+
+beginchar("d",1.65tinco_width#,ex#,desc#); "The tengwa ando";
+ pickup main_nib ;
+ draw_ando_luva(1,2,3,4,7,8,9,10) ;
+ x5 = x1 ; top y5 = ex ; % top of stem
+ x6 = x5 ; bot y6 = -desc ; % bottom of stem
+ draw_telco(5,6)("tb") ;
+endchar ;
+
+
+beginchar("p",parma_width#,ex#,desc#); "The tengwa parma";
+ pickup main_nib ;
+ draw_parma_luva(1,2,3,4) ;
+ x5 = x1 ; top y5 = ex ; % top of stem
+ x6 = x5 ; bot y6 = -desc ; % bottom of stem
+ draw_telco(5,6)("tb") ;
+ x7 = x5 ; y7 = good.y o = y8 ; x8 = x3 + 0.05em ; % N.B. praps bot y7 = bot y8 = 0
+ draw_bar(7,8)("r") ;
+ endchar ;
+
+beginchar("b",1.65parma_width#,ex#,desc#); "The tengwa umbar";
+ pickup main_nib ;
+ draw_umbar_luva(1,2,3,4,9,10,11,12) ;
+ x5 = x1 ; top y5 = ex ; % top of stem
+ x6 = x5 ; bot y6 = -desc ; % bottom of stem
+ draw_telco(5,6)("tb") ;
+ x7 = x5 ; y7 = good.y o = y8 ; x8 = x11 + 0.05em ;
+ draw_bar(7,8)("r") ;
+ endchar ;
+
+
+beginchar("c",tinco_width#,ex#,desc#); "The tengwa calma";
+ pickup main_nib ;
+ draw_calma_luva(1,2,3,4) ;
+ x5 = x1 ; top y5 = ex ; % top of stem
+ x6 = x5 ; bot y6 = -desc ; % bottom of stem
+ draw_telco(5,6)("tb") ;
+ endchar ;
+
+beginchar("j",1.65tinco_width#,ex#,desc#); "The tengwa anga";
+ pickup main_nib ;
+ draw_anga_luva(1,2,3,4,7,8,9,10) ;
+ x5 = x1 ; top y5 = ex ; % top of stem
+ x6 = x5 ; bot y6 = -desc ; % bottom of stem
+ draw_telco(5,6)("tb") ;
+ endchar ;
+
+beginchar("k",parma_width#,ex#,desc#); "The tengwa quesse";
+ pickup main_nib ;
+ draw_quesse_luva(1,2,3,4) ;
+ x5 = x1 ; top y5 = ex ; % top of stem
+ x6 = x5 ; bot y6 = -desc ; % bottom of stem
+ draw_telco(5,6)("b") ;
+ x7 = x5 ; top y7 = ex = top y8 ; x8 = x3 - 0.05em ; % N.B. praps top y7 = top y8 = 0
+ draw_bar(8,7)("l");
+ endchar ;
+
+beginchar("g",1.65parma_width#,ex#,desc#); "The tengwa ungwe";
+ pickup main_nib ;
+ draw_ungwe_luva(1,2,3,4,9,10,11,12) ;
+ x5 = x1 ; top y5 = ex ; % top of stem
+ x6 = x5 ; bot y6 = -desc ; % bottom of stem
+ draw_telco(5,6)("b") ;
+ x7 = x5 ; top y7 = ex = top y8 ; x8 = x11 - 0.05em ;
+ draw_bar(8,7)("l");
+ endchar ;
+
+beginchar(12,tinco_width#,asc#,desc#); "Extended sule"; % ^^L
+ pickup main_nib ;
+ draw_tinco_luva(1,2,3,4) ;
+ x5 = x1 ; top y5 = asc ; % top of stem
+ x6 = x5 ; bot y6 = -desc ; % bottom of stem
+ draw_telco(5,6)("tb") ;
+endchar ;
+
+beginchar(4,1.65tinco_width#,asc#,desc#); "Extended anto"; % ^^D
+ pickup main_nib ;
+ draw_ando_luva(1,2,3,4,7,8,9,10) ;
+ x5 = x1 ; top y5 = asc ; % top of stem
+ x6 = x5 ; bot y6 = -desc ; % bottom of stem
+ draw_telco(5,6)("tb") ;
+endchar ;
+
+
+beginchar(16,parma_width#,asc#,desc#); "Extended formen"; % ^^P
+ pickup main_nib ;
+ draw_parma_luva(1,2,3,4) ;
+ x5 = x1 ; top y5 = asc ; % top of stem
+ x6 = x5 ; bot y6 = -desc ; % bottom of stem
+ draw_telco(5,6)("tb") ;
+ x7 = x5 ; y7 = good.y o = y8 ; x8 = x3 + 0.05em ; % N.B. praps bot y7 = bot y8 = 0
+ draw_bar(7,8)("r") ;
+ endchar ;
+
+beginchar(18,1.65parma_width#,asc#,desc#); "Extended ampa"; % ^^R
+ pickup main_nib ;
+ draw_umbar_luva(1,2,3,4,9,10,11,12) ;
+ x5 = x1 ; top y5 = asc ; % top of stem
+ x6 = x5 ; bot y6 = -desc ; % bottom of stem
+ draw_telco(5,6)("tb") ;
+ x7 = x5 ; y7 = good.y o = y8 ; x8 = x11 + 0.05em ;
+ draw_bar(7,8)("r") ;
+ endchar ;
+
+
+beginchar(27,tinco_width#,asc#,desc#); "Extended aha"; % ^^[
+ pickup main_nib ;
+ draw_calma_luva(1,2,3,4) ;
+ x5 = x1 ; top y5 = asc ; % top of stem
+ x6 = x5 ; bot y6 = -desc ; % bottom of stem
+ draw_telco(5,6)("tb") ;
+ endchar ;
+
+beginchar(10,1.65tinco_width#,asc#,desc#); "Extended anca"; % ^^J
+ pickup main_nib ;
+ draw_anga_luva(1,2,3,4,7,8,9,10) ;
+ x5 = x1 ; top y5 = asc ; % top of stem
+ x6 = x5 ; bot y6 = -desc ; % bottom of stem
+ draw_telco(5,6)("tb") ;
+ endchar ;
+
+beginchar(11,parma_width#,asc#,desc#); "Extended hwesta"; % ^^K
+ pickup main_nib ;
+ draw_quesse_luva(1,2,3,4) ;
+ x5 = x1 ; top y5 = asc ; % top of stem
+ x6 = x5 ; bot y6 = -desc ; % bottom of stem
+ draw_telco(5,6)("tb") ;
+ x7 = x5 ; top y7 = ex = top y8 ; x8 = x3 - 0.05em ; % N.B. praps top y7 = top y8 = 0
+ draw_bar(8,7)("l");
+ endchar ;
+
+beginchar(7,1.65parma_width#,asc#,desc#); "Extended unque"; % ^^G
+ pickup main_nib ;
+ draw_ungwe_luva(1,2,3,4,9,10,11,12) ;
+ x5 = x1 ; top y5 = asc ; % top of stem
+ x6 = x5 ; bot y6 = -desc ; % bottom of stem
+ draw_telco(5,6)("b") ;
+ x7 = x5 ; top y7 = ex = top y8 ; x8 = x11 - 0.05em ;
+ draw_bar(8,7)("l");
+ endchar ;
+
+beginchar("T",tinco_width#,ex#,0); "The tengwa thule";
+ pickup main_nib ;
+ draw_tinco_luva(1,2,3,4) ;
+ x5 = x1 ; top y5 = asc ; % top of stem
+ x6 = x5 ; y6 = 0 ; % bottom of stem
+ draw_telco(5,6)("tb") ;
+endchar ;
+
+beginchar("D",1.65tinco_width#,ex#,0); "The tengwa anto";
+ pickup main_nib ;
+ draw_ando_luva(1,2,3,4,7,8,9,10) ;
+ x5 = x1 ; top y5 = asc ; % top of stem
+ x6 = x5 ; y6 = 0 ; % bottom of stem
+ draw_telco(5,6)("tb") ;
+endchar ;
+
+
+beginchar("f",parma_width#,ex#,0); "The tengwa formen";
+ pickup main_nib ;
+ draw_parma_luva(1,2,3,4) ;
+ x5 = x1 ; top y5 = asc ; % top of stem
+ x6 = x5 ; y6 = 0 ; % bottom of stem
+ draw_telco(5,6)("t") ;
+ x7 = x5 ; y7 = good.y o = y8 ; x8 = x3 + 0.05em ; % N.B. praps bot y7 = bot y8 = 0
+ draw_bar(7,8)("r") ;
+ endchar ;
+
+beginchar("v",1.65parma_width#,ex#,0); "The tengwa ampa";
+ pickup main_nib ;
+ draw_umbar_luva(1,2,3,4,9,10,11,12) ;
+ x5 = x1 ; top y5 = asc ; % top of stem
+ x6 = x5 ; y6 = 0 ; % bottom of stem
+ draw_telco(5,6)("t") ;
+ x7 = x5 ; y7 = good.y o = y8 ; x8 = x11 + 0.05em ;
+ draw_bar(7,8)("r") ;
+ endchar ;
+
+
+beginchar("C",tinco_width#,ex#,0); "The tengwa aha";
+ pickup main_nib ;
+ draw_calma_luva(1,2,3,4) ;
+ x5 = x1 ; top y5 = asc ; % top of stem
+ x6 = x5 ; y6 = 0 ; % bottom of stem
+ draw_telco(5,6)("tb") ;
+ endchar ;
+
+beginchar("J",1.65tinco_width#,ex#,0); "The tengwa anca";
+ pickup main_nib ;
+ draw_anga_luva(1,2,3,4,7,8,9,10) ;
+ x5 = x1 ; top y5 = asc ; % top of stem
+ x6 = x5 ; y6 = 0 ; % bottom of stem
+ draw_telco(5,6)("tb") ;
+ endchar ;
+
+beginchar("K",parma_width#,ex#,0); "The tengwa hwesta";
+ pickup main_nib ;
+ draw_quesse_luva(1,2,3,4) ;
+ x5 = x1 ; top y5 = asc ; % top of stem
+ x6 = x5 ; y6 = 0 ; % bottom of stem
+ draw_telco(5,6)("tb") ;
+ x7 = x5 ; top y7 = ex = top y8 ; x8 = x3 - 0.05em ; % N.B. praps top y7 = top y8 = 0
+ draw_bar(8,7)("l");
+ endchar ;
+
+beginchar("G",1.65parma_width#,ex#,0); "The tengwa unque";
+ pickup main_nib ;
+ draw_ungwe_luva(1,2,3,4,9,10,11,12) ;
+ x5 = x1 ; top y5 = asc ; % top of stem
+ x6 = x5 ; y6 = 0 ; % bottom of stem
+ draw_telco(5,6)("tb") ;
+ x7 = x5 ; top y7 = ex = top y8 ; x8 = x11 - 0.05em ;
+ draw_bar(8,7)("l");
+ endchar ;
+
+beginchar("R",tinco_width#,ex#,0); "The tengwa ore";
+ pickup main_nib ;
+ draw_tinco_luva(1,2,3,4) ;
+ x5 = x1 ; top y5 = ex ; % top of stem
+ x6 = x5 ; y6 = 0 ; % bottom of stem
+ draw_telco(5,6)("tb") ;
+endchar ;
+
+beginchar("n",1.65tinco_width#,ex#,0); "The tengwa numen";
+ pickup main_nib ;
+ draw_ando_luva(1,2,3,4,7,8,9,10) ;
+ x5 = x1 ; top y5 = ex ; % top of stem
+ x6 = x5 ; y6 = 0 ; % bottom of stem
+ draw_telco(5,6)("tb") ;
+endchar ;
+
+
+beginchar("w",parma_width#,ex#,0); "The tengwa vala";
+ pickup main_nib ;
+ draw_parma_luva(1,2,3,4) ;
+ x5 = x1 ; top y5 = ex ; % top of stem
+ x6 = x5 ; y6 = 0 ; % bottom of stem
+ draw_telco(5,6)("t") ;
+ x7 = x5 ; y7 = good.y o = y8 ; x8 = x3 + 0.05em ; % N.B. praps bot y7 = bot y8 = 0
+ draw_bar(7,8)("r") ;
+ endchar ;
+
+beginchar("m",1.65parma_width#,ex#,0); "The tengwa malta";
+ pickup main_nib ;
+ draw_umbar_luva(1,2,3,4,9,10,11,12) ;
+ x5 = x1 ; top y5 = ex ; % top of stem
+ x6 = x5 ; y6 = 0 ; % bottom of stem
+ draw_telco(5,6)("t") ;
+ x7 = x5 ; y7 = good.y o = y8 ; x8 = x11 + 0.05em ;
+ draw_bar(7,8)("r") ;
+ endchar ;
+
+
+beginchar("y",tinco_width#,ex#,0); "The tengwa anna";
+ pickup main_nib ;
+ draw_calma_luva(1,2,3,4) ;
+ x5 = x1 ; top y5 = ex ; % top of stem
+ x6 = x5 ; y6 = 0 ; % bottom of stem
+ draw_telco(5,6)("tb") ;
+ endchar ;
+
+beginchar("Y",1.65tinco_width#,ex#,0); "The tengwa noldo";
+ pickup main_nib ;
+ draw_anga_luva(1,2,3,4,7,8,9,10) ;
+ x5 = x1 ; top y5 = ex ; % top of stem
+ x6 = x5 ; y6 = 0 ; % bottom of stem
+ draw_telco(5,6)("tb") ;
+ endchar ;
+
+beginchar("W",parma_width#,ex#,0); "The tengwa vilya";
+ pickup main_nib ;
+ draw_quesse_luva(1,2,3,4) ;
+ x5 = x1 ; top y5 = ex ; % top of stem
+ x6 = x5 ; y6 = 0 ; % bottom of stem
+ draw_telco(5,6)("b") ;
+ x7 = x5 ; top y7 = ex = top y8 ; x8 = x3 - 0.05em ; % N.B. praps top y7 = top y8 = 0
+ draw_bar(8,7)("l");
+ endchar ;
+
+beginchar("N",1.65parma_width#,ex#,0); "The tengwa nwalme";
+ pickup main_nib ;
+ draw_ungwe_luva(1,2,3,4,9,10,11,12) ;
+ x5 = x1 ; top y5 = ex ; % top of stem
+ x6 = x5 ; y6 = 0 ; % bottom of stem
+ draw_telco(5,6)("b") ;
+ x7 = x5 ; top y7 = ex = top y8 ; x8 = x11 - 0.05em ;
+ draw_bar(8,7)("l");
+ endchar ;
diff --git a/fonts/elvish/tengsecs.mf b/fonts/elvish/tengsecs.mf
new file mode 100644
index 0000000000..40256ffa5b
--- /dev/null
+++ b/fonts/elvish/tengsecs.mf
@@ -0,0 +1,311 @@
+
+beginchar("l",0.8em#,ex#,desc#) ; "The tengwa lambe" ;
+ pickup main_nib ;
+ x1 = straight_sidebar ; x2 = w - x1 ;
+ top y1 = top y2 = round ex ;
+ z1' = z1 - ( 0.04em * dir penangle) ;
+ z2' = z2 + ( 0.04em * dir penangle) ;
+ draw z1'{dir penangle} .. {dir penangle}z2' ;
+ y3 = y1 ; x3 = 0.6[x1,x2] ; % top of bowl
+ lft x4 = 2curve_sidebar ; y4 = 0.2ex ; % side of bowl
+ bot y5 = -0.5 desc ; x5 = .4w ; % bottom of bowl
+ x6 = w - x4 ; y6 = 0.2ex; % right side of bowl
+ z7 = z6 + (0.05em *(left rotated -10)) ;
+ draw z3{dir (penangle+180)} ..
+ {down}z4 .. z5{right}
+ .. z6 .. {dir -penangle} z7 ;
+ labels(1,2,3,4,5,6) ;
+endchar ;
+
+beginchar("I",0.8tinco_width#,ex#,0) ; "The tengwa yanta" ;
+ pickup main_nib ;
+ y1 = 0 ; x1 = straight_sidebar ; % bottom of left arm ;
+ y2 = 0 ; x2 = w - x1 ; % bottom of right arm
+ x3 = 0.5[x1,x2] ; y3 = 0.8ex ; % junction point
+ top y4 = round(ex) ; z4 - z2 = whatever*(z3 - z2) ; % top of arm
+ draw z4 .. z2 ;
+ draw z3 .. z1 ;
+ z4' = z4 + 0.05em * dir(penangle+180) ;
+ z2' = z2 + 0.05em * dir(penangle) ;
+ z1' = z1 + 0.05em * dir(penangle+90) ;
+ draw z4'{dir penangle} .. {z2-z4}z4 ;
+ draw z2'{dir (penangle+180)} .. {z4-z2}z2 ;
+ draw z1'{dir(penangle-90)} .. {z3-z1}z1 ;
+endchar ;
+
+beginchar("U",0.9tinco_width#,ex#,0) ; "The tengwa ure" ;
+ pickup main_nib ;
+ top y1 = round(ex+o) ; x1 = 0.5w ;
+ bot y3 = round(-o) ; x3 = x1 ;
+ rt x2 = w - curve_sidebar = w - lft x4 ;
+ y2 = y4 = 0.5h ;
+ draw z1 .. z2 .. z3 .. z4 .. cycle ;
+endchar ;
+
+
+beginchar("s",0.9*tinco_width#,asc#,0) ; "The tengwa silme" ;
+ pickup main_nib ;
+ lft x4 = curve_sidebar ; y4 = 0.7ex ; % left side of bow
+ bot y3 = round(-o) ; x3 = good.x 0.5w ; % bottom
+ x2 = w - x4 ; y2 = 0.5ex ; % right side of bow
+ x1 = good.x 0.7w ; y1 = 0.8ex ; % end of bow
+ z1' = z1 + 0.03em*dir(170) ; % serif
+ x5 = 0.55w ; y5 = 0.95asc ; % top end of letter
+ z6 = z5 + 0.05em*(dir(penangle+80)) ; % for serif
+ draw z1'{dir penangle} .. z1 .. z2 .. z3 .. z4{up} .. tension 0.9 and 1.2 .. z5 .. z6 ;
+ labels(1,1',2,3,4,5,6) ;
+endchar ;
+
+beginchar("S",0.9*tinco_width#,ex#,desc#); "The tengwa silme nuquerna";
+ pickup main_nib ;
+ lft x2 = curve_sidebar ; y2 = 0.6 ex ; % left
+ top y3 = round(ex+o) ; x3 = 0.55w ; % top
+ rt x4 = w - curve_sidebar ; y4 = 0.4 ex ;
+ x1 = x2 + 0.2w ; y1 = 0.25 ex ; % curly end
+ x5 = x2 ; y5 = -0.9desc ;
+ draw z1{dir(penangle+180)} .. z2{up} .. z3{right} ..
+ z4{down} .. tension 1.2 .. z5 ;
+ labels(1,2,3,4,5) ;
+endchar ;
+
+beginchar("r", romen_width#, ex#, desc#); "The tengwa romen";
+ pickup main_nib ;
+ x1 = straight_sidebar ; top y1 = round(0.95ex) ; % top of left arm
+ bot y2 = 0.0ex ; % join at bottom
+ rt x3 = w - curve_sidebar ; y3 = 0.75ex ;% 'top' of right stem ;
+ % want vectors z3-z2 and z1-z2 to be mirror images in direction
+ numeric temp ;
+ y3 - y2 = temp*(y1 - y2) ;
+ x3 - x2 = 1.1temp*(x2 - x1) ; % not quite mirror !
+ draw z1 -- z2 ; % left arm (without serif)
+ z1' = z1 + 0.05em*dir(penangle+135) ;
+ draw z1'{dir penangle} .. {z2-z1}z1 ; % serif
+ top y4 = round(ex - 0.2penwidth*sind penangle) ; x4 = 1/3[x2,x3] ; % end of right arm
+ bot y5 = round(-0.9desc) ; x5 = 0[x2,x3] ; % bottom of tail
+ y6 = -0.2desc ; x6 = 1/2[x5,x3] ; % end of tail
+ path p ;
+ p = z4{dir penangle} .. z3 .. tension 1 .. z2 % {dir (penangle+180)}
+ .. tension 3/4 .. z5{right} .. {dir (penangle+180)}z6 ;
+ draw p ;
+ draw z1'{dir penangle} .. {z2-z1}z1 .. z2 ;
+ labels(1,2,3,4,5,6);
+ endchar ;
+
+beginchar("&", romen_width#, ex#, desc#); "The tengwa arda";
+ pickup main_nib ;
+ x1 = straight_sidebar ; top y1 = round(0.95ex) ; % top of left arm
+ bot y2 = 0.0ex ; % join at bottom
+ rt x3 = w - curve_sidebar ; y3 = 0.75ex ;% 'top' of right stem ;
+ % want vectors z3-z2 and z1-z2 to be mirror images in direction
+ numeric temp ;
+ y3 - y2 = temp*(y1 - y2) ;
+ x3 - x2 = 1.1temp*(x2 - x1) ; % not quite mirror !
+ draw z1 -- z2 ; % left arm (without serif)
+ z1' = z1 + 0.05em*dir(penangle+135) ;
+ draw z1'{dir penangle} .. {z2-z1}z1 ; % serif
+ top y4 = round(ex - 0.2penwidth*sind penangle) ; x4 = 1/3[x2,x3] ; % end of right arm
+ bot y5 = round(-0.9desc) ; x5 = 0[x2,x3] ; % bottom of tail
+ y6 = -0.2desc ; x6 = 1/2[x5,x3] ; % end of tail
+ path p ;
+ p = z4{dir penangle} .. z3 .. tension 1 .. z2 % {dir (penangle+180)}
+ .. tension 3/4 .. z5{right} .. {dir (penangle+180)}z6 ;
+ draw p ;
+ draw z1'{dir penangle} .. {z2-z1}z1 .. z2 ;
+ z10 = 0.25[z2,z1] ;
+ z11 = z10 + 0.2em*dir(penangle+180) ;
+ z12 = z11 + 0.08em*dir(penangle-90) ;
+ draw z10 .. tension 1.5 .. z11 .. tension 1.5 .. z12 ;
+ labels(1,2,3,4,5,6,10,11,12);
+ endchar ;
+
+beginchar("z",0.85tinco_width#,asc#,desc#) ; "The tengwa esse" ;
+ pickup main_nib ;
+ % top bow first - make a path for later use
+ x1 = 0.55w ; y1 = 0.95asc ; % top
+ z1' = z1 + 0.05em*dir(penangle+80) ; % serif
+ lft x2 = curve_sidebar ; y2 = 0.5h ; % left side of top bow ;
+ x3 = 0.5w ; y3 = good.y 0.2h ; % bottom of top bow
+ x4 = 0.7w ; y4 = 0.5h ; % end of bow
+ z4' = z4 + 0.03em*dir(170) ; % serif
+ path p ;
+ p = z4'{dir penangle} .. z4 .. z3{left} .. z2{up} ..
+ tension 0.9 and 1.2 .. z1 .. z1' ;
+ draw p ;
+ x5' = x1 ; y5'-y7 = y1-y3 ; % top of bottom bow
+ x6 = x2 ; y6 - y7 = y2 - y3 ; % side
+ x7 = x3 ; bot y7 = round(-0.9desc) ; % bottom
+ z8 - z7 = z4 - z3 ; % end
+ z8' - z8 = z4' - z4 ;
+ path pa ;
+ pa = z8'{dir penangle} .. z8 .. z7{left} .. z6{up} ..
+ tension 0.9 and 1.2 .. z5' ;
+ (t1,t2) = p intersectiontimes pa ;
+ draw subpath(0,t2) of pa ;
+ labels(1,2,3,4,5,6,7,8) ;
+endchar ;
+
+beginchar("Z",0.8tinco_width#,ex#,desc#) ; "The tengwa esse nuquerna" ;
+ pickup main_nib ;
+ y1 = 0.5h ; x1 = 0.3w ; % end of top bow
+ z1' = z1 + 0.03em*dir(-10) ; % and serif
+ % ignore z2 (left side) for the moment
+ top y3 = round(ex+o) ; x3 = 0.5w ; % top
+ rt x4 = 0.9w - curve_sidebar ; y4 = 0.65h ; % right
+ y5 = -0.1desc ; lft x5 = curve_sidebar ; %end
+ path p ;
+ p = z1'{dir(penangle+180)} .. z3{right} .. z4{down} ..
+ tension 0.9 and 1.2 .. z5 ;
+ draw p ;
+ z6 = ( (0.5w,-desc) .. (0.5w,0.5ex) ) intersectionpoint p ;
+ x7 = x4 ; y7 = -0.3desc ;
+ x8 = x5 ; y8 = -0.9desc ;
+ draw z6{dir penangle} .. z7{down} .. tension 0.9 and 2 .. z8 ;
+ labels(1,2,3,4,5,6,7,8) ;
+endchar ;
+
+beginchar("h",0.8tinco_width#,asc#,0) ; "The tengwa hyarmen" ;
+ pickup main_nib ;
+ bot y1 = 0 ; x1 = straight_sidebar ; % bottom of left arm
+ y2 = 0 ; x2 = w - x1 ; % bottom of right arm
+ x3 = 0.6[x1,x2] ; y3 = 0.9ex ; % junction point
+ top y4 = round (0.9asc) ; z4 - z2 = whatever*(z3-z2) ; % top of arm
+ z4' = z4 + 0.08em*dir(penangle+160);
+ z4'' = z4 + 0.08em*(dir(angle(z2-z4))) ;
+ draw z4'{dir penangle} .. z4'' --- z2 ;
+ draw z3 .. z1 ;
+ z1' = z1 + 0.05em*dir(penangle+180) ;
+ z2' = z2 + 0.05em*dir(penangle) ;
+ draw z2'{dir(penangle+180)} .. {z4-z2}z2 ;
+ draw z1'{dir(penangle-90)} .. {z3-z1}z1 ;
+ labels(1,2,3,4) ;
+endchar ;
+
+beginchar("H",tinco_width#,asc#,0) ; "The tengwa hwesta sindarinwa" ;
+ pickup main_nib ;
+ top y1 = asc ; x1 = good.x (w - 0.2em) ;
+ bot y2 = 0 ; x2 = x1 ;
+ draw_telco(1,2,"t") ;
+ x3 = x7 = x1 ; y3 = .75ex ; y7 = 0.1ex ;
+ top y4 = round(ex+o) ;
+ bot y6 = round(-o) ;
+ x4 = 0.5w ;
+ x6 = 0.4w ;
+ y5 = 0.5ex ; x5 = curve_sidebar ;
+ draw z3 .. z4{left} .. z5{down} .. z6{right} .. z7 ;
+ z2' = z2 + 0.05em*dir(penangle) ;
+ z2'' = z2 + 0.2em*right ;
+ z2''' = z2 - 0.05em*dir(penangle+180) ;
+ draw z2{dir penangle} .. z2' .. z2'' .. z2'''{dir penangle} ;
+ labels(1,2,3,4,5,6,2'') ;
+endchar ;
+
+beginchar("@",0.3em#,ex#,0) ; "The short carrier" ;
+ pickup main_nib ;
+ top y1 = round(ex) ; y2 = 0 ;
+ x1 = x2 = good.x 0.5w ;
+ draw_telco(1,2,"tb") ;
+endchar ;
+
+beginchar("*",0.3em#,ex#,desc#) ; "The long carrier" ;
+ pickup main_nib ;
+ top y1 = round(ex) ; y2 = -0.6desc ;
+ x1 = x2 = good.x 0.5w ;
+ draw_telco(1,2,"t") ;
+ z3 = z2 + 0.2em*dir(penangle-150) ;
+ draw z2{z2-z1} .. z3{dir(penangle+180)} ;
+endchar ;
+
+beginchar("A",0.75tinco_width#,ex#,0) ; "The tengwa A" ;
+ pickup main_nib ;
+ top y1 = round(ex+o) ; x1 = 0.6w ;
+ y3 = 0 ; x3 = x1 ;
+ lft x2 = curve_sidebar ; y2 = 0.55h ;
+ x4 = w - straight_sidebar ; x6 = x4+0.05em ;
+ y4 = 0.75h ; y6 = 0.35h ;
+ z4' = z4 + 0.03em*dir(180+penangle) ;
+ draw z4'{dir penangle} .. z4 .. z1{left} .. z2{down} .. z3{right} .. z6 ;
+endchar ;
+
+beginchar("|",0.3em#,asc#,0); "The tengwa halla" ;
+ pickup main_nib ;
+ x1 = x2 = good.x 0.5w ;
+ top y1 = asc ;
+ y2 = 0 ;
+ draw_telco(1,2)("tb") ;
+ endchar ;
+
+beginchar("L",0.8em#,ex#,desc#) ; "The tengwa alda" ;
+ pickup main_nib ;
+ x1 = straight_sidebar = w - x2 ;
+ top y1 = top y2 = round ex ;
+ z1' = z1 - ( 0.04em * dir penangle) ;
+ z2' = z2 + ( 0.04em * dir penangle) ;
+ draw z1'{dir penangle} .. {dir penangle}z2' ;
+ x3 = 0.4[x1,x2] ; % top of bowl
+ y3 = 0.95ex ;
+ lft x4 = straight_sidebar ; y4 = 0.5ex ; % first bend
+ rt x5 = w - straight_sidebar ; y5 = -0.15ex ; % second bend
+ x6 = 0.65w ; bot y6 = -0.7desc ; % bottom of bowl
+ x7 = 0.3w ; y7 = -0.2 ex ; % end
+ draw z3{curl 0} .. tension 2 .. z4{down} .. z5{down} .. z6{left} ..
+ z7{dir penangle} ;
+endchar ;
+beginchar("$", romen_width#, asc#, 0) ; "Inverted romen - wh" ;
+ pickup main_nib ;
+ x1 = w - straight_sidebar ; bot y1 = round(0.05ex) ;
+ top y2 = 1.0ex ;
+ lft x3 = curve_sidebar ; y3 = 0.25ex ;
+ numeric temp ;
+ y3 - y2 = temp*(y1 - y2) ;
+ x3 - x2 = 1.1temp*(x2 - x1) ;
+ draw z1 -- z2 ;
+ z1' = z1 + 0.05em*dir(penangle-45) ;
+ draw z1'{dir(penangle+180)} .. {z2-z1}z1 ;
+ bot y4 = round(0.2penwidth*sind penangle) ; x4 = 1/3[x2,x3] ;
+ top y5 = round(ex+0.9desc) ; x5 = 0[x2,x3] ;
+ y6 = ex + 0.2desc ; x6 = 1/2[x5,x3] ;
+ draw z4{dir(penangle+180)} .. z3 .. z2
+ .. tension 3/4 .. z5{left} .. {dir penangle}z6 ;
+ draw z1'{dir penangle} .. {z2 - z1}z1 .. z2 ;
+ labels(1,2,3,4,5,6) ;
+endchar ;
+
+beginchar("#",0.7em#,ex#,desc#) ; "Inverted lambe - w" ;
+ pickup main_nib ;
+ x1 = straight_sidebar = w - x2 ;
+ bot y1 = bot y2 = -0.5desc ;
+ z1' = z1 - 0.04em*dir(penangle) ;
+ z2' = z2 + 0.04em*dir(penangle) ;
+ draw z1'{dir penangle} .. {dir penangle}z2' ;
+ y3 = y1 ; x3 = 0.2[x1,x2] ;
+ rt x4 = w - curve_sidebar ; y4 = 0.8ex - 0.5desc;
+ top y5 = round(ex) ; x5 = 0.6w ;
+ x6 = w - x4 ; y6 = y4 ;
+ z7 = z6 + 0.05em*(left rotated 170) ;
+ draw z3{dir penangle} .. {up}z4 .. z5{left}
+ .. z6 .. {dir(180-penangle)}z7 ;
+ labels(1,2,3,4,5,6,7) ;
+endchar ;
+
+beginchar("%",0.8tinco_width#,ex#,0) ; "The tengwa for u in up" ;
+ pickup main_nib ;
+ top y1 = ex ; rt x1 = w - straight_sidebar ;
+ y2 = 0 ; x2 = x1 ;
+ draw_telco(1,2)("tb") ;
+ y3 = y1 ; x3 = w - x1 ;
+ x4 = x3 ; y4 = 0.3h ;
+ draw_telco(3,4)("t") ;
+ y5 = 0 ; x5 = 0.45w ;
+ x6 = x1 ; y6 = 0.3ex ;
+ draw z4{z4-z3} .. z5 .. z6{dir penangle} ;
+ labels(5,6) ;
+endchar ;
+
+beginchar(9,0.55em#,ex#,0) ; "The schwa tengwa (Pictures plate 48)" ;
+ pickup main_nib ;
+ lft x1 = lft x2 = straight_sidebar ;
+ top y1 = ex ; y2 = 0 ;
+ draw_telco(1,2)("tb") ;
+ y3 = y1 ; rt x3 = w ; %- curve_sidebar ;
+ draw_bar(1,3)("r") ;
+endchar ;
diff --git a/fonts/elvish/tengteht.mf b/fonts/elvish/tengteht.mf
new file mode 100644
index 0000000000..5984c01f3d
--- /dev/null
+++ b/fonts/elvish/tengteht.mf
@@ -0,0 +1,195 @@
+
+beginchar("a",0.3em#,1.5ex#,0) ; "The tehta a" ;
+ pickup tehta_nib ;
+ bot y1 = bot y2 = round(1.35ex) ; lft x1 = 0 = w - rt x2 ;
+ y3 - y1 = round(0.45sqrt(3) * (x2 - x1)) ;
+ x3 = 0.5[x1,x2] ;
+ draw_dot(1) ; draw_dot(2) ; draw_dot(3) ;
+endchar ;
+
+beginchar("O",0.3em#,1.5ex#,0) ; "Inverted a tehta" ;
+ pickup tehta_nib ;
+ bot y3 = round(1.35ex) ; lft x1 = 0 = w - rt x2 ;
+ y1 - y3 = y2 - y3 = round(0.45sqrt(3) * (x2 - x1)) ;
+ x3 = 0.5[x1,x2] ;
+ draw_dot(1) ; draw_dot(2) ; draw_dot(3) ;
+endchar ;
+
+beginchar(25,0.35em#,0,0.5desc#) ; "The dots for y" ; % 25 = ^^Y
+ pickup tehta_nib ;
+ y1 = y2 = -0.3ex ; lft x1 = 0 = w - rt x2 ;
+ draw_dot(1) ; draw_dot(2) ;
+endchar ;
+
+beginchar(26,0.35em#,0,desc#) ; "Low dots for y" ; % 26 = ^^Z
+ pickup tehta_nib ;
+ y1 = y2 = round -0.65ex ; lft x1 = 0 = w - rt x2 ;
+ draw_dot(1) ; draw_dot(2) ;
+endchar ;
+
+beginchar("i",0.1em#,1.4ex#,0) ; "The tehta i" ;
+ pickup tehta_nib ;
+ bot y1 = round(1.35ex) ;
+ x1 = good.x (0.5w) ;
+ draw_dot(1) ;
+endchar ;
+
+beginchar(5,0.1em#,0,0.5desc#) ; "The schwa tehta" ;
+ pickup tehta_nib ;
+ y1 = round(-0.3ex) ;
+ x1 = good.x (0.5w) ;
+ draw_dot(1) ;
+endchar ;
+
+beginchar("e",0.4em#,1.5ex#,0) ; "The tehta e" ;
+ pickup tehta_nib ;
+ y1 = round(1.3ex) ;
+ y2 = (y1 + 0.3ex) ;
+ lft x1 = 0 ; rt x2 = w ;
+ z2' = z2 + 0.05em*dir(penangle+90) ;
+ draw z1 .. tension 10 .. z2 .. {dir(penangle+90)}z2' ;
+endchar ;
+
+%beginchar("o",0.5em#,1.6ex#,0) ; "The tehta o" ;
+% pickup tehta_nib ;
+% y1 = round(1.3ex) ; lft x1 = 0 ;
+% y2 = y1 + 0.3ex ; x2 = 0.7w ;
+% rt x3 = w ; y3 = 0.7[y1,y2] ;
+% x4 = x2 ; y4 = 0.3[y1,y2] ;
+% draw z1 .. tension 4 and 2 .. z2 .. z3{down} .. z4 ;
+%endchar ;
+
+beginchar("o",0.45em#,1.76ex#,0) ; "The tehta o" ;
+ pickup tehta_nib ;
+ y1 = round(1.3ex) ; lft x1 = 0 ;
+ y2 = y1 + 0.4ex ; x2 = 0.7w ;
+ rt x3 = w ; y3 = 0.7[y1,y2] ;
+ x4 = x2 ; y4 = 0.3[y1,y2] ;
+ draw z1 .. tension 4 and 2 .. z2 .. z3{down} .. z4 ;
+endchar ;
+
+beginchar("u",0.5em#,1.9ex#,0) ; "The tehta u" ;
+ pickup tehta_nib ;
+ y1 = round(1.3ex) ; x1 = 0.4w ;
+ rt x2 = w ; y2 = y1 + 0.5ex ;
+ y3 = 1.0[y1,y2] ;
+ x3 = 0.3[x1,x2] ;
+ draw z1 .. tension 4 and 1.5 .. z2 .. {dir (penangle-90)}z3 ;
+endchar ;
+
+beginchar(",",0.2em#,ex#,0) ; "The point ," ;
+ pickup main_nib ;
+ x1 = good.x 0.5w ; y1 = good.y 0.6h ;
+ draw_dot(1) ;
+endchar ;
+
+beginchar(";",0.2em#,ex#,0) ; "The point ;" ;
+ pickup main_nib ;
+ x1 = x2 = good.x 0.5w ; y1 = good.y 0.2h ; y2 = good.y 0.8h ;
+ draw_dot(1) ; draw_dot(2) ;
+endchar ;
+
+beginchar(".",0.5em#,ex#,0) ; "The point ." ;
+ pickup main_nib ;
+ y1 = y3 = good.y 0.2h ; y2 = y4 = 0.8h ;
+ x1 = x2 = w - x3 = w - x4 ; x3 - x1 = y2 - y1 ;
+ forsuffixes s=1,2,3,4: draw_dot(s) ; endfor ;
+endchar ;
+
+beginchar(ditto,0.35em#,1.4ex#,0) ; "The tehta two-dots-above" ;
+ pickup tehta_nib ;
+ y1 = y2 = round(1.35ex) ;
+ lft x1 = 0 = w - rt x2 ;
+ draw_dot(1) ; draw_dot(2) ;
+endchar;
+
+beginchar(2,tinco_width#,0,0.5desc#) ; "The under-bar tehta" ;
+ pickup tehta_nib ;
+ y1 = y2 = round(-0.3ex) ;
+ lft x1 = straight_sidebar = w - rt x2 ;
+ draw_bar(1,2)("rl") ;
+endchar ;
+
+beginchar(3,tinco_width#,0,desc#) ; "Low under-bar" ;
+ pickup tehta_nib ;
+ y1 = y2 = round(-0.65ex) ;
+ lft x1 = straight_sidebar = w - rt x2 ;
+ draw_bar(1,2)("rl") ;
+endchar ;
+
+beginchar(14,tinco_width#,1.5ex#,0) ; "The over-bar tehta" ;
+ pickup tehta_nib ;
+ y1 = y2 = round(1.2ex) ;
+ lft x1 = straight_sidebar = w - rt x2 ;
+ draw_bar(1,2)("rl") ;
+endchar ;
+
+beginchar(15,tinco_width#,1.6ex#,0) ; "The tilde over" ;
+ pickup tehta_nib ;
+ y1 = y2 = 1.35ex ;
+ lft x1 = straight_sidebar = w - rt x2 ;
+ z1' = z1 - ( 0.04em * dir penangle) ;
+ z2' = z2 + ( 0.04em * dir penangle) ;
+ draw z1'{dir penangle} .. z1 .. z2 .. {dir penangle}z2' ;
+endchar ;
+
+beginchar(21,0.5em#,1.7ex#,0) ; "Variant u tehta" ;
+ pickup tehta_nib ;
+ y1 = round(1.3ex) ; lft x1 = 0 ;
+ y2 = y1 + 0.3ex ; x2 = 0.7w ;
+ rt x3 = w ; y3 = 1.5[y1,y2] ;
+ x4 = x2 ; y4 = 1.6[y1,y2] ;
+ draw z1 .. tension 4 and 2 .. z2 .. z3{up} .. z4 ;
+endchar ;
+
+beginchar(22,0.5em#,1.7ex#,0) ; "Beleriand u tehta" ;
+ pickup tehta_nib ;
+ y1 = 1.2ex ; y3 = 1.7ex ;
+ x3 = 0.2w = w - x1 ;
+ y2 = good.y(0.5[y1,y3]) ; x2 = 0.5[x1,x3] ;
+ z1' = z1 + 0.05em*dir(penangle) ;
+ z3' = z3 + 0.05em*dir(penangle+180) ;
+ draw z1 .. z1' .. z2 .. z3' .. z3 ;
+endchar ;
+
+beginchar(19,0.35em#,ex#,0) ; "Raised S hook" ;
+ pickup tehta_nib ;
+ x1 = -0.05em ; top y1 = ex ;
+ rt x2 = w - curve_sidebar ; y2 = y1 - 0.5ex ;
+ x3 = 0.5[x1,x2] ; y3 = 1.1[y1,y2] ;
+ draw z1 .. tension 4 and 2 .. z2{down} .. z3 ;
+endchar ;
+
+beginchar(20,0.35em#,0,desc#) ; "Lowered S hook" ;
+ pickup tehta_nib ;
+ x1 = -0.08em ; y1 = 0 ;
+ rt x2 = w - curve_sidebar ; y2 = y1 - 0.5ex ;
+ x3 = 0.5[x1,x2] ; y3 = 1.1[y1,y2] ;
+ draw z1 .. tension 4 and 2 .. z2{down} .. z3 ;
+endchar ;
+
+beginchar("!",0.5em#,asc#,0) ; "Exclamation mark" ;
+ pickup main_nib ;
+ x1 = x2 = good.x 0.5w ;
+ y1 = 0.8asc ; y2 = 0.2ex ;
+ z1' = z1 + 0.08em*dir(penangle) ;
+ z2' = z2 - 0.08em*dir(penangle) ;
+ draw z1' .. z1 .. tension 4 .. z2 .. z2' ;
+endchar ;
+
+beginchar("?",0.5em#,asc#,0) ; "Question mark" ;
+ pickup main_nib ;
+ lft x1 = round(0.1em) ; top y1 = round(0.9asc) ;
+ x2 = x1 ; y2 = 0.2ex ;
+ draw_telco(1,2)("t") ;
+ z2' = z2 + 0.2em*dir(penangle-150) ;
+ draw z2{z2-z1} .. z2'{dir(penangle+180)} ;
+ x3 = x4 = x5 = x1 ;
+ y5 = 0.0[y2,y1] ; y4 = 0.4[y2,y1] ; y3 = 0.75[y2,y1] ;
+ x6 = good.x(w-0.1em) ; x7 = good.x(w-0.08em) ;
+ y6 = 0.8[y2,y1] ; y7 = 0.47[y2,y1] ;
+ draw z3{dir penangle} ... z6{down} ... z4{dir(penangle+185)} ;
+ draw z4{dir penangle} ... z7{down} ... z5{dir(penangle+185)} ;
+ labels(1,2,3,4,5,6,7) ;
+endchar ;
+