Files
Iosevka/glyphs/symbol-math.ptl
T
2018-01-30 13:10:40 +08:00

955 lines
37 KiB
Plaintext

###### Mathematical symbols
$$include '../meta/macros.ptl'
import [mix linreg clamp fallback] from '../support/utils'
import [designParameters] from '../meta/aesthetics'
export : define [apply] : begin
glyph-module-entry commonShapes overmarks letterBasic letterExt
### Letter-like
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 markset.capital
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 : begin
local s : (RIGHTSB - SB - O * 4 + (FULLWIDTH - WIDTH) * 0.5) / CAP
local df : Miniature
glyphs -- {'eight' 'rotetedpropto'}
crowd -- 4
scale -- s
slantAngle -- 0
unfair -- true
sketch # infty
set-width FULLWIDTH
include df.eight
apply-transform : Translate (-MIDDLE) (-CAP / 2)
apply-transform : Rotate (Math.PI / 2)
apply-transform : Scale s
apply-transform : Translate FWMIDDLE parenMid
apply-transform : Italify
refair this
save 'infty' 0x221E
sketch # propto
set-width FULLWIDTH
include df.rotetedpropto
apply-transform : Translate (-MIDDLE) (-CAP / 2)
apply-transform : Rotate (Math.PI / 2)
apply-transform : Scale s
apply-transform : Translate FWMIDDLE parenMid
apply-transform : Italify
refair this
save 'propto' 0x221D
sketch # partial
include markset.b
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
### Mathematical Operators
do
local sw OPERATORSTROKE
local k : 2 / 3
local top : parenMid + (RIGHTSB - SB) * 0.5 + sw * k
local bottom : parenMid - (RIGHTSB - SB) * 0.5 - sw * k
local left : SB - sw * k
local right : RIGHTSB + sw * k
sketch # mathO
include : OShape top bottom left right sw (SMALLSMOOTHA * 3) (SMALLSMOOTHB * 3)
save 'mathO'
sketch # mathO-outline
include : OShapeOutline top bottom left right sw (SMALLSMOOTHA * 3) (SMALLSMOOTHB * 3)
save 'mathOOutline'
sketch # mathBoxOutline
include : spiro-outline
corner left top
corner left bottom
corner right bottom
corner right top
save 'mathBoxOutline'
sketch # mathBox
include : intersection glyphs.mathBoxOutline : union
dispiro [widths.lhs sw] [flat left top] [curl left bottom]
dispiro [widths.lhs sw] [flat left bottom] [curl right bottom]
dispiro [widths.lhs sw] [flat right bottom] [curl right top]
dispiro [widths.lhs sw] [flat right top] [curl left top]
save 'mathBox'
sketch
include : intersection
spiro-outline
corner left bottom
corner right bottom
corner right top
union
dispiro [widths.lhs sw] [flat left bottom] [curl right bottom]
dispiro [widths.lhs sw] [flat right bottom] [curl right top]
dispiro [widths.lhs sw] [flat right top] [curl left bottom]
save 'mathRightTriangle' 0x22BF
sketch
include : intersection
spiro-outline
corner left bottom
corner right bottom
corner right top
union
dispiro [widths.lhs sw] [flat left bottom] [curl right bottom]
dispiro [widths.lhs sw] [flat right top] [curl left bottom]
save 'angle' 0x2220
sketch # plus
include markset.plus
include : HBar SB RIGHTSB parenMid OPERATORSTROKE
include : VBar MIDDLE plusTop plusBot OPERATORSTROKE
save 'plus' '+'
sketch # ligplus.lc
include markset.plus
include : HBar SB (WIDTH - O) parenMid OPERATORSTROKE
include : VBar MIDDLE plusTop plusBot OPERATORSTROKE
save 'ligplus.lc'
sketch # ligplus.lc.s
include markset.plus
include : HBar SB (WIDTH - O) parenMid OPERATORSTROKE
include : VBar (MIDDLE + SB) plusTop plusBot OPERATORSTROKE
save 'ligplus.lc.s'
sketch # ligplus.cc
include markset.plus
include : HBar O (WIDTH - O) parenMid OPERATORSTROKE
include : VBar MIDDLE plusTop plusBot OPERATORSTROKE
save 'ligplus.cc'
sketch # ligplus.cr
include markset.plus
include : HBar O RIGHTSB parenMid OPERATORSTROKE
include : VBar MIDDLE plusTop plusBot OPERATORSTROKE
save 'ligplus.cr'
sketch # ligplus.cr.s
include markset.plus
include : HBar O RIGHTSB parenMid OPERATORSTROKE
include : VBar (MIDDLE - SB) plusTop plusBot OPERATORSTROKE
save 'ligplus.cr.s'
sketch # ligplus.jr
include markset.plus
include : HBar (-SB + O) RIGHTSB parenMid OPERATORSTROKE
include : VBar MIDDLE plusTop plusBot OPERATORSTROKE
save 'ligplus.jr'
sketch # minus
include markset.plus
include : HBar SB RIGHTSB parenMid OPERATORSTROKE
save 'minus' 0x2212
sketch # plusminus
include markset.plus
include : HBarBottom SB RIGHTSB 0 OPERATORSTROKE
include glyphs.plus
save 'plusminus' 0xB1
turned 'minusplus' 0x2213 'plusminus' MIDDLE parenMid
local equalHalfSpace : (parenTop - parenBot) * designParameters.equal_wideness
sketch # equal
include markset.plus
include : HBar SB RIGHTSB (parenMid + equalHalfSpace) OPERATORSTROKE
include : HBar SB RIGHTSB (parenMid - equalHalfSpace) OPERATORSTROKE
save 'equal' '='
branch
include : DotAt [mix SB RIGHTSB (1/6)] (parenMid + equalHalfSpace * 2.5) DOTRADIUS
include : DotAt [mix SB RIGHTSB (5/6)] (parenMid - equalHalfSpace * 2.5) DOTRADIUS
save 'twodotapproxeq' 0x2252
define [equalHole x] : VBar x (parenMid - equalHalfSpace) (parenMid + equalHalfSpace) [adviceBlackness 6]
# Ligation glyphs
sketch # equal.fc
include markset.plus
include : difference
union
HBar SB (WIDTH - O) (parenMid + equalHalfSpace) OPERATORSTROKE
HBar SB (WIDTH - O) (parenMid - equalHalfSpace) OPERATORSTROKE
equalHole WIDTH
save 'equal.fc'
sketch # equal.cf
include markset.plus
include : difference
union
HBar O RIGHTSB (parenMid + equalHalfSpace) OPERATORSTROKE
HBar O RIGHTSB (parenMid - equalHalfSpace) OPERATORSTROKE
equalHole 0
save 'equal.cf'
sketch # equal.cc
include markset.plus
include : difference
union
HBar O (WIDTH - O) (parenMid + equalHalfSpace) OPERATORSTROKE
HBar O (WIDTH - O) (parenMid - equalHalfSpace) OPERATORSTROKE
union
equalHole 0
equalHole WIDTH
save 'equal.cc'
sketch # multiply
include markset.plus
local radius : (RIGHTSB - SB) / 2
include : dispiro
widths.center OPERATORSTROKE
flat (MIDDLE - radius) (parenMid - radius)
curl (MIDDLE + radius) (parenMid + radius)
save 'multiplyStroke1'
sketch # multiply
include markset.plus
local radius : (RIGHTSB - SB) / 2
include : dispiro
widths.center OPERATORSTROKE
flat (MIDDLE + radius) (parenMid - radius)
curl (MIDDLE - radius) (parenMid + radius)
save 'multiplyStroke2'
sketch # multiply
include markset.plus
include glyphs.multiplyStroke1
include glyphs.multiplyStroke2
save 'multiply' 0xD7
sketch # divide
include markset.plus
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
do "colon-likes"
local radius1 PERIODRADIUS
local radius : Math.min PERIODRADIUS
linreg WIDTH (0.5 * [adviceBlackness 3.5] * PERIODSIZE / STROKE) UPM PERIODRADIUS FULLWIDTH
local left : mix 0 FULLWIDTH (1 / 4)
local right : mix 0 FULLWIDTH (3 / 4)
sketch
set-width FULLWIDTH
include : Ring (XH - O) (XH - radius * 2 + O) (FULLWIDTH / 2 - radius + O) (FULLWIDTH / 2 + radius - O) true
include : Ring (radius * 2 - O) O (left - radius + O) (left + radius - O) true
include : Ring (radius * 2 - O) O (right - radius + O) (right + radius - O) true
save 'therefore' 0x2234
sketch
set-width FULLWIDTH
include : Ring (XH - O) (XH - radius * 2 + O) (left - radius + O) (left + radius - O) true
include : Ring (XH - O) (XH - radius * 2 + O) (right - radius + O) (right + radius - O) true
include : Ring (radius * 2 - O) O (FULLWIDTH / 2 - radius + O) (FULLWIDTH / 2 + radius - O) true
save 'because' 0x2235
sketch
set-width FULLWIDTH
include : Ring (PERIODRADIUS * 2 - O) O (FULLWIDTH / 2 - PERIODRADIUS + O) (FULLWIDTH / 2 + PERIODRADIUS - O) true
include : Ring (XH - O) (XH - PERIODRADIUS * 2 + O) (FULLWIDTH / 2 - PERIODRADIUS + O) (FULLWIDTH / 2 + PERIODRADIUS - O) true
save 'mathcolon' 0x2236
sketch # coloncolon
set-width FULLWIDTH
include : Ring (radius * 2 - O) O (left - radius + O) (left + radius - O) true
include : Ring (radius * 2 - O) O (right - radius + O) (right + radius - O) true
include : Ring (XH - O) (XH - radius * 2 + O) (left - radius + O) (left + radius - O) true
include : Ring (XH - O) (XH - radius * 2 + O) (right - radius + O) (right + radius - O) true
save 'coloncolon' 0x2237
sketch # mathcdot
include : Ring (parenMid + PERIODRADIUS - O) (parenMid - PERIODRADIUS + O) (MIDDLE - PERIODRADIUS + O) (MIDDLE + PERIODRADIUS - O) true
save 'mathcdot'
composite 'mathAsterisk' glyphs.'smallasterisk.low' [into-unicode 0x2217]
# circled operators
composite glyphs.mathO [intersection glyphs.mathOOutline glyphs.plus] [into-unicode 0x2295]
composite glyphs.mathO [intersection glyphs.mathOOutline glyphs.minus] [into-unicode 0x2296]
composite glyphs.mathO [intersection glyphs.mathOOutline glyphs.multiply] [into-unicode 0x2297]
composite glyphs.mathO [intersection glyphs.mathOOutline glyphs.multiplyStroke1] [into-unicode 0x2298]
composite glyphs.mathO [intersection glyphs.mathOOutline glyphs.mathcdot] [into-unicode 0x2299]
composite glyphs.mathO [intersection glyphs.mathOOutline glyphs.hwsmallwhitecircle] [into-unicode 0x229A]
composite glyphs.mathO [intersection glyphs.mathOOutline glyphs.mathAsterisk] [into-unicode 0x229B]
do
local eqS : Math.min OPERATORSTROKE ((RIGHTSB - SB) / 8)
local eqD : Math.max eqS ((RIGHTSB - SB) / 6)
composite glyphs.mathO
intersection glyphs.mathOOutline : union
HBar (SB + eqS) (RIGHTSB - eqS) (parenMid + eqD) eqS
HBar (SB + eqS) (RIGHTSB - eqS) (parenMid - eqD) eqS
into-unicode 0x229C
composite glyphs.mathO [intersection glyphs.mathOOutline [HBar (SB + OPERATORSTROKE) (RIGHTSB - OPERATORSTROKE) parenMid OPERATORSTROKE]] [into-unicode 0x229D]
# boxed operators
composite glyphs.mathBox [intersection glyphs.mathBoxOutline glyphs.plus] [into-unicode 0x229E]
composite glyphs.mathBox [intersection glyphs.mathBoxOutline glyphs.minus] [into-unicode 0x229F]
composite glyphs.mathBox [intersection glyphs.mathBoxOutline glyphs.multiply] [into-unicode 0x22A0]
composite glyphs.mathBox [intersection glyphs.mathBoxOutline glyphs.mathcdot] [into-unicode 0x22A1]
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
### Logicals
do "Logicals"
sketch # negate
include glyphs.minus
include : VBarRight RIGHTSB (parenMid - (RIGHTSB - SB) * 0.55) parenMid OPERATORSTROKE
save 'negate' 0xAC
local top : mix parenMid operTop 0.625
local bot : mix parenMid operBot 0.625
sketch # vdash
include markset.plus
include : HBar SB RIGHTSB parenMid OPERATORSTROKE
include : VBarLeft SB top bot OPERATORSTROKE
save 'vdash' 0x22A2
turned 'dashv' 0x22A3 'vdash' MIDDLE parenMid
sketch # assert
include markset.plus
local l : mix MIDDLE SB designParameters.logic_narrow_shrink
local r : mix MIDDLE RIGHTSB designParameters.logic_narrow_shrink
include : HBar l r parenMid OPERATORSTROKE
include : VBarLeft l top bot OPERATORSTROKE
save 'assert' 0x22A6
sketch # models
include markset.plus
local l : mix MIDDLE SB designParameters.logic_narrow_shrink
local r : mix MIDDLE RIGHTSB designParameters.logic_narrow_shrink
include : HBar l r [mix parenMid top (1 / 3)] OPERATORSTROKE
include : HBar l r [mix parenMid bot (1 / 3)] OPERATORSTROKE
include : VBarLeft l top bot OPERATORSTROKE
save 'models' 0x22A7
sketch # tautology
include markset.plus
local l : mix MIDDLE SB 1
local r : mix MIDDLE RIGHTSB 1
include : HBar l r [mix parenMid top (1 / 3)] OPERATORSTROKE
include : HBar l r [mix parenMid bot (1 / 3)] OPERATORSTROKE
include : VBarLeft l top bot OPERATORSTROKE
save 'tautology' 0x22A8
sketch # top
include markset.plus
include : HBarTop SB RIGHTSB top OPERATORSTROKE
include : VBar MIDDLE top bot OPERATORSTROKE
save 'top' 0x22A4
composite 'bot' glyphs.top [FlipAround MIDDLE parenMid] [into-unicode 0x22A5]
sketch # perp
include markset.plus
include : HBarBottom SB RIGHTSB 0 OPERATORSTROKE
include : VBar MIDDLE (parenMid * 2) 0 OPERATORSTROKE
save 'perpendicular' 0x27C2
do "less and greater"
# Less and Greater
define lessSlantness : 1 / 5 * (parenTop - parenBot) / (RIGHTSB - SB)
define dH : lessSlantness * (RIGHTSB - SB)
define lessEqDist : Math.max [adviceBlackness 4] (XH * 0.1)
define [LessShapeA top bot l r s] : begin
local exp : Math.sqrt : 1 + (top - bot) / (2 * (r - l)) * (top - bot) / (2 * (r - l))
return : dispiro
widths.center s
flat r top
curl l [mix top bot 0.5] [widths.heading (s / 2 * exp) (s / 2 * exp) LEFTWARD]
define [LessShapeB top bot l r s] : begin
local exp : Math.sqrt : 1 + (top - bot) / (2 * (r - l)) * (top - bot) / (2 * (r - l))
return : dispiro
widths.center s
flat r bot
curl l [mix top bot 0.5] [widths.heading (s / 2 * exp) (s / 2 * exp) LEFTWARD]
define [GreaterShapeA top bot l r s] : begin
local exp : Math.sqrt : 1 + (top - bot) / (2 * (r - l)) * (top - bot) / (2 * (r - l))
return : dispiro
widths.center s
flat l top
curl r [mix top bot 0.5] [widths.heading (s / 2 * exp) (s / 2 * exp) RIGHTWARD]
define [GreaterShapeB top bot l r s] : begin
local exp : Math.sqrt : 1 + (top - bot) / (2 * (r - l)) * (top - bot) / (2 * (r - l))
return : dispiro
widths.center s
flat l bot
curl r [mix top bot 0.5] [widths.heading (s / 2 * exp) (s / 2 * exp) RIGHTWARD]
define [LessShape top bot l r s] : glyph-construction
include : LessShapeA top bot l r [fallback s OPERATORSTROKE]
include : LessShapeB top bot l r [fallback s OPERATORSTROKE]
define [GreaterShape top bot l r s] : glyph-construction
include : GreaterShapeA top bot l r [fallback s OPERATORSTROKE]
include : GreaterShapeB top bot l r [fallback s OPERATORSTROKE]
# Sym parameters
local approxDist : equalHalfSpace * 1.75
local symMag : (operTop - parenMid) * 0.17
define [symWave height mul] : TildeShape
ttop -- height + symMag * mul
tbot -- height - symMag * mul
leftEnd -- SB
rightEnd -- RIGHTSB
hs -- OPERATORSTROKE / 2
sketch # less
include markset.plus
include : LessShape (parenMid + dH) (parenMid - dH) SB RIGHTSB
save 'less' '<'
sketch # greater
include glyphs.less AS_BASE
include : FlipAround MIDDLE parenMid
save 'greater' '>'
do "<| and |>"
local trigLeft : mix SB RIGHTSB (1/6)
local trigRight : WIDTH * 1.5 - OPERATORSTROKE * 1.5 * HVCONTRAST
local dHTriangle : lessSlantness * (trigRight - trigLeft)
sketch # ligless.trig
include markset.plus
include : LessShape (parenMid + dHTriangle) (parenMid - dHTriangle) trigLeft trigRight
save 'ligless.trig'
sketch # ligbar.trig
include : VBar MIDDLE (parenMid + dHTriangle + OPERATORSTROKE) (parenMid - dHTriangle - OPERATORSTROKE) OPERATORSTROKE
save 'ligbar.trig'
sketch # liggreater.trig
include glyphs.'ligless.trig' AS_BASE
include : FlipAround MIDDLE parenMid
save 'liggreater.trig'
sketch # lesseq
include markset.plus
include : LessShape (parenMid + dH + lessEqDist) (parenMid - dH + lessEqDist) SB RIGHTSB
branch
include : Upright
include : Translate 0 (-lessEqDist)
include : Italify
save 'less.narrow'
branch
include : HBar SB RIGHTSB (parenMid - dH - lessEqDist) OPERATORSTROKE
save 'lesseq' 0x2264
branch
include : symWave (parenMid - dH - lessEqDist) 1
save 'lesssym' 0x2272
branch
include : LessShapeB (parenMid + dH - lessEqDist) (parenMid - dH - lessEqDist) SB RIGHTSB OPERATORSTROKE
save 'lesseqslant' 0x2A7D
sketch # greatereq
include markset.plus
include : GreaterShape (parenMid + dH + lessEqDist) (parenMid - dH + lessEqDist) SB RIGHTSB
branch
include : Upright
include : Translate 0 (-lessEqDist)
include : Italify
save 'greater.narrow'
branch
include : HBar SB RIGHTSB (parenMid - dH - lessEqDist) OPERATORSTROKE
save 'greatereq' 0x2265
branch
include : symWave (parenMid - dH - lessEqDist) 1
save 'greatersym' 0x2273
branch
include : GreaterShapeB (parenMid + dH - lessEqDist) (parenMid - dH - lessEqDist) SB RIGHTSB OPERATORSTROKE
save 'greatereqslant' 0x2A7E
# Ligation
sketch
local l : 0.3 * WIDTH
local r : 2 * WIDTH - l
include markset.plus
branch
include : LessShape (parenMid + dH + lessEqDist) (parenMid - dH + lessEqDist) l r
save 'less.lig2'
branch
include : HBar (l - WIDTH) (r - WIDTH) (parenMid - dH - lessEqDist) OPERATORSTROKE
save 'eq.at-ltgteq.lig2'
branch
include : GreaterShape (parenMid + dH + lessEqDist) (parenMid - dH + lessEqDist) l r
save 'greater.lig2'
do
define lesslessSW : adviceBlackness 4
define lesslessSWO : Math.max lesslessSW lessEqDist
define llggHeight : dH * 2 + lessEqDist * 2
sketch
include markset.plus
branch
include : GreaterShape (parenMid + dH + lessEqDist) (parenMid - dH + lessEqDist * 1.75) SB RIGHTSB lesslessSW
include : HBar SB RIGHTSB (parenMid - dH + lessEqDist * 2 / 3) lesslessSW
include : HBar SB RIGHTSB (parenMid - dH - lessEqDist) lesslessSW
save 'greatereqeq' 0x2267
include : dispiro
widths.center lesslessSW
flat (MIDDLE + lessEqDist) (parenMid - dH + lessEqDist * 2 / 3 + lesslessSWO) [heading DOWNWARD]
flat (MIDDLE - lessEqDist) (parenMid - dH - lessEqDist - lesslessSWO) [heading DOWNWARD]
save nothing 0x2269
branch
include : GreaterShape (parenMid + llggHeight / 2) (parenMid - llggHeight / 6 + lessEqDist) SB RIGHTSB lesslessSW
include : LessShape (parenMid + llggHeight / 6 - lessEqDist) (parenMid - llggHeight / 2) SB RIGHTSB lesslessSW
save 'greaterless' 0x2277
sketch
include markset.plus
branch
include : LessShape (parenMid + dH + lessEqDist) (parenMid - dH + lessEqDist * 1.75) SB RIGHTSB lesslessSW
include : HBar SB RIGHTSB (parenMid - dH + lessEqDist * 2 / 3) lesslessSW
include : HBar SB RIGHTSB (parenMid - dH - lessEqDist) lesslessSW
save 'lesseqeq' 0x2266
include : dispiro
widths.center lesslessSW
flat (MIDDLE + lessEqDist) (parenMid - dH + lessEqDist * 2 / 3 + lesslessSWO) [heading DOWNWARD]
flat (MIDDLE - lessEqDist) (parenMid - dH - lessEqDist - lesslessSWO) [heading DOWNWARD]
save nothing 0x2268
branch
include : LessShape (parenMid + llggHeight / 2) (parenMid - llggHeight / 6 + lessEqDist) SB RIGHTSB lesslessSW
include : GreaterShape (parenMid + llggHeight / 6 - lessEqDist) (parenMid - llggHeight / 2) SB RIGHTSB lesslessSW
save 'lessgreater' 0x2276
sketch
include markset.plus
include : LessShape (parenMid + dH) (parenMid - dH) (SB - lessEqDist / 2) (RIGHTSB - lessEqDist * 2) lesslessSW
include : LessShape (parenMid + dH) (parenMid - dH) (SB + lessEqDist * 2) (RIGHTSB + lessEqDist / 2) lesslessSW
save 'lessless' 0x226A
sketch
include markset.plus
include : GreaterShape (parenMid + dH) (parenMid - dH) (SB - lessEqDist / 2) (RIGHTSB - lessEqDist * 2) lesslessSW
include : GreaterShape (parenMid + dH) (parenMid - dH) (SB + lessEqDist * 2) (RIGHTSB + lessEqDist / 2) lesslessSW
save 'greatergreater' 0x226B
sketch # sym
include markset.plus
include : symWave parenMid 1
save 'sym' 0x223C
sketch # flipsym
include markset.plus
include : symWave parenMid (-1)
save 'flipsym' 0x223D
sketch # ident
include markset.plus
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
sketch # iiiident
include markset.plus
include : HBar SB RIGHTSB (parenMid + equalHalfSpace * 2.25) OPERATORSTROKE
include : HBar SB RIGHTSB (parenMid + equalHalfSpace * 0.75) OPERATORSTROKE
include : HBar SB RIGHTSB (parenMid - equalHalfSpace * 0.75) OPERATORSTROKE
include : HBar SB RIGHTSB (parenMid - equalHalfSpace * 2.25) OPERATORSTROKE
save 'iiiident' 0x2263
vdual 'approx' 0x2248 'sym' approxDist
sketch # aapprox
include markset.plus
include : symWave (parenMid + approxDist) 1
include : symWave parenMid 1
branch
include : symWave (parenMid - approxDist) 1
save 'aapprox' 0x224B
branch
include : HBar SB RIGHTSB (parenMid - approxDist) OPERATORSTROKE
save 'approxBar' 0x224A
sketch # symbar
include glyphs.sym AS_BASE
include : Upright
include : Translate 0 (approxDist / 2)
include : Italify
include : HBar SB RIGHTSB (parenMid - approxDist / 2) OPERATORSTROKE
save 'symBar' 0x2243
sketch # symBarBar
local sympShift : approxDist + equalHalfSpace * 1.5
include glyphs.sym AS_BASE
include : Upright
include : Translate 0 (sympShift / 2)
include : Italify
include : HBar SB RIGHTSB (parenMid - sympShift / 2 + equalHalfSpace * 1.5) OPERATORSTROKE
include : HBar SB RIGHTSB (parenMid - sympShift / 2) OPERATORSTROKE
save 'symBarBar' 0x2245
sketch # flipsymBarBar
local sympShift : approxDist + equalHalfSpace * 1.5
include glyphs.flipsym AS_BASE
include : Upright
include : Translate 0 (sympShift / 2)
include : Italify
include : HBar SB RIGHTSB (parenMid - sympShift / 2 + equalHalfSpace * 1.5) OPERATORSTROKE
include : HBar SB RIGHTSB (parenMid - sympShift / 2) OPERATORSTROKE
save 'flipsymBarBar' 0x224C
define [SubsetShape top bot sw] : dispiro
widths.lhs [fallback sw OPERATORSTROKE]
flat RIGHTSB top [heading LEFTWARD]
curl (SB + (top - bot) / 2) top
archv
g4 SB [mix top bot 0.5]
arcvh
flat (SB + (top - bot) / 2) bot
curl RIGHTSB bot [heading RIGHTWARD]
define [SupsetShape top bot] : glyph-construction
include : SubsetShape top bot
include : FlipAround MIDDLE [mix top bot 0.5]
sketch # subst
include markset.plus
include : SubsetShape (parenMid + dH) (parenMid - dH)
save 'subst' 0x2282
sketch # supst
include markset.plus
include : SupsetShape (parenMid + dH) (parenMid - dH)
save 'supst' 0x2283
sketch # substBar
local swo : Math.max (OPERATORSTROKE * 1.5) (lessEqDist * 1.5)
include markset.plus
include : SubsetShape (parenMid + dH + lessEqDist) (parenMid - dH + lessEqDist)
branch
save 'smallSubst'
branch
include : HBar SB RIGHTSB (parenMid - dH - lessEqDist) OPERATORSTROKE
save 'substBar' 0x2286
include : dispiro
widths.center OPERATORSTROKE
flat (MIDDLE + lessEqDist) (parenMid - dH - lessEqDist + swo) [heading DOWNWARD]
flat (MIDDLE - lessEqDist) (parenMid - dH - lessEqDist - swo) [heading DOWNWARD]
save nothing 0x228A
branch
include : FlipAround MIDDLE (parenMid + lessEqDist)
include : HBar SB RIGHTSB (parenMid - dH - lessEqDist) OPERATORSTROKE
save 'supstBar' 0x2287
include : dispiro
widths.center OPERATORSTROKE
flat (MIDDLE + lessEqDist) (parenMid - dH - lessEqDist + swo) [heading DOWNWARD]
flat (MIDDLE - lessEqDist) (parenMid - dH - lessEqDist - swo) [heading DOWNWARD]
save nothing 0x228B
sketch # element
include glyphs.subst AS_BASE
include : HBar (SB + HALFSTROKE) RIGHTSB parenMid OPERATORSTROKE
save 'element' 0x2208
turned nothing 0x220B 'element' MIDDLE parenMid
sketch # small element
include markset.plus
define sw : Math.min (dH * 4 / (3 * 5)) OPERATORSTROKE
include : SubsetShape (parenMid + dH * 2 / 3) (parenMid - dH * 2 / 3) sw
include : HBar (SB + HALFSTROKE) RIGHTSB parenMid sw
save 'smallElement' 0x220A
sketch # element-with bar
include markset.plus
include : SubsetShape (parenMid + dH + lessEqDist) (parenMid - dH + lessEqDist)
include : HBar (SB + HALFSTROKE) RIGHTSB (parenMid + lessEqDist) OPERATORSTROKE
save 'elementBar' 0x22F8
define [notGlyph unicode oldid top bot prop shift newid]
create-glyph [fallback newid ('not' + oldid)] : glyph-construction
if unicode : assign-unicode unicode
include glyphs.(oldid)
include : dispiro
widths.center [adviceBlackness 4]
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 unicode oldid top bot prop shift]
notGlyph unicode oldid top bot prop (-OPERATORSTROKE * 0.5)
define [notGlyph.left unicode oldid top bot prop shift]
notGlyph unicode oldid top bot prop (OPERATORSTROKE * 0.5)
notGlyph 0x2260 'equal'
notGlyph 0x2262 'ident'
notGlyph 0x22AC 'vdash'
notGlyph 0x22AD 'tautology'
notGlyph.left 0x226E 'less'
notGlyph.right 0x226F 'greater'
notGlyph 0x2241 'sym' [mix parenMid operTop 0.75] [mix parenMid operBot 0.75]
notGlyph 0x2244 'symBar' [mix parenMid operTop 0.75] [mix parenMid operBot 0.75]
notGlyph 0x2247 'symBarBar'
notGlyph 0x2249 'approx' [mix parenMid operTop 0.75] [mix parenMid operBot 0.75]
notGlyph.left 0x2284 'subst'
notGlyph.right 0x2285 'supst'
notGlyph.left 0x2288 'substBar'
notGlyph.right 0x2289 'supstBar'
notGlyph.left 0x2209 'element'
notGlyph.right 0x220C 'turnelement'
notGlyph.left 0x2270 'lesseq'
notGlyph.right 0x2271 'greatereq'
notGlyph.left 0x2274 'lesssym'
notGlyph.right 0x2275 'greatersym'
notGlyph 0x2278 'lessgreater'
notGlyph 0x2279 'greaterless'
notGlyph.right 0x2204 'exists' (CAP - DESCENDER / 2) (DESCENDER / 2) 0.4
do "Ligation glyphs"
notGlyph null 'equal.fc' nothing nothing nothing (WIDTH * 0.5) 'equal.fc.neg'
notGlyph null 'equal.fc' nothing nothing nothing (WIDTH * 1.0) 'equal.fc.neg3'
notGlyph null 'equal.fc' nothing nothing nothing (WIDTH * 1.5) 'equal.fc.neg4'
### 'Large Operators'
sketch # sum
include : SigmaShape parenTop parenBot OPERATORSTROKE
save 'sum' 0x2211
sketch # product
include : PiShape parenTop parenBot (shrinkrate -- 0) (_fine -- 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
define [shape] : LongSShape parenTop parenBot HOOK (HOOK * 0.75) [adviceBlackness 3.75]
include [shape]
include : Translate (-WIDTH / 3) 0
include [shape]
include : Translate (-WIDTH / 3) 0
include [shape]
include : Translate (WIDTH / 3) 0
save 'tripleintegrate' 0x222D
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
### APL
local aplBoxSW : adviceBlackness 4.5
sketch # aplsquare
local l [mix 0 SB (1 / 3)]
local r [mix WIDTH RIGHTSB (1 / 3)]
include : HBarTop l r operTop aplBoxSW
include : HBarBottom l r operBot aplBoxSW
include : VBarLeft l operTop operBot aplBoxSW
include : VBarRight r operTop operBot aplBoxSW
save 'aplsquare' 0x2395
sketch # aplibar
local l [mix 0 SB (1 / 3)]
local r [mix WIDTH RIGHTSB (1 / 3)]
include : HBarTop l r operTop aplBoxSW
include : HBarBottom l r operBot aplBoxSW
include : VBar MIDDLE operTop operBot aplBoxSW
save 'aplibar' 0x2336
sketch # aplsquish
local l SB
local r RIGHTSB
include : HBarTop l r operTop aplBoxSW
include : HBarBottom l r operBot aplBoxSW
include : VBarLeft l operTop operBot aplBoxSW
include : VBarRight r operTop operBot aplBoxSW
save 'aplsquish' 0x2337
sketch # aplbar
include : VBar MIDDLE parenTop parenBot aplBoxSW
save 'aplbar'
sketch # aplbackslash
include : dispiro
widths.center aplBoxSW
flat SB operTop
curl RIGHTSB operBot
save 'aplbackslash'
define aplBoxTfm : ScaleAround MIDDLE parenMid [Math.min ((WIDTH - aplBoxSW * 1.75) / WIDTH) ((operTop - operBot) / (parenTop - parenBot))]
composite glyphs.equal aplBoxTfm glyphs.aplsquare [into-unicode 0x2338]
composite glyphs.divide aplBoxTfm glyphs.aplsquare [into-unicode 0x2339]
composite glyphs.hwwhitediamond aplBoxTfm glyphs.aplsquare [into-unicode 0x233A]
composite glyphs.hwsmallwhitecircle aplBoxTfm glyphs.aplsquare [into-unicode 0x233B]
composite glyphs.hwwhitecircle aplBoxTfm glyphs.aplsquare [into-unicode 0x233C]
composite glyphs.hwwhitecircle glyphs.aplbar [into-unicode 0x233D]
composite glyphs.hwwhitecircle glyphs.hwsmallwhitecircle [into-unicode 0x233E]
composite glyphs.minus glyphs.slash [into-unicode 0x233F]
composite glyphs.minus glyphs.backslash [into-unicode 0x2340]
composite glyphs.slash aplBoxTfm glyphs.aplsquare [into-unicode 0x2341]
composite glyphs.backslash aplBoxTfm glyphs.aplsquare [into-unicode 0x2342]
composite glyphs.less aplBoxTfm glyphs.aplsquare [into-unicode 0x2343]
composite glyphs.greater aplBoxTfm glyphs.aplsquare [into-unicode 0x2344]
composite glyphs.hwarrowleft glyphs.aplbar [into-unicode 0x2345]
composite glyphs.hwarrowright glyphs.aplbar [into-unicode 0x2346]
composite glyphs.hwarrowleft aplBoxTfm glyphs.aplsquare [into-unicode 0x2347]
composite glyphs.hwarrowright aplBoxTfm glyphs.aplsquare [into-unicode 0x2348]
composite glyphs.hwwhitecircle glyphs.aplbackslash [into-unicode 0x2349]
composite glyphs.bot glyphs.underlineBelow [into-unicode 0x234A]
composite glyphs.increment glyphs.aplbar [into-unicode 0x234B]
composite glyphs.vee aplBoxTfm glyphs.aplsquare [into-unicode 0x234C]
composite glyphs.increment aplBoxTfm glyphs.aplsquare [into-unicode 0x234D]
composite
begin glyphs.hwwhitecircle
VBar MIDDLE operBot operTop aplBoxSW
HBarBottom SB RIGHTSB operBot aplBoxSW
into-unicode 0x234E
composite glyphs.hwarrowup glyphs.minus [into-unicode 0x234F]
composite glyphs.hwarrowup aplBoxTfm glyphs.aplsquare [into-unicode 0x2350]
composite glyphs.top glyphs.overlineAbove [into-unicode 0x2351]
composite glyphs.nabla glyphs.aplbar [into-unicode 0x2352]
composite glyphs.wedge aplBoxTfm glyphs.aplsquare [into-unicode 0x2353]
composite glyphs.nabla aplBoxTfm glyphs.aplsquare [into-unicode 0x2354]
composite
begin glyphs.hwwhitecircle
VBar MIDDLE operBot operTop aplBoxSW
HBarTop SB RIGHTSB operTop aplBoxSW
into-unicode 0x2355
composite glyphs.hwarrowdown glyphs.minus [into-unicode 0x2356]
composite glyphs.hwarrowdown aplBoxTfm glyphs.aplsquare [into-unicode 0x2357]
composite glyphs.singleQuote markset.plus glyphs.underlineBelow [into-unicode 0x2358]
composite
begin glyphs.space
LambdaShape OPERATORSTROKE (plusTop - plusBot + ACCENT)
HBarBottom (SB + OPERATORSTROKE / 2) (RIGHTSB - OPERATORSTROKE / 2) 0 OPERATORSTROKE
Realign MIDDLE ((plusTop - plusBot) / 2) MIDDLE parenMid
begin markset.plus
begin glyphs.underlineBelow
into-unicode 0x2359
composite glyphs.hwwhitediamond markset.plus glyphs.underlineBelow [into-unicode 0x235A]
composite glyphs.hwsmallwhitecircle markset.plus glyphs.underlineBelow [into-unicode 0x235B]
composite glyphs.hwwhitecircle markset.plus glyphs.underlineBelow [into-unicode 0x235C]
composite
begin glyphs.hwsmallwhitecircle
ScaleAround MIDDLE parenMid 0.75
Realign MIDDLE parenMid MIDDLE (operBot + SMOOTH)
UShape operTop operBot [adviceBlackness 5] true
FlipAround MIDDLE parenMid
into-unicode 0x235D
composite glyphs.singleQuote aplBoxTfm glyphs.aplsquare [into-unicode 0x235E]
composite
begin glyphs.hwblackstar
glyph-construction
reverse-last
FlipAround MIDDLE parenMid 0.75
begin glyphs.mathO
into-unicode 0x235F
composite glyphs.colon [Realign MIDDLE (XH/2) MIDDLE parenMid] aplBoxTfm glyphs.aplsquare [into-unicode 0x2360]
composite glyphs.top glyphs.dieresisAbove [into-unicode 0x2361]
composite glyphs.nabla glyphs.dieresisAbove [into-unicode 0x2362]
composite glyphs.hwblackstar glyphs.dieresisAbove [into-unicode 0x2363]
composite glyphs.hwsmallwhitecircle markset.plus glyphs.dieresisAbove [into-unicode 0x2364]
composite glyphs.hwwhitecircle markset.plus glyphs.dieresisAbove [into-unicode 0x2365]
composite glyphs.space [UShape operTop operBot aplBoxSW true] glyphs.aplbar [into-unicode 0x2366]
composite glyphs.subst glyphs.aplbar [into-unicode 0x2367]
composite glyphs.'asciitilde.low' glyphs.dieresisAbove [into-unicode 0x2368]
composite glyphs.'greater.narrow' glyphs.dieresisAbove [into-unicode 0x2369]
composite glyphs.minus glyphs.comma [Upright] [Translate 0 (XH / 2)] [Italify] [into-unicode 0x236A]
composite glyphs.nabla glyphs.overlaytilde [into-unicode 0x236B]
composite glyphs.'zero.unslashed' glyphs.overlaytilde [into-unicode 0x236C]
composite glyphs.bar glyphs.overlaytilde [into-unicode 0x236D]
composite glyphs.semicolon [Realign MIDDLE (XH/2) MIDDLE parenMid] markset.plus glyphs.underlineBelow [into-unicode 0x236E]
composite glyphs.notequal aplBoxTfm glyphs.aplsquare [into-unicode 0x236F]
composite glyphs.question aplBoxTfm glyphs.aplsquare [into-unicode 0x2370]
composite glyphs.vee glyphs.overlaytilde [into-unicode 0x2371]
composite glyphs.wedge glyphs.overlaytilde [into-unicode 0x2372]
alias 'apliota' 0x2373 'iota'
alias 'aplrho' 0x2374 'rho'
alias 'aplomega' 0x2375 'omega'
composite glyphs.alpha glyphs.underlineBelow [into-unicode 0x2376]
composite glyphs.epsilon glyphs.underlineBelow [into-unicode 0x2377]
composite glyphs.iota glyphs.underlineBelow [into-unicode 0x2378]
composite glyphs.omega glyphs.underlineBelow [into-unicode 0x2379]
alias 'aplalpha' 0x237A 'alpha'
### Others
alias 'mathbullet' 0x2219 'bullet'
alias 'mathbar' 0x2223 'bar'
notGlyph 0x2224 'mathbar' [mix parenMid operTop 0.5] [mix parenMid operBot 0.5] 0.1
dual 'parallel' 0x2225 'bar' (WIDTH * 0.35)
notGlyph 0x2226 'parallel' [mix parenMid operTop 0.5] [mix parenMid operBot 0.5] 0
alias 'mathsmallcircle' 0x2218 'hwsmallwhitecircle'
alias 'mathstar' 0x22C6 'hwblackstar'
turned 'amalg' 0x2A3F 'Pi' MIDDLE (CAP / 2)
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