###### Mathematical symbols

### Letter-like
symbol-block 'Letter-like Mathematical Symbols'
	sketch # micro
		include glyphs.mu AS_BASE
		if SLAB : if (!para.isItalic) : begin
			include : CenterBottomSerif (SB + HALFSTROKE * HVCONTRAST) DESCENDER JUT
			tag-contour 'serifLB'
		save 'micro' 0xB5
	
	sketch # forall
		include : LambdaShape OPERATORSTROKE
		eject-contour 'serif'
		include : HBar (SB + OPERATORSTROKE) (RIGHTSB - OPERATORSTROKE) (XH / 2) OPERATORSTROKE
		include : FlipAround MIDDLE (CAP / 2)
	
		save 'forall' 0x2200
	
	sketch # exists
		include : HBarTop (SB * 1.5 - O) RIGHTSB CAP OPERATORSTROKE
		include : HBarBottom (SB * 1.5 - O) RIGHTSB 0 OPERATORSTROKE
		include : HBar (SB * 1.5 - O) (RIGHTSB - HALFSTROKE) (CAP * 0.5) OPERATORSTROKE
		include : VBarLeft (SB * 1.5) 0 CAP OPERATORSTROKE
		include : FlipAround MIDDLE (CAP / 2)
	
		save 'exists' 0x2203
	
	sketch # emptyset
		include : OShape CAP 0 SB RIGHTSB OPERATORSTROKE
		
		local fine : OPERATORSTROKE / 2
		include : dispiro
			widths.center OPERATORSTROKE
			flat (SB + O + fine) [mix CAP 0 1.05]
			curl (RIGHTSB - O - fine) [mix 0 CAP 1.05]
	
		save 'emptyset' 0x2205
	
	sketch # increment
		include : LambdaShape OPERATORSTROKE
		eject-contour 'serif'
		include : HBarBottom (SB + (OPERATORSTROKE / 2)) (RIGHTSB - (OPERATORSTROKE / 2)) 0 OPERATORSTROKE
	
		save 'increment' 0x2206
	turned 'nabla' 0x2207 'increment' MIDDLE (CAP / 2)

	if [not recursive] : let [s : (RIGHTSB - SB - O * 4) / CAP] : let [df : Miniature (glyphs -- {'eight' 'rotetedpropto'}) (crowd -- 4)(scale -- s) (slantAngle -- 0)] : begin
		sketch # infty
			include df.eight
			apply-transform : Translate (-MIDDLE) (-CAP / 2)
			apply-transform : Rotate (Math.PI / 2)
			apply-transform : Scale s
			apply-transform : Translate MIDDLE parenMid
			apply-transform : Italify
		
			save 'infty' 0x221E
		
		sketch # propto
			include df.rotetedpropto
			apply-transform : Translate (-MIDDLE) (-CAP / 2)
			apply-transform : Rotate (Math.PI / 2)
			apply-transform : Scale s
			apply-transform : Translate MIDDLE parenMid
			apply-transform : Italify
			save 'propto' 0x221D
	
	sketch # partial
		include bMarks
		include : OShape (CAP * 0.65) 0 SB RIGHTSB OPERATORSTROKE
		include : dispiro
			widths.lhs OPERATORSTROKE
			flat (RIGHTSB - OX) SMALLSMOOTHA
			curl (RIGHTSB - OX) (CAP - SMALLSMOOTHB)
			hookend CAPO
			g4   SB (CAP - HOOK)
		save 'partial' 0x2202

symbol-block 'Mathematical Operators'
	sketch # plus
		set-width WIDTH
		
		include : HBar SB RIGHTSB parenMid OPERATORSTROKE
		include : VBar MIDDLE (parenMid - (RIGHTSB - SB) * 0.55) (parenMid + (RIGHTSB - SB) * 0.55) OPERATORSTROKE
		save 'plus' '+'
	
	sketch # minus
		set-width WIDTH
		
		include : HBar SB RIGHTSB parenMid OPERATORSTROKE
	
		save 'minus' 0x2212
	
	sketch # plusminus
		set-width WIDTH
		include : HBarBottom SB RIGHTSB 0 OPERATORSTROKE
		include glyphs.plus
		save 'plusminus' 0xB1
	turned 'minusplus' 0x2213 'plusminus' MIDDLE parenMid
	local equalHalfSpace : (parenTop - parenBot) * 0.11
	
	sketch # equal
		set-width WIDTH
		
		include : HBar SB RIGHTSB (parenMid + equalHalfSpace) OPERATORSTROKE
		include : HBar SB RIGHTSB (parenMid - equalHalfSpace) OPERATORSTROKE
	
		save 'equal' '='
	
	sketch # less
		set-width WIDTH
		
		local top : mix parenMid parenTop 0.5
		local bot : mix parenMid parenBot 0.5
		local exp : Math.sqrt : 1 + (top - bot) / (2 * (RIGHTSB - SB)) * (top - bot) / (2 * (RIGHTSB - SB))
		
		include : dispiro
			widths.center OPERATORSTROKE
			flat RIGHTSB top
			curl SB [mix top bot 0.5] [widths.heading (OPERATORSTROKE / 2 * exp) (OPERATORSTROKE / 2 * exp) LEFTWARD]
		
		include : dispiro
			widths.center OPERATORSTROKE
			flat RIGHTSB bot
			curl SB [mix top bot 0.5] [widths.heading (OPERATORSTROKE / 2 * exp) (OPERATORSTROKE / 2 * exp) LEFTWARD]
	
	
		save 'less' '<'
	
	sketch # greater
		set-width WIDTH
		
		local top : mix 0 CAP 0.75
		local bot : mix 0 CAP 0.1
		
		include glyphs.less
		include : FlipAround MIDDLE parenMid
		save 'greater' '>'

	sketch # multiply
		local radius : (RIGHTSB - SB) / 2
		include : dispiro
			widths.center OPERATORSTROKE
			flat (MIDDLE - radius) (parenMid - radius)
			curl (MIDDLE + radius) (parenMid + radius)
		
		include : dispiro
			widths.center OPERATORSTROKE
			flat (MIDDLE + radius) (parenMid - radius)
			curl (MIDDLE - radius) (parenMid + radius)
	
		save 'multiply' 0xD7
	
	sketch # divide
		include glyphs.minus
		local radius : (RIGHTSB - SB) / 2
		include : Ring (parenMid + radius + DOTRADIUS) (parenMid + radius - DOTRADIUS) (MIDDLE - DOTRADIUS + O) (MIDDLE + DOTRADIUS - O) true
		include : Ring (parenMid - radius + DOTRADIUS) (parenMid - radius - DOTRADIUS) (MIDDLE - DOTRADIUS + O) (MIDDLE + DOTRADIUS - O) true
	
		save 'divide' 0xF7
	
	sketch # negate
		include glyphs.minus
		include : VBarRight RIGHTSB (parenMid - (RIGHTSB - SB) * 0.55) parenMid OPERATORSTROKE
		
		save 'negate' 0xAC
	
	sketch # vee
		
		include : dispiro
			widths.center OPERATORSTROKE
			flat SB operTop
			curl MIDDLE operBot [heading DOWNWARD]
		
		include : dispiro
			widths.center OPERATORSTROKE
			flat RIGHTSB operTop
			curl MIDDLE operBot [heading DOWNWARD]
		save 'vee' 0x2228
	turned 'wedge' 0x2227 'vee' MIDDLE parenMid

	sketch # cup
		include : UShape operTop operBot OPERATORSTROKE true
		save 'cup' 0x222A
	turned 'cap' 0x2229 'cup' MIDDLE parenMid
	
	sketch # lesseq
		local fine : Math.max [adviceBlackness 4] (XH * 0.1)
		local top : [mix parenMid parenTop 0.5] - fine
		local bot : [mix parenMid parenBot 0.5] + fine
		
		include : dispiro
			widths.center OPERATORSTROKE
			flat RIGHTSB (top + fine)
			curl SB ([mix top bot 0.5] + fine) [heading LEFTWARD]
		include : dispiro
			widths.center OPERATORSTROKE
			flat SB ([mix top bot 0.5] + fine) [heading  RIGHTWARD]
			curl RIGHTSB (bot + fine)
		
		branch
			include : HBar SB RIGHTSB (bot - fine) OPERATORSTROKE
			save 'lesseq' 0x2264
		branch
			include : dispiro
				widths.center OPERATORSTROKE
				flat SB ([mix top bot 0.5] - fine) [heading  RIGHTWARD]
				curl RIGHTSB (bot - fine)
			save 'lesseqslant' 0x2A7D
	
	sketch # greatereq
		local fine : Math.max [adviceBlackness 4] (XH * 0.1)
		local top : [mix parenMid parenTop 0.5] - fine
		local bot : [mix parenMid parenBot 0.5] + fine
		
		include : dispiro
			widths.center OPERATORSTROKE
			flat SB (top + fine)
			curl RIGHTSB ([mix top bot 0.5] + fine) [heading RIGHTWARD]
		include : dispiro
			widths.center OPERATORSTROKE
			flat RIGHTSB ([mix top bot 0.5] + fine) [heading  LEFTWARD]
			curl SB (bot + fine)
		
		branch
			include : HBar SB RIGHTSB (bot - fine) OPERATORSTROKE
			save 'greatereq' 0x2265
		branch
			include : dispiro
				widths.center OPERATORSTROKE
				flat RIGHTSB ([mix top bot 0.5] - fine) [heading  LEFTWARD]
				curl SB (bot - fine)
			save 'greatereqslant' 0x2A7E
	
	sketch # subst
		local top : mix parenMid parenTop 0.5
		local bot : mix parenMid parenBot 0.5
		include : dispiro
			widths.lhs OPERATORSTROKE
			flat RIGHTSB top [heading LEFTWARD]
			curl (SB + (top - bot) / 2) top
			archv
			g4   SB parenMid
			arcvh
			flat (SB + (top - bot) / 2) bot
			curl RIGHTSB bot [heading RIGHTWARD]
	
		save 'subst' 0x2282
	
	sketch # element
		include glyphs.subst
		include : HBar (SB + HALFSTROKE) RIGHTSB parenMid OPERATORSTROKE
	
		save 'element' 0x2208
	turned nothing 0x2283 'subst' MIDDLE parenMid
	turned nothing 0x220B 'element' MIDDLE parenMid
	
	sketch # sym
		include : WaveShape
			l -- SB
			r -- RIGHTSB
			cy -- parenMid
			extendy -- ((operTop - parenMid) * 0.17)
			tension -- 0.15
			sw -- OPERATORSTROKE
	
		save 'sym' 0x223C
	
	sketch # ident
		include : HBar SB RIGHTSB (parenMid + equalHalfSpace * 1.5) OPERATORSTROKE
		include : HBar SB RIGHTSB parenMid OPERATORSTROKE
		include : HBar SB RIGHTSB (parenMid - equalHalfSpace * 1.5) OPERATORSTROKE
	
		save 'ident' 0x2261
	vdual 'approx' 0x2248 'sym' (equalHalfSpace * 1.75)

symbol-block 'Negative Operators'
	define [notGlyph newid unicode oldid top bot prop shift] : create-glyph [fallback newid : 'not' + oldid] : glyph-construction
		assign-unicode unicode
		include glyphs.(oldid)
		
		include : dispiro
			widths.center OPERATORSTROKE
			flat ([fallback shift 0] + [mix SB RIGHTSB [fallback prop 0.25]]) [fallback bot operBot]
			curl ([fallback shift 0] + [mix RIGHTSB SB [fallback prop 0.25]]) [fallback top operTop]
	
	define [notGlyph.right newid unicode oldid top bot prop shift] : notGlyph newid unicode oldid top bot prop (-OPERATORSTROKE * 0.5)
	define [notGlyph.left newid unicode oldid top bot prop shift] : notGlyph newid unicode oldid top bot prop (OPERATORSTROKE * 0.5)
	notGlyph 'noteq' 0x2260 'equal'
	notGlyph 'notident' 0x2262 'ident'
	notGlyph.left 'notless' 0x226E 'less'
	notGlyph.right 'notgreater' 0x226F 'greater'
	notGlyph 'notapprox' 0x2249 'approx' [mix parenMid operTop 0.75] [mix parenMid operBot 0.75]
	notGlyph 'notsym' 0x2241 'sym' [mix parenMid operTop 0.75] [mix parenMid operBot 0.75]
	notGlyph.left 'notsubst' 0x2284 'subst'
	notGlyph.right 'notturnsubst' 0x2285 'turnsubst'
	notGlyph.left 'notelement' 0x2209 'element'
	notGlyph.right 'notturnelement' 0x220C 'turnelement'
	notGlyph.left 'notlesseq' 0x2270 'lesseq'
	notGlyph.right 'notgreatereq' 0x2271 'greatereq'
	notGlyph.right 'nonexist' 0x2204 'exists' (CAP - DESCENDER / 2) (DESCENDER / 2) 0.4

symbol-block 'Large Operators'
	sketch # sum
		include : SigmaShape parenTop parenBot OPERATORSTROKE
	
		save 'sum' 0x2211
	
	sketch # product
		include : PiShape parenTop parenBot 0 OPERATORSTROKE
		save 'product' 0x220F
	turned 'coproduct' 0x2210 'product' MIDDLE parenMid

	sketch # integrate
		include : LongSShape parenTop parenBot HOOK (HOOK * 0.75) OPERATORSTROKE
	
		save 'integrate' 0x222B
	dual 'doubleintegrate' 0x222C 'integrate' (0.5 * WIDTH)
	
	sketch # ringintegrate
		include glyphs.integrate
		include : OShape (parenMid + (RIGHTSB - SB) / 2) (parenMid - (RIGHTSB - SB) / 2) SB RIGHTSB OPERATORSTROKE
	
		save 'ringintegrate' 0x222E
	
	sketch # Vee
		
		include : dispiro
			widths.center OPERATORSTROKE
			flat SB parenTop
			curl MIDDLE parenBot [heading DOWNWARD]
		
		include : dispiro
			widths.center OPERATORSTROKE
			flat RIGHTSB parenTop
			curl MIDDLE parenBot [heading DOWNWARD]
		save 'Vee' 0x22C1
	turned 'Wedge' 0x22C0 'Vee' MIDDLE parenMid
	
	sketch # Cup
		include : UShape parenTop parenBot OPERATORSTROKE true
		save 'Cup' 0x22C3
	turned 'Cap' 0x22C2 'Cup' MIDDLE parenMid

### Others
symbol-block 'Other Mathematical Operators'
	alias 'mathbullet' 0x2219 'bullet'
	
	sketch # sqrt
		include : dispiro
			widths.center OPERATORSTROKE
			flat SB [mix parenBot parenTop 0.45]
			curl MIDDLE parenBot [heading DOWNWARD]
		include : dispiro
			widths.center OPERATORSTROKE
			flat WIDTH parenTop
			curl MIDDLE parenBot [heading DOWNWARD]
		save 'sqrt' 0x221A