diff --git a/changes/31.1.0.md b/changes/31.1.0.md index 29bcbff80..a072d17b5 100644 --- a/changes/31.1.0.md +++ b/changes/31.1.0.md @@ -1,4 +1,5 @@ * Add separate variant selectors for Cyrillic Capital En/Er (`VXAA`, `VXAB`). +* Add variant selectors for Greek lower Beta/Gamma/Nu/Upsilon (`VXAC`, `VXAD`, `VXAE`, `VXAF`). * Optimize glyph for VERTICAL LINE WITH MIDDLE DOT (`U+2327`). * Improve `k` (`cv46`) and `x` (`cv58`) variants used by `ss03`, `ss08`, `ss09`, `ss10`, `ss12`, `ss14`, and `ss18` under slab italic. * Add characters: diff --git a/packages/font-glyphs/src/letter/greek/lower-gamma.ptl b/packages/font-glyphs/src/letter/greek/lower-gamma.ptl index 14f2eb4ab..bd7a81bea 100644 --- a/packages/font-glyphs/src/letter/greek/lower-gamma.ptl +++ b/packages/font-glyphs/src/letter/greek/lower-gamma.ptl @@ -9,8 +9,17 @@ glyph-block Letter-Greek-Lower-Gamma : begin glyph-block-import Common-Derivatives glyph-block-import Letter-Blackboard : BBS BBD BBBarLeft + create-glyph 'grek/gamma.straight' : glyph-proc + include : MarkSet.p + include : refer-glyph "v.straightSerifless" + include : VBar.m Middle Descender HalfStroke - create-glyph 'grek/gamma' 0x3B3 : glyph-proc + create-glyph 'grek/gamma.curly' : glyph-proc + include : MarkSet.p + include : refer-glyph "v.curlySerifless" + include : VBar.m Middle Descender HalfStroke + + create-glyph 'grek/gamma.casual' : glyph-proc include : MarkSet.p local xMid : [mix SB RightSB 0.46] + [HSwToV HalfStroke] @@ -28,6 +37,8 @@ glyph-block Letter-Greek-Lower-Gamma : begin quadControls 0 0.3 6 g4 xMid 0 [widths.rhs : Stroke * 0.9] + select-variant 'grek/gamma' 0x3B3 + create-glyph 'mathbb/grek/gamma' 0x213D : glyph-proc include : MarkSet.p diff --git a/packages/font-glyphs/src/letter/greek/lower-nu.ptl b/packages/font-glyphs/src/letter/greek/lower-nu.ptl index a704db66e..9f2801d78 100644 --- a/packages/font-glyphs/src/letter/greek/lower-nu.ptl +++ b/packages/font-glyphs/src/letter/greek/lower-nu.ptl @@ -8,7 +8,10 @@ glyph-block Letter-Greek-Lower-Nu : begin glyph-block-import CommonShapes glyph-block-import Common-Derivatives - create-glyph 'grek/nu' 0x3BD : glyph-proc + alias 'grek/nu.straight' null 'v.straightSerifless' + alias 'grek/nu.curly' null 'v.curlySerifless' + + create-glyph 'grek/nu.casual' : glyph-proc include : MarkSet.e local xmid : Middle + HalfStroke * 0.75 include : dispiro @@ -21,3 +24,5 @@ glyph-block Letter-Greek-Lower-Nu : begin curl RightSB (XH * 0.9) [heading Downward] quadControls 0 0.3 6 g4 xmid 0 + + select-variant 'grek/nu' 0x3BD diff --git a/packages/font-glyphs/src/letter/greek/lower-upsilon.ptl b/packages/font-glyphs/src/letter/greek/lower-upsilon.ptl index cdba65572..136edd237 100644 --- a/packages/font-glyphs/src/letter/greek/lower-upsilon.ptl +++ b/packages/font-glyphs/src/letter/greek/lower-upsilon.ptl @@ -2,6 +2,7 @@ $$include '../../meta/macros.ptl' import [mix linreg clamp fallback] from "@iosevka/util" import [DesignParameters] from "../../meta/aesthetics.mjs" +import [MathSansSerif] from "@iosevka/glyph/relation" glyph-module @@ -9,7 +10,10 @@ glyph-block Letter-Greek-Lower-Upsilon : begin glyph-block-import CommonShapes glyph-block-import Common-Derivatives - define [LowerUpsilonShape] : with-params [k top ada adb [sw Stroke]] : glyph-proc + alias 'grek/upsilon.straightSerifless' null 'u.toothlessRoundedSerifless' + alias 'grek/upsilon.straightSerifed' null 'u.toothlessRoundedMotionSerifed' + + define [LowerUpsilonCasualShape] : with-params [k top ada adb [sw Stroke]] : glyph-proc define xArcRight : RightSB - OX define yArcRight : [mix 0 top 0.6] - sw * (0.2 + TanSlope) define xArcEnd : [mix SB RightSB 0.82] + sw * 0.375 @@ -22,8 +26,11 @@ glyph-block Letter-Greek-Lower-Upsilon : begin g4 xArcRight yArcRight g4 xArcEnd yArcEnd - create-glyph 'grek/upsilon' 0x3C5 : glyph-proc + create-glyph 'grek/upsilon.casualSerifless' : glyph-proc include : MarkSet.e - include : LowerUpsilonShape 0.5 XH SmallArchDepthA SmallArchDepthB - if SLAB : include : HSerif.lt SB XH SideJut + include : LowerUpsilonCasualShape 0.5 XH SmallArchDepthA SmallArchDepthB + derive-composites 'grek/upsilon.casualSerifed' null 'grek/upsilon.casualSerifless' : HSerif.lt SB XH SideJut + + select-variant 'grek/upsilon' 0x3C5 + link-reduced-variant 'grek/upsilon/sansSerif' 'grek/upsilon' MathSansSerif diff --git a/packages/font-glyphs/src/letter/latin/upper-b.ptl b/packages/font-glyphs/src/letter/latin/upper-b.ptl index a67a916ca..7850bf13b 100644 --- a/packages/font-glyphs/src/letter/latin/upper-b.ptl +++ b/packages/font-glyphs/src/letter/latin/upper-b.ptl @@ -186,8 +186,6 @@ glyph-block Letter-Latin-Upper-B : begin alias 'cyrl/Ve' 0x412 'B' select-variant 'BBar' - select-variant 'smcpBBar' 0x1D03 - select-variant 'Bhookleft' 0x181 define [CursiveCyrveShape top] : glyph-proc @@ -220,11 +218,9 @@ glyph-block Letter-Latin-Upper-B : begin include : MarkSet.b include : CursiveCyrveShape Ascender - select-variant 'cyrl/ve' 0x432 - select-variant 'smcpB' 0x299 (shapeFrom -- 'cyrl/ve') - - alias 'grek/betaSymbol' 0x3D0 'cyrl/ve.cursiveTall' - alias 'cyrl/ve.BGR' null 'cyrl/ve.cursiveTall' + select-variant 'cyrl/ve' 0x432 + select-variant 'smcpB' 0x299 (shapeFrom -- 'cyrl/ve') + select-variant 'smcpBBar' 0x1D03 create-glyph 'mathbb/B' 0x1D539 : glyph-proc include : MarkSet.capital @@ -237,7 +233,7 @@ glyph-block Letter-Latin-Upper-B : begin VBar.r ([mix SB RightSB BArcMix] - BBD - OX * 2) (CAP * BBarPos) CAP BBS VBar.l (SB + BBD) 0 CAP BBS - create-glyph 'grek/beta' 0x3B2 : glyph-proc + create-glyph 'grek/beta.standard' : glyph-proc include : MarkSet.bp include : LeaningAnchor.Below.VBar.l SB define pBar 0.55 @@ -265,7 +261,13 @@ glyph-block Letter-Latin-Upper-B : begin arch.rhs 0 (swAfter -- ShoulderFine) g4.up.end (SB + HVContrast * (Stroke - ShoulderFine)) adb [widths.rhs ShoulderFine] - derive-composites 'latn/beta' 0xA7B5 'grek/beta' + alias 'grek/beta.cursive' null 'cyrl/ve.cursiveTall' + select-variant 'grek/beta' 0x3B2 + + alias 'grek/betaSymbol' 0x3D0 'cyrl/ve.cursiveTall' + alias 'cyrl/ve.BGR' null 'cyrl/ve.cursiveTall' + + derive-composites 'latn/beta' 0xA7B5 'grek/beta.standard' if SLAB [SerifFrame.fromDf [DivFrame 1] XH Descender].lb.fullSide [no-shape] create-glyph 'cyrl/veRounded' 0x1C80 : glyph-proc diff --git a/params/variants.toml b/params/variants.toml index bec940d05..f2d303908 100644 --- a/params/variants.toml +++ b/params/variants.toml @@ -5438,6 +5438,24 @@ selectorAffix."grek/alpha/sansSerif" = "tailed" +[prime.lower-beta] +sampler = "β" +samplerExplain = "Greek lower Beta" +nonBreakingTagForNewVariantSelector = "VXAC" # REMOVE IN NEXT MAJOR VERSION CHANGE +tagKind = "letter" + +[prime.lower-beta.variants.standard] +rank = 1 +description = "Greek lower Beta (`β`) with standard shape" +selector."grek/beta" = "standard" + +[prime.lower-beta.variants.cursive] +rank = 2 +description = "Greek lower Beta (`β`) with cursive shape" +selector."grek/beta" = "cursive" + + + [prime.capital-gamma] sampler = "Γ" samplerExplain = "Greek capital Gamma" @@ -5445,7 +5463,7 @@ tagKind = "letter" [prime.capital-gamma.variants.serifless] rank = 1 -description = "Standard capital Gamma (`Γ`) without serifs" +description = "Greek capital Gamma (`Γ`) without serifs" selector."grek/Gamma" = "serifless" selector."grek/Gamma/sansSerif" = "serifless" selector."grek/Digamma" = "serifless" @@ -5459,7 +5477,7 @@ selector."cyrl/enghe/ghePart" = "serifless" [prime.capital-gamma.variants.top-right-serifed] rank = 2 -description = "Standard capital Gamma (`Γ`) with serifs at top right" +description = "Greek capital Gamma (`Γ`) with serifs at top right" selector."grek/Gamma" = "topRightSerifed" selector."grek/Gamma/sansSerif" = "serifless" selector."grek/Digamma" = "topRightSerifed" @@ -5473,7 +5491,7 @@ selector."cyrl/enghe/ghePart" = "topRightSerifed" [prime.capital-gamma.variants.bottom-serifed] rank = 3 -description = "Standard capital Gamma (`Γ`) with bottom serif" +description = "Greek capital Gamma (`Γ`) with bottom serif" selector."grek/Gamma" = "bottomSerifed" selector."grek/Gamma/sansSerif" = "serifless" selector."grek/Digamma" = "bottomSerifed" @@ -5487,7 +5505,7 @@ selector."cyrl/enghe/ghePart" = "serifless" [prime.capital-gamma.variants.serifed] rank = 4 -description = "Standard capital Gamma (`Γ`) with motion serifs at top and bottom" +description = "Greek capital Gamma (`Γ`) with motion serifs at top and bottom" selector."grek/Gamma" = "serifed" selector."grek/Gamma/sansSerif" = "serifless" selector."grek/Digamma" = "serifed" @@ -5501,6 +5519,29 @@ selector."cyrl/enghe/ghePart" = "topRightSerifed" +[prime.lower-gamma] +sampler = "γ" +samplerExplain = "Greek lower Gamma" +nonBreakingTagForNewVariantSelector = "VXAD" # REMOVE IN NEXT MAJOR VERSION CHANGE +tagKind = "letter" + +[prime.lower-gamma.variants.straight] +rank = 1 +description = "Greek lower Gamma (`γ`) with straight shape" +selector."grek/gamma" = "straight" + +[prime.lower-gamma.variants.curly] +rank = 2 +description = "Greek lower Gamma (`γ`) with curly shape" +selector."grek/gamma" = "curly" + +[prime.lower-gamma.variants.casual] +rank = 3 +description = "Greek lower Gamma (`γ`) with casual shape" +selector."grek/gamma" = "casual" + + + [prime.capital-delta] sampler = "Δ" samplerExplain = "Greek capital Delta (`Δ`)" @@ -5784,6 +5825,29 @@ selectorAffix."grek/mu/sansSerif" = "serifless" +[prime.lower-nu] +sampler = "ν" +samplerExplain = "Greek lower Nu" +nonBreakingTagForNewVariantSelector = "VXAE" # REMOVE IN NEXT MAJOR VERSION CHANGE +tagKind = "letter" + +[prime.lower-nu.variants.straight] +rank = 1 +description = "Greek lower Nu (`ν`) with straight shape" +selector."grek/nu" = "straight" + +[prime.lower-nu.variants.curly] +rank = 2 +description = "Greek lower Nu (`ν`) with curly shape" +selector."grek/nu" = "curly" + +[prime.lower-nu.variants.casual] +rank = 3 +description = "Greek lower Nu (`ν`) with casual shape" +selector."grek/nu" = "casual" + + + [prime.lower-xi] sampler = "ξ" samplerExplain = "Greek lower Xi" @@ -5866,6 +5930,46 @@ selector."grek/tau/tailed" = "tau/semiTailed" +[prime.lower-upsilon] +sampler = "υ" +samplerExplain = "Greek lower Upsilon" +nonBreakingTagForNewVariantSelector = "VXAF" # REMOVE IN NEXT MAJOR VERSION CHANGE +tagKind = "letter" + +[prime.lower-upsilon.variants-buildup] +entry = "body" +descriptionLeader = "Greek lower Upsilon (`υ`)" + +[prime.lower-upsilon.variants-buildup.stages.body."*"] +next = "serifs" + +[prime.lower-upsilon.variants-buildup.stages.body.straight] +rank = 1 +descriptionAffix = "straight shape" +selectorAffix."grek/upsilon" = "straight" +selectorAffix."grek/upsilon/sansSerif" = "straight" + +[prime.lower-upsilon.variants-buildup.stages.body.casual] +rank = 2 +descriptionAffix = "casual shape" +selectorAffix."grek/upsilon" = "casual" +selectorAffix."grek/upsilon/sansSerif" = "casual" + +[prime.lower-upsilon.variants-buildup.stages.serifs.serifless] +rank = 1 +descriptionAffix = "serifs" +descriptionJoiner = "without" +selectorAffix."grek/upsilon" = "serifless" +selectorAffix."grek/upsilon/sansSerif" = "serifless" + +[prime.lower-upsilon.variants-buildup.stages.serifs.serifed] +rank = 2 +descriptionAffix = "serifs" +selectorAffix."grek/upsilon" = "serifed" +selectorAffix."grek/upsilon/sansSerif" = "serifless" + + + [prime.lower-chi] sampler = "χ" samplerExplain = "Greek lower Chi" @@ -8397,16 +8501,20 @@ capital-thorn = "serifless" lower-thorn = "serifless" # Non-latin lower-alpha = "crossing" +lower-beta = "standard" capital-gamma = "serifless" +lower-gamma = "casual" capital-delta = "straight" lower-delta = "rounded" lower-iota = "serifed-semi-tailed" capital-lambda = "straight-serifless" lower-lambda = "straight" lower-mu = "tailed-serifless" +lower-nu = "casual" lower-xi = "flat-top" lower-pi = "tailed" lower-tau = "semi-tailed" +lower-upsilon = "casual-serifless" lower-chi = "straight-serifless" cyrl-a = "double-storey-serifless" cyrl-ve = "standard-serifless" @@ -8562,6 +8670,7 @@ capital-gamma = "serifed" capital-lambda = "straight-base-serifed" lower-lambda = "straight-turn" lower-mu = "tailed-serifed" +lower-upsilon = "casual-serifed" lower-chi = "straight-bilateral-motion-serifed" cyrl-a = "double-storey-serifed" cyrl-ve = "standard-bilateral-serifed" @@ -8650,8 +8759,10 @@ long-s = "flat-hook-middle-serifed" eszet = "longs-s-lig-serifless" lower-eth = "straight-bar" lower-iota = "tailed" +lower-gamma = "straight" lower-lambda = "tailed-turn" lower-mu = "toothed-serifless" +lower-nu = "straight" lower-pi = "tailless" lower-tau = "tailless" lower-chi = "semi-chancery-straight-serifless" @@ -8854,6 +8965,7 @@ y = "straight-turn-serifless" capital-eszet = "rounded-serifless" long-s = "flat-hook-serifless" eszet = "longs-s-lig-serifless" +lower-beta = "standard" lower-chi = "semi-chancery-straight-serifless" lower-eth = "straight-bar" lower-lambda = "tailed-turn" @@ -8893,6 +9005,7 @@ k = "cursive-serifless" l = "tailed" long-s = "flat-hook-descending" eszet = "longs-s-lig-descending-serifless" +lower-beta = "cursive" cyrl-a = "single-storey-serifless" cyrl-ve = "cursive-tall" cyrl-zhe = "symmetric-connected" @@ -8978,6 +9091,7 @@ lower-eth = "straight-bar" lower-iota = "serifed-flat-tailed" lower-lambda = "straight-turn" lower-tau = "flat-tailed" +lower-upsilon = "casual-serifed" lower-chi = "semi-chancery-straight-serifless" cyrl-a = "double-storey-serifless" cyrl-ve = "standard-serifless" @@ -9742,8 +9856,10 @@ lower-alpha = "barred-earless-corner-tailed" capital-gamma = "bottom-serifed" lower-lambda = "straight-turn" lower-mu = "toothless-corner-serifless" +lower-nu = "straight" lower-xi = "rounded" lower-pi = "small-capital" +lower-upsilon = "straight-serifless" cyrl-a = "double-storey-tailed" cyrl-capital-zhe = "symmetric-touching" cyrl-zhe = "symmetric-touching" @@ -9811,6 +9927,7 @@ long-s = "bent-hook-bottom-serifed" eszet = "longs-s-lig-bottom-serifed" capital-gamma = "serifed" lower-mu = "toothless-corner-serifed" +lower-upsilon = "straight-serifed" cyrl-capital-ka = "symmetric-touching-serifed" cyrl-ka = "symmetric-touching-serifed" cyrl-em = "slanted-sides-hanging-serifed" @@ -9965,12 +10082,15 @@ long-s = "flat-hook-serifless" eszet = "sulzbacher-serifless" lower-eth = "straight-bar" lower-alpha = "barred" +lower-gamma = "straight" lower-delta = "flat-top" lower-iota = "serifed-flat-tailed" lower-lambda = "straight" lower-mu = "toothed-serifless" +lower-nu = "straight" lower-xi = "rounded" lower-tau = "flat-tailed" +lower-upsilon = "straight-serifless" cyrl-a = "double-storey-serifless" cyrl-ve = "standard-serifless" cyrl-em = "hanging-serifless" @@ -10031,6 +10151,7 @@ long-s = "flat-hook-bottom-serifed" eszet = "sulzbacher-bottom-serifed" lower-alpha = "barred-double-serifed" lower-mu = "toothed-serifed" +lower-upsilon = "straight-serifed" cyrl-a = "double-storey-serifed" cyrl-ve = "standard-bilateral-serifed" cyrl-ka = "symmetric-connected-serifed" @@ -10093,6 +10214,7 @@ lower-delta = "flat-top" lower-iota = "serifed-flat-tailed" lower-lambda = "tailed-turn" lower-tau = "flat-tailed" +lower-upsilon = "straight-serifless" lower-chi = "semi-chancery-straight-serifless" cyrl-a = "double-storey-tailed" cyrl-capital-ka = "symmetric-connected-bottom-right-serifed" @@ -10160,6 +10282,7 @@ x = "straight-serifed" y = "straight-turn-serifed" capital-eszet = "corner-bottom-serifed" eszet = "traditional-flat-hook-bottom-serifed" +lower-upsilon = "straight-serifed" cyrl-capital-ka = "symmetric-connected-serifed" cyrl-ka = "symmetric-connected-serifed" cyrl-em = "hanging-serifed" @@ -10502,8 +10625,10 @@ y = "straight-turn-serifless" long-s = "flat-hook-middle-serifed-xh" eszet = "longs-s-lig-serifless" lower-alpha = "barred-tailed" +lower-gamma = "straight" lower-lambda = "straight-turn" lower-tau = "short-tailed" +lower-upsilon = "straight-serifless" cyrl-a = "double-storey-tailed" cyrl-ve = "standard-serifless" cyrl-em = "hanging-serifless" @@ -10552,6 +10677,7 @@ z = "straight-serifed" long-s = "flat-hook-double-serifed-xh" eszet = "longs-s-lig-bottom-serifed" lower-alpha = "barred-tailed-serifed" +lower-upsilon = "straight-serifed" cyrl-ve = "standard-bilateral-serifed" cyrl-ka = "symmetric-connected-serifed" cyrl-em = "hanging-serifed" diff --git a/tools/generate-samples/src/templates/package-sample.mjs b/tools/generate-samples/src/templates/package-sample.mjs index 64451059e..41eafa91e 100644 --- a/tools/generate-samples/src/templates/package-sample.mjs +++ b/tools/generate-samples/src/templates/package-sample.mjs @@ -5,7 +5,7 @@ export const ssStrings = [ ["ABC.DEF.GHI.JKL.MNO.PQRS.TUV.WXYZ", "abc.def.ghi.jkl.mno.pqrs.tuv.wxyz"], ["!iIlL17|¦ ¢coO08BbDQ $5SZ2zs 96µm", "float il1[]={1-2/3.4,5+6=7/8%90};"], ["1234567890 ,._-+= >< «¯-¬_» ~–÷+×", "{*}[]()<>`+-=$/#_%^@\\&|~?'\" !,.;:"], - ["CG6Qg9q¶ äöü Þẞðþſß ΓΔΛαδιλμξπτχ∂", [..."ЖЗКНРУЭЯавжзклмнруфчьыэя ", "<=", " ", "!=", " ", "=="]] + ["CG6Qg9q¶ Þẞðþſß ΓΔΛαβγδιλμνξπτυχ∂", [..."ЖЗКНРУЭЯавжзклмнруфчьыэя ", "<=", " ", "!=", " ", "=="]] ]; function* makeSample(lbm, hotChars) { diff --git a/tools/generate-samples/src/templates/stylistic-set.mjs b/tools/generate-samples/src/templates/stylistic-set.mjs index 3d1dbed4a..a0223269d 100644 --- a/tools/generate-samples/src/templates/stylistic-set.mjs +++ b/tools/generate-samples/src/templates/stylistic-set.mjs @@ -5,7 +5,7 @@ const ssStrings = [ ["ABC.DEF.GHI.JKL.MNO.PQRS.TUV.WXYZ", "abc.def.ghi.jkl.mno.pqrs.tuv.wxyz"], ["!iIlL17|¦ ¢coO08BbDQ $5SZ2zs 96µm", "float il1[]={1-2/3.4,5+6=7/8%90};"], ["1234567890 ,._-+= >< «¯-¬_» ~–÷+×", "{*}[]()<>`+-=$/#_%^@\\&|~?'\" !,.;:"], - ["CG6Qg9q¶ äöü Þẞðþſß ΓΔΛαδιλμξπτχ∂", [..."ЖЗКНРУЭЯавжзклмнруфчьыэя ", "<=", " ", "!=", " ", "=="]] + ["CG6Qg9q¶ Þẞðþſß ΓΔΛαβγδιλμνξπτυχ∂", [..."ЖЗКНРУЭЯавжзклмнруфчьыэя ", "<=", " ", "!=", " ", "=="]] ]; function* makeSample(theme, lbm, features, hotChars) {