872 lines
28 KiB
Plaintext
872 lines
28 KiB
Plaintext
### Punctuation 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
|
|
# spaces
|
|
# we set the width of emquad to 1000mem (1em) and the width of emspace to WIDTH (0.5em)
|
|
### 'Spaces'
|
|
alias 'enquad' 0x2000 'space'
|
|
alias 'ensp' 0x2002 'space'
|
|
alias 'threePerEmsp' 0x2004 'space'
|
|
alias 'fourPerEmsp' 0x2005 'space'
|
|
alias 'sixPerEmsp' 0x2006 'space'
|
|
alias 'fgsp' 0x2007 'space'
|
|
|
|
sketch # zwsp
|
|
set-width 0
|
|
set currentGlyph.cmpPriority (-9999)
|
|
save 'zwsp' 0x200B
|
|
|
|
sketch # nbsp
|
|
include glyphs.space
|
|
include markset.e
|
|
set currentGlyph.cmpPriority (-100)
|
|
save 'nbsp' 0xA0
|
|
|
|
sketch # em-space
|
|
set-width FULLWIDTH
|
|
save 'emquad' 0x2001
|
|
save 'emsp' 0x2003
|
|
|
|
### 'Brackets'
|
|
local parenOutside 0.15
|
|
local parenInside 0.65
|
|
local bracketOutside 0.15
|
|
local bracketInside 0.9
|
|
local braceOutside 0.1
|
|
local braceInside 0.9
|
|
|
|
sketch # parenLeft
|
|
local p 0.6
|
|
include : dispiro
|
|
widths.lhs
|
|
g4 [mix SB RIGHTSB parenInside] parenTop
|
|
quadcontrols 1 (1 - p)
|
|
g4 [mix SB RIGHTSB parenOutside] parenMid
|
|
quadcontrols 0 p
|
|
g4 [mix SB RIGHTSB parenInside] parenBot
|
|
save 'parenLeft' '('
|
|
|
|
sketch # parenRight
|
|
include glyphs.parenLeft
|
|
include : FlipAround MIDDLE parenMid
|
|
save 'parenRight' ')'
|
|
|
|
sketch # bracketLeft
|
|
include : HBarBottom [mix SB RIGHTSB bracketOutside] [mix SB RIGHTSB bracketInside] parenBot
|
|
include : HBarTop [mix SB RIGHTSB bracketOutside] [mix SB RIGHTSB bracketInside] parenTop
|
|
include : VBarLeft [mix SB RIGHTSB bracketOutside] parenBot parenTop
|
|
save 'bracketLeft' '['
|
|
|
|
sketch # bracketRight
|
|
include glyphs.bracketLeft
|
|
include : FlipAround MIDDLE parenMid
|
|
save 'bracketRight' ']'
|
|
|
|
sketch # braceLeft
|
|
local parenCenter [mix SB RIGHTSB [mix braceInside braceOutside 0.5]]
|
|
local radius : [mix SB RIGHTSB braceInside] - parenCenter
|
|
|
|
include : dispiro
|
|
flat [mix SB RIGHTSB braceInside] (parenTop - HALFSTROKE) [widths.heading HALFSTROKE HALFSTROKE LEFTWARD]
|
|
curl ([mix SB RIGHTSB braceInside] - 0.01) (parenTop - HALFSTROKE) [widths.heading HALFSTROKE HALFSTROKE LEFTWARD]
|
|
archv
|
|
flat parenCenter (parenTop - radius) [heading DOWNWARD]
|
|
curl parenCenter (parenMid + radius) [heading DOWNWARD]
|
|
arcvh
|
|
flat ([mix SB RIGHTSB braceOutside] + 0.01) parenMid [heading LEFTWARD]
|
|
curl [mix SB RIGHTSB braceOutside] parenMid [heading LEFTWARD]
|
|
|
|
include : dispiro
|
|
flat [mix SB RIGHTSB braceInside] (parenBot + HALFSTROKE) [widths.heading HALFSTROKE HALFSTROKE LEFTWARD]
|
|
curl ([mix SB RIGHTSB braceInside] - 0.01) (parenBot + HALFSTROKE) [widths.heading HALFSTROKE HALFSTROKE LEFTWARD]
|
|
archv
|
|
flat parenCenter (parenBot + radius) [heading UPWARD]
|
|
curl parenCenter (parenMid - radius) [heading UPWARD]
|
|
arcvh
|
|
flat ([mix SB RIGHTSB braceOutside] + 0.01) parenMid [heading LEFTWARD]
|
|
curl [mix SB RIGHTSB braceOutside] parenMid [heading LEFTWARD]
|
|
save 'braceLeft' '{'
|
|
|
|
sketch # braceRight
|
|
include glyphs.braceLeft
|
|
include : FlipAround MIDDLE parenMid
|
|
save 'braceRight' '}'
|
|
|
|
sketch # angleLeft
|
|
local fatten : Math.hypot 1 (([mix SB RIGHTSB : parenInside - parenOutside] - O) / (parenTop - parenMid))
|
|
include : dispiro
|
|
widths.lhs OPERATORSTROKE
|
|
flat [mix SB RIGHTSB parenInside] parenTop
|
|
curl ([mix SB RIGHTSB parenOutside] + O) parenMid [widths.heading (OPERATORSTROKE * fatten) 0 DOWNWARD]
|
|
include : dispiro
|
|
widths.rhs OPERATORSTROKE
|
|
flat [mix SB RIGHTSB parenInside] parenBot
|
|
curl ([mix SB RIGHTSB parenOutside] + O) parenMid [widths.heading 0 (OPERATORSTROKE * fatten) UPWARD]
|
|
save 'angleLeft' 0x2329
|
|
alias 'mangleLeft' 0x27E8 'angleLeft'
|
|
|
|
turned 'angleRight' 0x232A 'angleLeft' MIDDLE parenMid
|
|
alias 'mangleRight' 0x27E9 'angleRight'
|
|
|
|
dual 'dblangleLeft' 0x27EA 'angleLeft' (WIDTH * 0.35)
|
|
dual 'dblangleRight' 0x27EB 'angleRight' (WIDTH * 0.35)
|
|
|
|
sketch # ceilingLeft
|
|
include : HBarTop [mix SB RIGHTSB bracketOutside] [mix SB RIGHTSB bracketInside] parenTop
|
|
include : VBarLeft [mix SB RIGHTSB bracketOutside] parenBot parenTop
|
|
save 'ceilingLeft' 0x2308
|
|
|
|
sketch # floorLeft
|
|
include : HBarBottom [mix SB RIGHTSB bracketOutside] [mix SB RIGHTSB bracketInside] parenBot
|
|
include : VBarLeft [mix SB RIGHTSB bracketOutside] parenBot parenTop
|
|
save 'floorLeft' 0x230A
|
|
turned 'floorRight' 0x230B 'ceilingLeft' MIDDLE parenMid
|
|
turned 'ceilingRight' 0x2309 'floorLeft' MIDDLE parenMid
|
|
|
|
### 'Small Punctuations'
|
|
sketch # period
|
|
set-width WIDTH
|
|
include : Ring (PERIODSIZE - O) O (MIDDLE - PERIODRADIUS + O) (MIDDLE + PERIODRADIUS - O) true
|
|
save 'period' '.'
|
|
|
|
sketch # xhdot
|
|
set-width WIDTH
|
|
include : Ring (XH - O) (XH - PERIODSIZE + O) (MIDDLE - PERIODRADIUS + O) (MIDDLE + PERIODRADIUS - O) true
|
|
save 'xhdot'
|
|
|
|
sketch # comma
|
|
set-width WIDTH
|
|
include glyphs.period
|
|
local sw : Math.min STROKE (PERIODSIZE * 0.5)
|
|
include : dispiro
|
|
widths.rhs sw
|
|
g4 (MIDDLE + PERIODRADIUS - O) [mix O (PERIODSIZE - O) 0.5]
|
|
g4 (MIDDLE + PERIODRADIUS - O + 0.1 * TANSLANT) ([mix O (PERIODSIZE - O) 0.5] - 0.1)
|
|
quadcontrols (0.9 * TANSLANT * DESCENDER / (1.7 * PERIODRADIUS - O)) 0.5 12
|
|
g4 [mix MIDDLE (MIDDLE - PERIODRADIUS) 0.3] DESCENDER
|
|
save 'comma' ','
|
|
|
|
sketch # invertComma
|
|
set-width WIDTH
|
|
include glyphs.period
|
|
|
|
local sw : Math.min STROKE (PERIODSIZE * 0.5)
|
|
include : dispiro
|
|
widths.lhs sw
|
|
g4 (MIDDLE - PERIODRADIUS + O) [mix O (PERIODSIZE - O) 0.5]
|
|
g4 (MIDDLE - PERIODRADIUS + O + 0.1 * TANSLANT) ([mix O (PERIODSIZE - O) 0.5] - 0.1)
|
|
quadcontrols (-0.3 * TANSLANT * DESCENDER / ((1.3 + TANSLANT * 2) * PERIODRADIUS - O)) 0.5 12
|
|
g4 [mix MIDDLE (MIDDLE + PERIODRADIUS) (0.3 + TANSLANT * 2)] DESCENDER
|
|
save 'invertComma'
|
|
|
|
sketch # colon
|
|
set-width WIDTH
|
|
include glyphs.period
|
|
include glyphs.xhdot
|
|
save 'colon' ':'
|
|
save 'colon.dmid'
|
|
|
|
branch
|
|
apply-transform : Upright
|
|
apply-transform : Translate 0 (parenMid - XH / 2)
|
|
apply-transform : Italify
|
|
save 'colon.mid'
|
|
branch
|
|
local delta : Math.max 0 : WIDTH / 2 - (XH - PERIODSIZE) / 2
|
|
apply-transform : Translate delta 0
|
|
save 'colon.dright'
|
|
apply-transform : Translate (-2 * delta) 0
|
|
save 'colon.dleft'
|
|
|
|
sketch # semicolon
|
|
include glyphs.comma
|
|
include glyphs.xhdot
|
|
save 'semicolon' ';'
|
|
save 'greekquestion' 0x37E
|
|
|
|
### 'Emotion Punctuations'
|
|
local questionBottom : Math.max (CAP * 0.3) (DOTSIZE * 1.5)
|
|
|
|
define [QuestionShape top questionBottom left right] : glyph-construction
|
|
include : dispiro
|
|
widths.rhs
|
|
g4 left (top - HOOK)
|
|
hookstart (top - O)
|
|
g4 right (top - SMOOTHB * 0.9)
|
|
alsothru 0.5 0.45 [widths.center ESSQUESTION]
|
|
straight.down.end ([mix left right 0.5] - HALFSTROKE * HVCONTRAST) questionBottom [widths STROKE 0]
|
|
|
|
sketch # question
|
|
set-width WIDTH
|
|
include : QuestionShape CAP questionBottom SB RIGHTSB
|
|
include : Ring (DOTSIZE - O) O (MIDDLE - DOTRADIUS + O) (MIDDLE + DOTRADIUS - O) true
|
|
save 'question' '?'
|
|
|
|
sketch # interrobang
|
|
set-width WIDTH
|
|
local angle : 12 / 180 * Math.PI
|
|
include : QuestionShape CAP questionBottom [mix MIDDLE SB 0.75] RIGHTSB
|
|
include : Translate (-MIDDLE) (-DOTRADIUS)
|
|
include : Rotate (-2 * angle)
|
|
include : Translate MIDDLE DOTRADIUS
|
|
include : VBar MIDDLE questionBottom CAP
|
|
include : Translate (-MIDDLE) (-DOTRADIUS)
|
|
include : Rotate (1.2 * angle)
|
|
include : Translate MIDDLE DOTRADIUS
|
|
include : Ring (DOTSIZE - O) O (MIDDLE - DOTRADIUS + O) (MIDDLE + DOTRADIUS - O) true
|
|
save 'interrobang' 0x203D
|
|
|
|
sketch # dwquestion
|
|
set-width UPM
|
|
include : QuestionShape CAP questionBottom (UPM * 0.25) (UPM * 0.75)
|
|
include : Ring (DOTSIZE - O) O (UPM / 2 - DOTRADIUS + O) (UPM / 2 + DOTRADIUS - O) true
|
|
save 'dwquestion' 0xFF1F
|
|
|
|
sketch # questionDown
|
|
set-width WIDTH
|
|
include glyphs.question
|
|
include : FlipAround MIDDLE (XH / 2)
|
|
save 'questionDown' 0xBF
|
|
|
|
sketch # exclam
|
|
set-width WIDTH
|
|
include markset.capital
|
|
include : VBar MIDDLE [clamp 0 (CAP * 0.4) (questionBottom * 1.18)] CAP
|
|
include : Ring (DOTSIZE - O) O (MIDDLE - DOTRADIUS + O) (MIDDLE + DOTRADIUS - O) true
|
|
save 'exclam' '!'
|
|
|
|
sketch # exclamDown
|
|
set-width WIDTH
|
|
include glyphs.exclam
|
|
include : FlipAround MIDDLE (XH / 2)
|
|
save 'exclamDown' 0xA1
|
|
|
|
sketch # doubleexclam
|
|
local d : 0.25 * WIDTH
|
|
include glyphs.exclam
|
|
apply-transform : Translate (-d * 2) 0
|
|
include glyphs.exclam
|
|
apply-transform : Translate d 0
|
|
save 'doubleexclam' 0x203C
|
|
|
|
sketch # bar
|
|
set-width WIDTH
|
|
set currentGlyph.anchors.above {.type BASE .x MIDDLE .y parenTop}
|
|
set currentGlyph.anchors.below {.type BASE .x MIDDLE .y parenBot}
|
|
include : VBar MIDDLE parenBot parenTop
|
|
save 'bar' '|'
|
|
|
|
sketch # brokenbar
|
|
local breakDist : Math.max STROKE (CAP / 8)
|
|
include : VBar MIDDLE (parenMid + breakDist / 2) parenTop
|
|
include : VBar MIDDLE parenBot (parenMid - breakDist / 2)
|
|
save 'brokenbar' 0xA6
|
|
|
|
# Click symbols
|
|
alias 'dentalclick' 0x1C0 'bar'
|
|
dual 'alveolarlateralclick' 0x1C1 'bar' (WIDTH * 0.35)
|
|
alias 'alveolarclick' 0x1C3 'exclam'
|
|
|
|
sketch # palatoalveolarclick
|
|
include glyphs.bar AS_BASE
|
|
include : HBarBottom SB RIGHTSB (parenMid + XH * 0.1) OPERATORSTROKE
|
|
include : HBarTop SB RIGHTSB (parenMid - XH * 0.1) OPERATORSTROKE
|
|
save 'palatoalveolarclick' 0x1C2
|
|
|
|
### 'Typographic Symbols'
|
|
sketch # ampersand
|
|
set-width WIDTH
|
|
|
|
local fine : adviceBlackness 3
|
|
local p 0.875
|
|
local l 0.05
|
|
local pr [linreg 500 0.82 700 0.85 WIDTH]
|
|
local rr 0.95
|
|
local q 0.45
|
|
local r 1.1
|
|
|
|
include : dispiro
|
|
widths.rhs fine
|
|
flat (RIGHTSB - O) CAPMIDDLE [heading DOWNWARD]
|
|
curl (RIGHTSB - O) SMOOTHA
|
|
arcvh
|
|
g4 (MIDDLE + CORRECTION_OMIDX * fine) O
|
|
archv
|
|
g4 (SB + O) SMOOTHB
|
|
alsothru 0.5 0.5 [widths.center fine]
|
|
g4 [mix SB RIGHTSB p] (CAP - SMOOTHB * pr) [widths.lhs fine]
|
|
arcvh
|
|
g4 ([mix SB RIGHTSB [mix p l 0.5]] - CORRECTION_OMIDX * fine) (CAP - O)
|
|
archv
|
|
g4 [mix SB RIGHTSB l] (CAP - SMOOTHA * pr)
|
|
alsothru 0.5 0.5 [widths.center fine]
|
|
g4.down.end [mix SB RIGHTSB r] 0 [widths.heading 0 fine DOWNWARD]
|
|
save 'ampersand' '&'
|
|
|
|
sketch # at
|
|
set-width WIDTH
|
|
|
|
local top parenTop
|
|
local bot parenBot
|
|
local otop : mix bot top 0.75
|
|
local obot : mix top bot 0.8
|
|
|
|
local sw : adviceBlackness 3.5
|
|
local m1 : [mix (SB + sw) (RIGHTSB - sw) 0.47] - sw / 2
|
|
local m2 : [mix m1 RIGHTSB 0.52] + TANSLANT * sw
|
|
|
|
local sma : SMOOTHA * ((RIGHTSB - m1) / (RIGHTSB - SB) * 1.1)
|
|
local smb : SMOOTHB * ((RIGHTSB - m1) / (RIGHTSB - SB) * 1.1)
|
|
|
|
include : dispiro
|
|
widths.lhs sw
|
|
flat RIGHTSB (otop - O) [heading LEFTWARD]
|
|
curl m2 (otop - O)
|
|
archv
|
|
flat m1 (otop - sma)
|
|
curl m1 (obot + smb)
|
|
arcvh
|
|
g4 m2 (obot + O)
|
|
archv
|
|
flat RIGHTSB (obot + sma)
|
|
curl RIGHTSB (top - SMOOTHB)
|
|
arcvh
|
|
g4 (MIDDLE - CORRECTION_OMIDS) (top - O) [widths STROKE 0]
|
|
archv
|
|
flat SB (top - SMOOTHA) [widths sw 0]
|
|
curl SB (bot + SMOOTHB)
|
|
arcvh
|
|
flat (MIDDLE + CORRECTION_OMIDS) (bot + O) [widths STROKE 0 ]
|
|
curl (RIGHTSB - HALFSTROKE + TANSLANT * sw) (bot + O)
|
|
save 'at' '@'
|
|
|
|
sketch # paragraph
|
|
set-width WIDTH
|
|
local sw : adviceBlackness 3.6
|
|
include : dispiro
|
|
widths.center sw
|
|
straight.left.start (MIDDLE - sw / 4) (CAP - sw / 2) [heading LEFTWARD]
|
|
archv
|
|
g4.down.mid (SB + sw / 2) [mix (CAP * 0.5) (CAP - sw / 2) 0.5] [heading DOWNWARD]
|
|
arcvh
|
|
straight.right.end (MIDDLE - sw / 4) (CAP * 0.5) [heading RIGHTWARD]
|
|
|
|
branch
|
|
include : VBar (MIDDLE + sw / 4) 0 CAP sw
|
|
include : VBar (RIGHTSB - sw / 2) 0 CAP sw
|
|
save 'paragraph.high'
|
|
branch
|
|
include : VBar (MIDDLE + sw / 4) DESCENDER CAP sw
|
|
include : VBar (RIGHTSB - sw / 2) DESCENDER CAP sw
|
|
save 'paragraph.low'
|
|
|
|
select-variant 'paragraph' 0xB6 'high' {
|
|
.cv22 'paragraph.high'
|
|
.cv23 'paragraph.low'
|
|
}
|
|
|
|
sketch # section
|
|
local top parenTop
|
|
local bot parenBot
|
|
local sma SMOOTHA
|
|
local s : dispiro
|
|
widths.lhs
|
|
g4 RIGHTSB (top - HOOK)
|
|
hookstart top
|
|
g4 SB (top - sma)
|
|
alsothru 0.5 0.5 [widths HALFSTROKE HALFSTROKE]
|
|
g4 RIGHTSB [mix bot top 0.501] [widths 0 STROKE]
|
|
g4 RIGHTSB [mix bot top 0.5] [widths 0 STROKE]
|
|
g4 [mix SB RIGHTSB 0.6] [mix bot top : [linreg 18 0.325 108 0.3 STROKE] * (1 - TANSLANT * 0.1)]
|
|
include s
|
|
include : FlipAround MIDDLE parenMid
|
|
include s
|
|
save 'section' 0xA7
|
|
|
|
local asteriskCenterY : parenTop - LONGJUT * 1.5
|
|
|
|
foreach [{size name} : items-of {{1.2 'asterisk.high'} {0.85 'smallasterisk.high'}}] : sketch
|
|
local radius : LONGJUT * size
|
|
local fine : STROKE * 0.4
|
|
local final : 0.5 * [Math.min STROKE (radius * Math.PI * 2 / 10)]
|
|
|
|
foreach j [range 0 5] : begin
|
|
local s : Math.sin (j / 5 * Math.PI * 2)
|
|
local c : Math.cos (j / 5 * Math.PI * 2)
|
|
include : dispiro
|
|
flat MIDDLE asteriskCenterY [widths fine fine]
|
|
curl (MIDDLE + radius * s) (asteriskCenterY + radius * c) [widths final final]
|
|
save name
|
|
|
|
composite 'asterisk.low' glyphs.'asterisk.high' [Upright] [Translate 0 (parenMid - asteriskCenterY)] [Italify]
|
|
composite 'smallasterisk.low' glyphs.'smallasterisk.high' [Upright] [Translate 0 (parenMid - asteriskCenterY)] [Italify]
|
|
select-variant 'asterisk' '*' 'high' {
|
|
.cv18 'asterisk.high'
|
|
.cv19 'asterisk.low'
|
|
}
|
|
|
|
sketch # numbersign
|
|
local fine : adviceBlackness 3.5
|
|
include : HBar SB RIGHTSB [mix parenTop parenBot (1 / 3)]
|
|
include : HBar SB RIGHTSB [mix parenTop parenBot (2 / 3)]
|
|
include : VBar [mix SB RIGHTSB 0.3] (parenBot + fine) (parenTop - fine) fine
|
|
include : VBar [mix SB RIGHTSB 0.7] (parenBot + fine) (parenTop - fine) fine
|
|
save 'numbersign' '#'
|
|
|
|
sketch # slash
|
|
local cor : HVCONTRAST / [Math.sqrt (1 - [Math.pow ((RIGHTSB - SB - STROKE) / (parenTop - parenBot)) 2])]
|
|
start-from SB parenBot
|
|
line-to (SB + STROKE * cor) parenBot
|
|
line-to RIGHTSB parenTop
|
|
line-to (RIGHTSB - STROKE * cor) parenTop
|
|
reverse-last
|
|
save 'slash' '/'
|
|
|
|
sketch # backslash
|
|
local width : (RIGHTSB - SB) * (1 + TANSLANT * 2)
|
|
local cor : HVCONTRAST / [Math.sqrt (1 - [Math.pow ((width - STROKE) / (parenTop - parenBot)) 2])]
|
|
start-from (MIDDLE - width / 2) parenTop
|
|
line-to (MIDDLE - width / 2 + STROKE * cor) parenTop
|
|
line-to (MIDDLE + width / 2) parenBot
|
|
line-to (MIDDLE + width / 2 - STROKE * cor) parenBot
|
|
reverse-last
|
|
save 'backslash' "\\"
|
|
alias 'solidus' 0x2044 'slash'
|
|
|
|
|
|
### 'Dashes'
|
|
sketch # underscore.high
|
|
set-width WIDTH
|
|
include : HBarBottom SB RIGHTSB 0
|
|
save 'underscore.high'
|
|
|
|
composite 'underscore.low' glyphs.'underscore.high' [Upright] [Translate 0 (DESCENDER * 0.9)] [Italify]
|
|
select-variant 'underscore' '_' 'high' {
|
|
.cv20 'underscore.high'
|
|
.cv21 'underscore.low'
|
|
}
|
|
|
|
sketch # overline
|
|
include : HBarTop SB RIGHTSB CAP
|
|
save 'overline' 0x203E
|
|
|
|
sketch # hyphen
|
|
set-width WIDTH
|
|
include : HBar SB RIGHTSB parenMid
|
|
save 'hyphen' '-'
|
|
|
|
sketch # softhyphen
|
|
include glyphs.hyphen AS_BASE
|
|
save 'softhyphen' 0xAD
|
|
alias 'gpHyphen' 0x2010 'hyphen'
|
|
alias 'nbHyphen' 0x2011 'hyphen'
|
|
alias 'figureDash' 0x2012 'hyphen'
|
|
alias 'enDash' 0x2013 'hyphen'
|
|
|
|
sketch # emDash
|
|
set-width FULLWIDTH
|
|
include : HBar 0 FULLWIDTH parenMid
|
|
save 'emDash' 0x2014
|
|
|
|
sketch # doubleEmDash
|
|
set-width (FULLWIDTH * 2)
|
|
include : HBar 0 (FULLWIDTH * 2) parenMid
|
|
save 'doubleEmDash'
|
|
|
|
alias 'horizontalBar' 0x2015 'emDash'
|
|
|
|
|
|
### 'Interpuncts'
|
|
sketch # interpunct
|
|
set-width FULLWIDTH
|
|
include : Ring (parenMid + PERIODRADIUS - O) (parenMid - PERIODRADIUS + O) (FWMIDDLE - PERIODRADIUS + O) (FWMIDDLE + PERIODRADIUS - O) true
|
|
save 'interpunct' 0xB7
|
|
alias 'bullet' 0x2022 'interpunct'
|
|
alias 'hyphenpoint' 0x2027 'interpunct'
|
|
alias 'greekbullet' 0x387 'interpunct'
|
|
|
|
sketch # whitebullet
|
|
set-width FULLWIDTH
|
|
local s : [adviceBlackness 5] * 0.75
|
|
include : Ring (parenMid + PERIODRADIUS - O) (parenMid - PERIODRADIUS + O) (FWMIDDLE - PERIODRADIUS + O) (FWMIDDLE + PERIODRADIUS - O) true
|
|
include : Ring (parenMid + PERIODRADIUS - O - s) (parenMid - PERIODRADIUS + O + s) (FWMIDDLE - PERIODRADIUS + O + s) (FWMIDDLE + PERIODRADIUS - O - s) true
|
|
reverse-last
|
|
save 'whitebullet' 0x25E6
|
|
|
|
|
|
### 'Quotes and Primes'
|
|
local quoteTop (CAP * 1.05)
|
|
local quoteBottom (XH * 0.85)
|
|
|
|
sketch # singleQuote
|
|
set-width WIDTH
|
|
|
|
include : dispiro
|
|
widths.center (STROKE * 1.1)
|
|
g4.down.start MIDDLE quoteTop [heading DOWNWARD]
|
|
g4 MIDDLE quoteBottom [widths.heading (HALFSTROKE * 0.95) (HALFSTROKE * 0.95) DOWNWARD]
|
|
save 'singleQuote' 0x27
|
|
|
|
sketch # doubleQuote
|
|
set-width WIDTH
|
|
|
|
local dist : 0.2 * WIDTH
|
|
include glyphs.singleQuote
|
|
apply-transform : Translate (-dist * 2) 0
|
|
include glyphs.singleQuote
|
|
apply-transform : Translate dist 0
|
|
save 'doubleQuote' 0x22
|
|
|
|
local yCurlyQuotes [mix quoteBottom quoteTop 0.5]
|
|
local commaLow (DESCENDER * 0.9)
|
|
local ratio : Math.min 1 : (quoteTop - quoteBottom) / (PERIODSIZE - commaLow)
|
|
|
|
sketch # lowSingleQuote
|
|
include glyphs.comma
|
|
include : FlipAround MIDDLE 0 ratio ratio
|
|
save 'lowSingleQuote'
|
|
|
|
sketch # openSingleQuote
|
|
include glyphs.lowSingleQuote
|
|
include : FlipAround MIDDLE [mix [mix PERIODSIZE commaLow 0.5] yCurlyQuotes 0.5]
|
|
save 'openSingleQuote'
|
|
|
|
sketch # closeSingleQuote
|
|
include glyphs.openSingleQuote
|
|
include : FlipAround MIDDLE yCurlyQuotes
|
|
save 'closeSingleQuote'
|
|
|
|
sketch # revertSingleQuote
|
|
include glyphs.invertComma
|
|
include : FlipAround MIDDLE 0 ratio ratio
|
|
include : FlipAround MIDDLE [mix [mix PERIODSIZE commaLow 0.5] yCurlyQuotes 0.5]
|
|
include : FlipAround MIDDLE yCurlyQuotes
|
|
save 'revertSingleQuote'
|
|
|
|
sketch # lowDoubleQuote
|
|
local dist : WIDTH * 0.225
|
|
include glyphs.lowSingleQuote
|
|
apply-transform : Translate (-dist * 2) 0
|
|
include glyphs.lowSingleQuote
|
|
apply-transform : Translate dist 0
|
|
save 'lowDoubleQuote'
|
|
|
|
sketch # openDoubleQuote
|
|
include glyphs.lowDoubleQuote
|
|
include : FlipAround MIDDLE [mix [mix PERIODSIZE commaLow 0.5] yCurlyQuotes 0.5]
|
|
save 'openDoubleQuote'
|
|
|
|
sketch # closeDoubleQuote
|
|
include glyphs.openDoubleQuote
|
|
include : FlipAround MIDDLE yCurlyQuotes
|
|
save 'closeDoubleQuote'
|
|
|
|
sketch # revertDoubleQuote
|
|
local dist : WIDTH * 0.225
|
|
include glyphs.revertSingleQuote
|
|
apply-transform : Translate (-dist * 2) 0
|
|
include glyphs.revertSingleQuote
|
|
apply-transform : Translate dist 0
|
|
save 'revertDoubleQuote'
|
|
|
|
fwr nothing 0x201A 'lowSingleQuote'
|
|
fwr nothing 0x2018 'openSingleQuote'
|
|
fwl nothing 0x2019 'closeSingleQuote'
|
|
fwr nothing 0x201B 'revertSingleQuote'
|
|
fwr nothing 0x201E 'lowDoubleQuote'
|
|
fwr nothing 0x201C 'openDoubleQuote'
|
|
fwl nothing 0x201D 'closeDoubleQuote'
|
|
fwr nothing 0x201F 'revertDoubleQuote'
|
|
|
|
sketch # prime
|
|
local wide : WIDTH * 0.1
|
|
include : dispiro
|
|
widths.center (STROKE * 1.2)
|
|
flat (MIDDLE + wide) quoteTop [heading DOWNWARD]
|
|
curl (MIDDLE - wide) quoteBottom [widths.heading HALFSTROKE HALFSTROKE DOWNWARD]
|
|
save 'prime' 0x2032
|
|
|
|
sketch # doubleprime
|
|
local d : 0.25 * (RIGHTSB - SB)
|
|
include glyphs.prime
|
|
apply-transform : Translate (-d * 2) 0
|
|
include glyphs.prime
|
|
apply-transform : Translate d 0
|
|
save 'doubleprime' 0x2033
|
|
|
|
sketch # tripleprime
|
|
local wide : WIDTH * 0.1
|
|
local d : WIDTH * 0.3
|
|
local fine : 0.5 * [adviceBlackness 3.5]
|
|
include : dispiro
|
|
widths.center (fine * 2 * 1.2)
|
|
flat (MIDDLE + wide) quoteTop [heading DOWNWARD]
|
|
curl (MIDDLE - wide) quoteBottom [widths.heading fine fine DOWNWARD]
|
|
include : dispiro
|
|
widths.center (fine * 2 * 1.2)
|
|
flat (MIDDLE - d + wide) quoteTop [heading DOWNWARD]
|
|
curl (MIDDLE - d - wide) quoteBottom [widths.heading fine fine DOWNWARD]
|
|
include : dispiro
|
|
widths.center (fine * 2 * 1.2)
|
|
flat (MIDDLE + d + wide) quoteTop [heading DOWNWARD]
|
|
curl (MIDDLE + d - wide) quoteBottom [widths.heading fine fine DOWNWARD]
|
|
save 'tripleprime' 0x2034
|
|
|
|
sketch # revprime
|
|
local wide : -WIDTH * 0.1
|
|
include : dispiro
|
|
widths.center (STROKE * 1.2)
|
|
flat (MIDDLE + wide) quoteTop [heading DOWNWARD]
|
|
curl (MIDDLE - wide) quoteBottom [widths.heading HALFSTROKE HALFSTROKE DOWNWARD]
|
|
save 'revprime' 0x2035
|
|
|
|
sketch # revdoubleprime
|
|
local d : 0.25 * (RIGHTSB - SB)
|
|
include glyphs.revprime
|
|
apply-transform : Translate (-d * 2) 0
|
|
include glyphs.revprime
|
|
apply-transform : Translate d 0
|
|
save 'revdoubleprime' 0x2036
|
|
|
|
sketch # revtripleprime
|
|
local wide : -WIDTH * 0.1
|
|
local d : WIDTH * 0.3
|
|
local fine : 0.5 * [adviceBlackness 3.5]
|
|
include : dispiro
|
|
widths.center (fine * 2 * 1.2)
|
|
flat (MIDDLE + wide) quoteTop [heading DOWNWARD]
|
|
curl (MIDDLE - wide) quoteBottom [widths.heading fine fine DOWNWARD]
|
|
include : dispiro
|
|
widths.center (fine * 2 * 1.2)
|
|
flat (MIDDLE - d + wide) quoteTop [heading DOWNWARD]
|
|
curl (MIDDLE - d - wide) quoteBottom [widths.heading fine fine DOWNWARD]
|
|
include : dispiro
|
|
widths.center (fine * 2 * 1.2)
|
|
flat (MIDDLE + d + wide) quoteTop [heading DOWNWARD]
|
|
curl (MIDDLE + d - wide) quoteBottom [widths.heading fine fine DOWNWARD]
|
|
save 'revtripleprime' 0x2037
|
|
|
|
sketch # singleGuillemetLeft
|
|
local top : mix parenMid parenTop 0.5
|
|
local bot : mix parenMid parenBot 0.5
|
|
local extension 0.55
|
|
local cor 1
|
|
|
|
local sw : adviceBlackness 3.5
|
|
|
|
include : dispiro
|
|
widths.center sw
|
|
g4 [mix MIDDLE RIGHTSB extension] top
|
|
quadcontrols 0.4 0.75
|
|
g4 [mix MIDDLE SB extension] [mix top bot 0.5] [widths.center.heading (cor * sw) LEFTWARD]
|
|
|
|
include : dispiro
|
|
widths.center (sw * cor)
|
|
g4 [mix MIDDLE SB extension] [mix top bot 0.5] [heading RIGHTWARD]
|
|
quadcontrols (1 - 0.4) (1 - 0.75)
|
|
g4 [mix MIDDLE RIGHTSB extension] bot [widths.center sw]
|
|
|
|
apply-transform : Translate (-(RIGHTSB - SB) * 0.05) 0
|
|
save 'singleGuillemetLeft' 0x2039
|
|
|
|
sketch # guillemetLeft
|
|
include glyphs.singleGuillemetLeft
|
|
apply-transform : Translate ((RIGHTSB - SB) * 0.5) 0
|
|
include glyphs.singleGuillemetLeft
|
|
apply-transform : Translate (-(RIGHTSB - SB) * 0.25) 0
|
|
save 'guillemetLeft' 0xAB
|
|
|
|
sketch # singleGuillemetRight
|
|
include glyphs.singleGuillemetLeft
|
|
include : FlipAround MIDDLE parenMid
|
|
save 'singleGuillemetRight' 0x203A
|
|
|
|
sketch # guillemetRight
|
|
include glyphs.guillemetLeft
|
|
include : FlipAround MIDDLE parenMid
|
|
save 'guillemetRight' 0xBB
|
|
|
|
|
|
### 'Daggers'
|
|
sketch # dagger
|
|
include : HBar SB RIGHTSB [mix parenTop parenBot 0.33]
|
|
include : VBar MIDDLE parenBot parenTop
|
|
|
|
save 'dagger' 0x2020
|
|
|
|
sketch # doubledagger
|
|
include glyphs.dagger
|
|
include : HBar SB RIGHTSB [mix parenTop parenBot 0.67]
|
|
save 'doubledagger' 0x2021
|
|
|
|
### 'Ellipsis'
|
|
sketch # onedotLeader
|
|
set-width FULLWIDTH
|
|
local radius : linreg WIDTH (0.5 * [adviceBlackness 3.25] * PERIODSIZE / DOTSIZE) UPM PERIODRADIUS FULLWIDTH
|
|
include : Ring (radius * 2 - O) O (FULLWIDTH / 2 - radius + O) (FULLWIDTH / 2 + radius - O) true
|
|
save 'onedotLeader' 0x2024
|
|
|
|
sketch # twodotsLEader
|
|
set-width FULLWIDTH
|
|
local radius : linreg WIDTH (0.5 * [adviceBlackness 3.25] * PERIODSIZE / DOTSIZE) UPM PERIODRADIUS FULLWIDTH
|
|
local left : mix 0 FULLWIDTH (1 / 4)
|
|
local right : mix 0 FULLWIDTH (3 / 4)
|
|
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 'twodotsLEader' 0x2025
|
|
|
|
sketch # ellipsis
|
|
set-width FULLWIDTH
|
|
local radius : linreg WIDTH (0.5 * [adviceBlackness 3.25] * PERIODSIZE / DOTSIZE) UPM PERIODRADIUS FULLWIDTH
|
|
local left : mix 0 FULLWIDTH (1 / 6)
|
|
local right : mix 0 FULLWIDTH (5 / 6)
|
|
include : Ring (radius * 2 - O) O (left - radius + O) (left + radius - O) true
|
|
include : Ring (radius * 2 - O) O (FULLWIDTH / 2 - radius + O) (FULLWIDTH / 2 + radius - O) true
|
|
include : Ring (radius * 2 - O) O (right - radius + O) (right + radius - O) true
|
|
save 'ellipsis' 0x2026
|
|
|
|
### 'Percentages'
|
|
sketch # percent
|
|
set-width WIDTH
|
|
local dotwidth ([adviceBlackness 4] * 1.5)
|
|
local cor : HVCONTRAST / [Math.sqrt (1 - [Math.pow ((RIGHTSB - SB - STROKE) / (CAP - 0)) 2])]
|
|
|
|
start-from SB 0
|
|
line-to (SB + STROKE * cor) 0
|
|
line-to RIGHTSB CAP
|
|
line-to (RIGHTSB - STROKE * cor) CAP
|
|
|
|
include : VBarLeft SB [mix CAP 0 0.3] CAP dotwidth
|
|
include : VBarRight RIGHTSB 0 [mix 0 CAP 0.3] dotwidth
|
|
save 'percent' '%'
|
|
|
|
sketch # permille
|
|
local dotwidth ([adviceBlackness 4] * 1.5)
|
|
|
|
include : dispiro
|
|
widths.center
|
|
flat SB (CAP * 0.2)
|
|
curl [mix SB RIGHTSB 0.85] (CAP * 0.9)
|
|
|
|
include : VBarLeft [mix SB RIGHTSB 0.075] [mix CAP 0 0.3] CAP dotwidth
|
|
include : VBarRight RIGHTSB 0 [mix 0 CAP 0.3] dotwidth
|
|
include : VBarRight (RIGHTSB - [Math.max (WIDTH * 0.25) (dotwidth * 1.5)]) 0 [mix 0 CAP 0.3] dotwidth
|
|
save 'permille' 0x2030
|
|
|
|
sketch # basepoint
|
|
local dotwidth ([adviceBlackness 4] * 1.5)
|
|
local dotfine [adviceBlackness 3.5]
|
|
|
|
include : dispiro
|
|
widths.center
|
|
flat SB (CAP * 0.2)
|
|
curl [mix SB RIGHTSB 0.85] (CAP * 0.9)
|
|
|
|
include : VBarLeft SB [mix CAP 0 0.3] CAP dotwidth
|
|
include : VBarRight RIGHTSB 0 [mix 0 CAP 0.3] dotfine
|
|
include : VBar [mix [mix SB RIGHTSB 0.1] RIGHTSB 0.5] 0 [mix 0 CAP 0.3] dotfine
|
|
include : VBarLeft [mix SB RIGHTSB 0.1] 0 [mix 0 CAP 0.3] dotfine
|
|
save 'basepoint' 0x2031
|
|
|
|
### "ASCII Marks"
|
|
local MarkZoom : glyph-construction
|
|
apply-transform : Upright
|
|
apply-transform : Translate (-MIDDLE) (-XH - ACCENT)
|
|
apply-transform : Scale ((RIGHTSB - SB) / (markExtend * 3))
|
|
apply-transform : Translate (MIDDLE) (XH + ACCENT)
|
|
apply-transform : Italify
|
|
|
|
composite 'asciitilde.low' glyphs.'asciitilde.high' [Upright] [Translate 0 (parenMid - XH - ACCENT)] [Italify]
|
|
select-variant 'asciitilde' '~' 'low' {
|
|
.cv16 'asciitilde.high'
|
|
.cv17 'asciitilde.low'
|
|
}
|
|
|
|
composite 'degree' glyphs.space glyphs.ringAbove MarkZoom [into-unicode 0xB0]
|
|
|
|
alias 'mdfPrime' 0x2B9 'prime'
|
|
alias 'mdfDoublePrime' 0x2BA 'doubleprime'
|
|
alias 'mdfTurncomma' 0x2BB 'openSingleQuote'
|
|
alias 'mdfApostrophe' 0x2BC 'closeSingleQuote'
|
|
alias 'mdfRevComma' 0x2BD 'revertSingleQuote'
|
|
alias 'mdfStress' 0x2C8 'singleQuote'
|
|
turned 'mdfSecondaryStress' 0x2CC 'singleQuote' MIDDLE (XH / 2)
|
|
|
|
|
|
### 'Double-width punctuations' : if (para.spacing > 0) : begin
|
|
dwc nothing 0xFF01 'exclam'
|
|
dwc nothing 0xFF1A 'colon'
|
|
dwc nothing 0xFF1B 'semicolon'
|
|
dwl nothing 0xFF0C 'comma'
|
|
dwl nothing 0xFF0E 'period'
|
|
dwr nothing 0xFF08 'parenLeft'
|
|
dwl nothing 0xFF09 'parenRight'
|
|
|
|
local r : Math.max PERIODRADIUS (WIDTH * 0.225)
|
|
local ry : r * 0.25
|
|
sketch
|
|
include : CircleDotAt MIDDLE ry (r + PERIODRADIUS * 0.5)
|
|
include : CircleDotAt MIDDLE ry (r - PERIODRADIUS * 0.4)
|
|
reverse-last
|
|
branch
|
|
set-width FULLWIDTH1
|
|
save "dwlcjkperiod" 0x3002
|
|
branch
|
|
save 'cjkperiod' 0xFF61
|
|
sketch
|
|
local k 0.9
|
|
include : dispiro
|
|
widths.center
|
|
g4 (MIDDLE - r * 1.1) (ry + r * (k - 0.2))
|
|
quadcontrols 0.5 0.45
|
|
g4 (MIDDLE + r) (ry + r * (-k - 0.35))
|
|
branch
|
|
set-width FULLWIDTH1
|
|
save "dwlcjkcomma" 0x3001
|
|
branch
|
|
save 'cjkcomma' 0xFF64
|
|
|
|
local bracketOutside 0.05
|
|
local bracketInside 0.95
|
|
local cjkqd 0.75
|
|
local cjkqd2 0.97
|
|
local ideotop : para.ideoMid + (parenTop - parenMid)
|
|
local ideobot : para.ideoMid - (parenTop - parenMid)
|
|
sketch # cjkSingleQuoteLeft
|
|
include : HBarTop [mix SB RIGHTSB bracketOutside] [mix SB RIGHTSB bracketInside] [mix ideobot ideotop cjkqd2]
|
|
include : VBarLeft [mix SB RIGHTSB bracketOutside] [mix ideotop ideobot cjkqd] [mix ideobot ideotop cjkqd2]
|
|
save 'cjkSingleQuoteLeft' 0xFF62
|
|
sketch # cjkSingleQuoteRight
|
|
include glyphs.cjkSingleQuoteLeft
|
|
include : FlipAround MIDDLE parenMid
|
|
save 'cjkSingleQuoteRight' 0xFF63
|
|
|
|
sketch # cjkDoubleQuoteLeft
|
|
local sw : adviceBlackness 6
|
|
local dw : [Math.max (WIDTH * 0.175) [adviceBlackness 3.25]] + sw * 2
|
|
local outside : mix SB RIGHTSB bracketOutside
|
|
local inside : mix SB RIGHTSB bracketInside
|
|
local top : mix ideobot ideotop cjkqd2
|
|
local bottom : mix ideotop ideobot cjkqd
|
|
|
|
include : VBarLeft outside bottom top sw
|
|
include : HBarTop outside inside top sw
|
|
include : VBarRight inside top (top - dw) sw
|
|
include : HBarBottom outside (outside + dw) bottom sw
|
|
include : VBarRight (outside + dw) bottom (top - dw + sw) sw
|
|
include : HBarBottom (outside + dw) inside (top - dw) sw
|
|
save 'cjkDoubleQuoteLeft'
|
|
sketch # cjkSingleQuoteRight
|
|
include glyphs.cjkDoubleQuoteLeft
|
|
include : FlipAround MIDDLE parenMid
|
|
save 'cjkDoubleQuoteRight'
|
|
|
|
dwr nothing 0x300C 'cjkSingleQuoteLeft'
|
|
dwl nothing 0x300D 'cjkSingleQuoteRight'
|
|
dwr nothing 0x300E 'cjkDoubleQuoteLeft'
|
|
dwl nothing 0x300F 'cjkDoubleQuoteRight' |