diff --git a/.editorconfig b/.editorconfig index bd38d8458..173448d6e 100644 --- a/.editorconfig +++ b/.editorconfig @@ -14,6 +14,8 @@ block_comment = * block_comment_end = */ [*.md] +indent_style = space +indent_size = 2 insert_final_newline = false trim_trailing_whitespace = false diff --git a/README.md b/README.md index 6866f6f91..87abb710b 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Iosevka ![Version](https://img.shields.io/github/release/be5invis/Iosevka.svg) Coders’ typeface, built from code. -![](https://raw.githubusercontent.com/be5invis/Iosevka/master/images/preview-all.png) +![](images/preview-all.png) ## Installation @@ -22,11 +22,11 @@ Quit your editor/program. Unzip and open the folder. The typeface contains 9 weights (Thin to Heavy) alongside with both italic and oblique versions, with the same metrics as the regular one. -![Weights sample](https://raw.githubusercontent.com/be5invis/Iosevka/master/images/weights.png) +![Weights sample](images/weights.png) All versions include the same ranges of characters: Latin letters, Greek letters (including Polytonic), some Cyrillic letters, IPA symbols and common punctuations and some symbols. You can check out the full list [here](http://be5invis.github.io/Iosevka/specimen). -![Languages Sample](https://raw.githubusercontent.com/be5invis/Iosevka/master/images/languages.png) +![Languages Sample](images/languages.png) @@ -41,13 +41,13 @@ Afrikaans, Aghem, Akan, Albanian, Asturian, Asu, Azerbaijani, Bafia, Bambara, Ba Iosevka supports accessing all letter variants using OpenType features. -![Style Sets](https://raw.githubusercontent.com/be5invis/Iosevka/master/images/stylesets.png) +![Style Sets](images/stylesets.png) -![Character Variants](https://raw.githubusercontent.com/be5invis/Iosevka/master/images/charvars.png) +![Character Variants](images/charvars.png) ### Ligations -![Ligations Sample](https://raw.githubusercontent.com/be5invis/Iosevka/master/images/ligations.png) +![Ligations Sample](images/ligations.png) Iosevka’s default ligation set is assigned to `calt` feature, though not all of them are enabled by default. @@ -69,568 +69,619 @@ Refer to these [instructions.](https://github.com/ejuarezg/containers/tree/maste ## Build Your Own Style -Since version 2.0, Iosevka would no longer support building via `makefile`. To initialize a custom build, you need: +To create a custom build, you need: -1. Create `private-build-plans.toml` file. +1. Create `private-build-plans.toml` file if absent. -2. Add a build plan into `private-build-plans.toml`, following this format: +2. Add a build plan into `private-build-plans.toml`. The configurable properties are described in the following sections. + +3. Run `npm run build -- contents::` and the built fonts would be available in `dist/`. Aside from `contents::`, other options are: - - - - [buildPlans.iosevka-custom] # is your plan name - family = "Iosevka Custom" # Font menu family name - spacing = "normal" # Optional; Values: `normal`, `term`, `fontconfig-mono`, or `fixed` - serifs = "sans" # Optional; Values: `sans` or `slab` - digit-form = "lining" # Optional; Values `lining` or `olt-style` - - ################################################################################################### - # Configure variants - - # Optional; Whether to inherit a `ss##` variant - [buildPlans.iosevka-custom.variants] - inherits = ["ss01"] - - # Optional; Configure single character's variant - [buildPlans.iosevka-custom.variants.design] - g = 'singlestorey' - - # Optional; Configure single character's variant for Upright and Oblique; Overrides [design] - [buildPlans.iosevka-custom.variants.upright] - i = 'zshaped' - l = 'zshaped' - - # Optional; Configure single character's variant for Italic only; Overrides [design] - [buildPlans.iosevka-custom.variants.italic] - i = 'italic' - l = 'italic' - - # End variant section - ################################################################################################### - - ################################################################################################### - # Override default building weights - # When buildPlans..weights is absent, all weights would built and mapped to - # default values. - # IMPORTANT : Currently "menu" and "css" property only support numbers between 0 and 1000. - # and "shape" properly only supports number between 100 and 900 (inclusive). - # If you decide to use custom weights you have to define all the weights you - # plan to use otherwise they will not be built. - [buildPlans.iosevka-custom.weights.regular] - shape = 400 # Weight for glyph shapes. - menu = 400 # Weight for the font's names. - css = 400 # Weight for webfont CSS. - - [buildPlans.iosevka-custom.weights.book] - shape = 450 - menu = 450 # Use 450 here to name the font's weight "Book" - css = 450 - - [buildPlans.iosevka-custom.weights.bold] - shape = 700 - menu = 700 - css = 700 - - # End weight section - ################################################################################################### - - ################################################################################################### - # Override default building slope sets - # Format: = <"normal"|"italic"|"oblique"> - # When this section is absent, all slopes would be built. - - [buildPlans.iosevka-custom.slopes] - upright = "normal" - italic = "italic" - oblique = "oblique" - - # End slope section - ################################################################################################### - - ################################################################################################### - # Override default building widths - # When buildPlans..widths is absent, all widths would built and mapped to - # default values. - # IMPORTANT : Currently "shape" property only supports numbers between 434 and 664 (inclusive), - # while "menu" only supports integers between 1 and 9 (inclusive). - # The "shape" parameter specifies the unit width, measured in 1/1000 em. The glyphs' - # width are equal to, or a simple multiple of the unit width. - # If you decide to use custom widths you have to define all the widths you plan to use, - # otherwise they will not be built. - - [buildPlans.iosevka-custom.widths.normal] - shape = 500 # Unit Width, measured in 1/1000 em. - menu = 5 # Width grade for the font's names. - css = "normal" # "font-stretch' property of webfont CSS. - - [buildPlans.iosevka-custom.widths.extended] - shape = 576 - menu = 7 - css = "expanded" - - # End width section - ################################################################################################### - - ################################################################################################### - # Character Exclusion - # Specify character ranges in the section below to exclude certain characters from the font being - # built. Remove this section when this feature is not needed. - - [buildPlans.iosevka-custom.exclude-chars] - ranges = [[10003, 10008]] - - # End character exclusion - ################################################################################################### - - ################################################################################################### - # Compatibility Ligatures - # Certain applications like Emacs does not support proper programming liagtures provided by - # OpenType, but can support ligatures provided by PUA codepoints. Therefore you can edit the - # following section to build PUA characters that are generated from the OpenType ligatures. - # Remove this section when compatibility ligatures are not needed. - - [[buildPlans.iosevka-custom.compatibility-ligatures]] - unicode = 57600 # 0xE100 - featureTag = 'calt' - sequence = '<*>' - - # End compatibility ligatures section - ################################################################################################### - - ################################################################################################### - # Metric overrides - # Certain metrics like line height (leading) could be overridden in your build plan file. - # Edit the values to change the metrics. Remove this section when overriding is not needed. - - [buildPlans.iosevka-custom.metric-override] - leading = 1250 - winMetricAscenderPad = 0 - winMetricDescenderPad = 0 - powerlineScaleY = 1 - powerlineScaleX = 1 - powerlineShiftY = 0 - powerlineShiftX = 0 - - # End metric override section - ################################################################################################### - - - - - -3. Run `npm run build -- contents::` and the built fonts would be avaliable in `dist/`. Aside from `contents::`, other options are: - - 1. `contents::` : TTF (Hinted and Unhinted), WOFF(2) and Webfont CSS; + 1. `contents::` : TTF (Hinted and Unhinted), WOFF(2) and Web font CSS; 2. `ttf::` : TTF; 3. `ttf-unhinted::` : Unhinted TTF only; 4. `woff::` : TTF and WOFF only; - 5. `woff2::` : TTF and WOFF2 only; - - Note: Since version 2.2.0, we are using two colons (`::`) in the build target names. + 5. `woff2::` : TTF and WOFF2 only. -The current available styles for `design`/`upright`/`italic`/`oblique` options are: +### Configuring Custom Build -* Styles for general shape: +Configuration of build plans are organized under `[buildPlans.]` sections in the `private-build-plans.toml`. Inside the plan, top-level properties include: - * `sans` : Sans serif (default). - * `slab` : Slab serif. - -* Styles related to ligations and spacing: - - - `no-ligation` : Disable ligations. - - `no-cv-ss` : Prevent generation of `cv##` and `ss##` features. - - `sp-term` : Make the symbols' width suitable for terminal emulators. Arrows and geometric symbols will become narrower. - - `sp-force-monospace`: Apply `sp-term` and further: +* `family`: String, defines the family name of your custom variant. +* `spacing`: Optional, String, denotes the spacing of the custom variant. Valid values include: + - `term`: Make the symbols' width suitable for terminal emulators. Arrows and geometric symbols ill become narrower. + - `force-monospace`: Apply `term` spacing changes and further: - Completely remove wide glyphs. All non-combining glyphs will be exactly the same width. - - Remove `NWID` and `WWID` OpenType feature. - - Recommended for Linux users who customize for their terminal fonts: certain applications, including FontConfig, recognizes a font as monospace if and only if its every non-combining glyphs having the same width. - - `sp-fixed` : Apply `sp-force-monospace` and `no-ligation` together. + - Remove `NWID` and `WWID` OpenType feature. + + This spacing is recommended for Linux users who customize for their terminal fonts: certain applications, including FontConfig, recognizes a font as monospace if and only if its every non-combining glyphs having the same width. + - `fixed`: Apply `force-monospace` changes and remove ligations. +* `serifs`: Optional, String, configures style of serifs. + - When set to `slab`, the font will be converted into slab-serif. + - Otherwise the font will be sans-serif. +* `no-cv-ss`: Optional, Boolean, disables `cv##` and `ss##` OpenType features. +* `no-ligation`: Optional, Boolean, disables ligations. +* `digit-form`: Optional, String, configures the default form of digits (figures). + - When set to `old-style`, old-style digit figures will be used. + - When absent or set to `lining`, lining digit figures will be used. -* Style for controlling digits' (figures') style: - - `default-to-old-style-figures`, `default-to-old-style-digits`: Default digit figures to old-style. - - `default-to-lining-figures`, `default-to-lining-digits`: Default digit figures to lining. +Build plan could have 5 optional subsections: `ligations`, `variants`, `weights`, `widths` and `slopes`. - +#### Configuring Ligations + +Subsection `ligations` is used to customize the ligation set assigned to `calt` OpenType feature. Properties include: + + -* Styles for ligation sets, include: +* `inherits`: Optional, String, defines the inherited ligation set. When absent, the ligation set will not inherit any other sets. Valid values are: - * `ligset-dlig`: Default ligation set would be assigned to Discretionary ligatures. - * `ligset-clike`: Default ligation set would be assigned to C-Like. - * `ligset-javascript`: Default ligation set would be assigned to JavaScript. - * `ligset-php`: Default ligation set would be assigned to PHP. - * `ligset-ml`: Default ligation set would be assigned to ML. - * `ligset-fsharp`: Default ligation set would be assigned to F#. - * `ligset-fstar`: Default ligation set would be assigned to F*. - * `ligset-haskell`: Default ligation set would be assigned to Haskell. - * `ligset-idris`: Default ligation set would be assigned to Idris. - * `ligset-elm`: Default ligation set would be assigned to Elm. - * `ligset-purescript`: Default ligation set would be assigned to PureScript. - * `ligset-swift`: Default ligation set would be assigned to Swift. - * `ligset-coq`: Default ligation set would be assigned to Coq. - * `ligset-matlab`: Default ligation set would be assigned to Matlab. - * `ligset-wolfram`: Default ligation set would be assigned to Wolfram Language (Mathematica). - - + - `dlig`: Default ligation set would be assigned to Discretionary ligatures. + - `clike`: Default ligation set would be assigned to C-Like. + - `javascript`: Default ligation set would be assigned to JavaScript. + - `php`: Default ligation set would be assigned to PHP. + - `ml`: Default ligation set would be assigned to ML. + - `fsharp`: Default ligation set would be assigned to F#. + - `fstar`: Default ligation set would be assigned to F*. + - `haskell`: Default ligation set would be assigned to Haskell. + - `idris`: Default ligation set would be assigned to Idris. + - `elm`: Default ligation set would be assigned to Elm. + - `purescript`: Default ligation set would be assigned to PureScript. + - `swift`: Default ligation set would be assigned to Swift. + - `coq`: Default ligation set would be assigned to Coq. + - `matlab`: Default ligation set would be assigned to Matlab. + - `wolfram`: Default ligation set would be assigned to Wolfram Language (Mathematica). + -* Styles for customizing the default (`calt`) ligation set. By choosing one or multiple items listed below, the ligation set of `calt` will *only* contain the corresponded ligations of the selectors you used. +* `disables` and `enables`: Optional, String Array, Cherry-picking ligation groups to be disabled or enabled. Valid values include: - * `calt-center-ops`: Vertically align some of the operators (like `*`) to the center position it is before or after a "center" operator (like `+`). - * `calt-arrow`: Enable ligation set that forms arrows. - * `calt-arrow2`: Enable ligation for more arrows, like `>>=`. - * `calt-trig`: Enable ligation for `<|`, `|>` , `<||`, and other bar-and-angle-bracket symbols. - * `calt-eqeqeq`: Enable special ligation for `===` with triple lines. - * `calt-eqeq`: Enable ligation for `==` and `===`. - * `calt-ineq`: Enable ligation for `<=` and `>=`. - * `calt-exeqeq`: Enable special ligation for `!==` with triple lines. - * `calt-eqexeq`: Enable special ligation for `=!=` with triple lines. - * `calt-eqexeq-dl`: Enable special ligation for `=!=` with double lines. - * `calt-exeq`: Enable ligation for `!=` and `!==`. - * `calt-exeq-alt-1`: Enable ligation for `!=` and `!==` with a dot at below for distinction. - * `calt-tildeeq`: Enable ligation for `~=` as inequality. - * `calt-eqslasheq`: Enable special triple-line ligation for `=/=` as inequality. - * `calt-slasheq`: Enable ligation for `/=` and `=/=` as inequality. - * `calt-ltgt-ne`: Enable ligation for `<>` as inequality. - * `calt-ltgt-diamond`: Enable ligation for `<>` as diamond. - * `calt-brst`: Center asterisk in `(*` and `*)`. - * `calt-plusplus`: Enable ligation for `++` and further plus-chaining. - * `calt-kern-dotty`: Move connecting dotty punctuations closer, like for `::`, `:::` and `...`. - * `calt-logic`: Enable ligation for `/\` and `\/`. - * `calt-llgg`: Enable ligation for `<<`, `>>` and other angle-bracket chaining. - * `calt-llggeq`: Enable ligation for `<<=`, `>>=` as shift operator. - * `calt-dotoper`: Treat dot (`.`) as operator and perform chained centering. - * `calt-arrowZALE`: Treat `<=` as arrow. - * `calt-arrowZAGE`: Treat `>=` as co-arrow. - * `calt-html-comment`: Enable ligation for ` +#### Configuring Character Variants + +Subsection `variants` is used to configure character variants in the font. Properties include: -* Styles as stylistic sets: +* `inherits`: Optional, String, defines the inherited stylistic set. Valid options include: - * `ss01`: Set character variant to “Andale Mono Style”. - * `ss02`: Set character variant to “Anonymous Pro Style”. - * `ss03`: Set character variant to “Consolas Style”. - * `ss04`: Set character variant to “Menlo Style”. - * `ss05`: Set character variant to “Fira Mono Style”. - * `ss06`: Set character variant to “Liberation Mono Style”. - * `ss07`: Set character variant to “Monaco Style”. - * `ss08`: Set character variant to “Pragmata Pro Style”. - * `ss09`: Set character variant to “Source Code Pro Style”. - * `ss10`: Set character variant to “Envy Code R Style”. - * `ss11`: Set character variant to “X Window Style”. - * `ss12`: Set character variant to “Ubuntu Mono Style”. - * `ss13`: Set character variant to “Lucida Style”. - * `ss14`: Set character variant to “JetBrains Mono Style”. - * `ss20`: Set character variant to “Curly Style”. + - `ss01`: Set character variant to “Andale Mono Style”. + - `ss02`: Set character variant to “Anonymous Pro Style”. + - `ss03`: Set character variant to “Consolas Style”. + - `ss04`: Set character variant to “Menlo Style”. + - `ss05`: Set character variant to “Fira Mono Style”. + - `ss06`: Set character variant to “Liberation Mono Style”. + - `ss07`: Set character variant to “Monaco Style”. + - `ss08`: Set character variant to “Pragmata Pro Style”. + - `ss09`: Set character variant to “Source Code Pro Style”. + - `ss10`: Set character variant to “Envy Code R Style”. + - `ss11`: Set character variant to “X Window Style”. + - `ss12`: Set character variant to “Ubuntu Mono Style”. + - `ss13`: Set character variant to “Lucida Style”. + - `ss14`: Set character variant to “JetBrains Mono Style”. + - `ss20`: Set character variant to “Curly Style”. - -* Styles for individual characters. They are easy-to-understand names of the `cv##` styles, including: +* `design`, `upright` and `italic`: Optional, Dictionary, defines styles for individual characters. The choices are organized in key-value pairs, assigning a variant to a character group. Alternatively, you could assign numbers to `cv##` tags, like what you did when using OpenType in CSS.The valid combinations include: - * Styles for `A`, `Λ`, `Δ`: - * `turn-v = straight`, `cv01 = 1`: Standard, straight `A`, `Λ`, `Δ` (default). - * `turn-v = curly`, `cv01 = 2`: Slightly curly `A`, `Λ`, `Δ`, like Iosevka 2.x. - * Styles for `B`: - * `capital-b = standard`, `cv02 = 1`: Standard `B` (default). - * `capital-b = more-asymmetric`, `cv02 = 2`: More asymmetric `B` to differentiate with `8`. - * Styles for `D`: - * `capital-d = standard`, `cv03 = 1`: Standard `D` (default). - * `capital-d = more-rounded`, `cv03 = 2`: More rounded `D` to differentiate with `O`. - * Styles for `G`: - * `capital-g = toothed`, `cv04 = 1`: Toothed G (default). - * `capital-g = toothless`, `cv04 = 2`: Toothless G. - * Styles for `J`: - * `capital-j = serifless`, `cv05 = 1`: J without top serif. - * `capital-j = serifed`, `cv05 = 2`: J with top serif at left side (default). - * `capital-j = serifed-both-sides`, `cv05 = 3`: J with symmetric at both sides. - * `capital-j = serifed-symmetric`, `cv05 = 4`: J with symmetric at both sides and is symmetric. - * Styles for `K`: - * `capital-k = straight`, `cv06 = 1`: `K` with standard shape (default). - * `capital-k = curly`, `cv06 = 2`: Slightly curly `K`, like Iosevka 2.x. - * Styles for `M`: - * `capital-m = hanging`, `cv07 = 1`: `M` with middle being hanging off baseline (default). - * `capital-m = flat-bottom`, `cv07 = 2`: `M` with middle aligned to baseline. - * Styles for `Q`: - * `capital-q = taily`, `cv08 = 1`: `Q` with a curly tail (default). - * `capital-q = straight`, `cv08 = 2`: `Q` with a straight tail like in the old versions. - * `capital-q = crossing`, `cv08 = 3`: `Q` with a tail crossing the ring. - * Styles for `R`: - * `capital-r = straight`, `cv09 = 1`: Standard, straight-leg `R` (default). - * `capital-r = curly`, `cv09 = 2`:  Slightly curly-legged `R`, like Iosevka 2.x. - * Styles for `Y`: - * `capital-y = straight`, `cv10 = 1`: Standard, straight `Y` (default). - * `capital-y = curly`, `cv10 = 2`: Slightly curly `Y`, like Iosevka 2.x. - * Styles for `a`: - * `a = doublestorey`, `cv11 = 1`: Double-storey `a` (default for Upright). - * `a = singlestorey`, `cv11 = 2`: Single-storey `a`. - * `a = singlestorey-tailed`, `cv11 = 3`: Single-storey `a` with curly tail (default for Italic). - * `a = doublestorey-tailed`, `cv11 = 4`: Double-storey `a` with curly tail. - * `a = singlestorey-earless-corner`, `cv11 = 5`: Earless (cornered top-right) single-storey `a`. - * `a = singlestorey-earless-corner-tailed`, `cv11 = 6`: Earless (cornered top-right) single-storey `a` with curly tail. - * `a = singlestorey-earless-rounded`, `cv11 = 7`: Earless (rounded top-right) single-storey `a`. - * `a = singlestorey-earless-rounded-tailed`, `cv11 = 8`: Earless (rounded top-right) single-storey `a` with curly tail. - * `a = doublestorey-toothless-corner`, `cv11 = 9`: Toothless (cornered bottom-right) double-storey `a`. - * `a = doublestorey-toothless-rounded`, `cv11 = 10`: Toothless (rounded bottom-right) double-storey `a`. - * Styles for `b`: - * `b = toothed`, `cv12 = 1`: `b` with bottom-left tooth (default). - * `b = toothless-corner`, `cv12 = 2`: `b` without bottom-left tooth, with a corner transition. - * `b = toothless-rounded`, `cv12 = 3`: `b` without bottom-left tooth, with a rounded transition. - * Styles for `d`: - * `d = toothed`, `cv13 = 1`: `d` with bottom-right tooth (default for Upright). - * `d = toothless-corner`, `cv13 = 2`: `d` without bottom-right tooth, with a corner transition. - * `d = toothless-rounded`, `cv13 = 3`: `d` without bottom-right tooth, with a rounded transition. - * `d = tailed`, `cv13 = 4`: `d` with a slightly tail bottom-right tail (default for Italic). - * Styles for `f`: - * `f = straight`, `cv14 = 1`: `f` without bottom hook (default for Sans Upright). - * `f = tailed`, `cv14 = 2`: `f` with a leftward bottom hook (default for Italic). - * `f = serifed`, `cv14 = 3`: `f` with bottom serif (default for Slab Upright). - * `f = straight-tailed`, `cv14 = 4`: `f` with straight tail. - * `f = flat-hook`, `cv14 = 5`: `f` with flat hook. - * `f = flat-hook-crossbar-at-x-height`, `cv14 = 6`: `f` with flat hook and crossbar placed right at X-height. - * `f = flat-hook-serifed`, `cv14 = 7`: `f` with flat hook and bottom serif. - * `f = flat-hook-serifed-crossbar-at-x-height`, `cv14 = 8`: `f` with flat hook, bottom serif, and crossbar placed right at X-height. - * `f = flat-hook-round-tailed`, `cv14 = 9`: `f` with flat hook. - * `f = flat-hook-round-tailed-crossbar-at-x-height`, `cv14 = 10`: `f` with flat hook and crossbar placed right at X-height. - * `f = flat-hook-flat-tailed`, `cv14 = 11`: `f` with flat hook and bottom serif. - * `f = flat-hook-flat-tailed-crossbar-at-x-height`, `cv14 = 12`: `f` with flat hook, bottom serif, and crossbar placed right at X-height. - * Styles for `g`: - * `g = singlestorey`, `cv15 = 1`: Single-storey `g` (default). - * `g = doublestorey`, `cv15 = 2`: Double-storey `g`. - * `g = opendoublestorey`, `cv15 = 3`: Open Double-storey `g`, like Trebuchet MS or Fira Code. - * `g = earless-corner`, `cv15 = 4`: Earless (cornered top-right) single-storey `g`. - * `g = earless-rounded`, `cv15 = 5`: Earless (rounded top-right) single-storey `g`. - * Styles for `h`: - * `h = straight`, `cv16 = 1`: `h` with straight ending (default). - * `h = tailed`, `cv16 = 2`: `h` with curly tailed ending. - * `h = motion-serifed-straight`, `cv16 = 3`: `h` with straight ending. - * `h = motion-serifed-tailed`, `cv16 = 4`: `h` with curly tailed ending. - * Styles for `i`: - * `i = serifed`, `cv17 = 1`: Serifed `i` (default for Upright). - * `i = italic`, `cv17 = 2`: Italic `i` (default for Italic). - * `i = hooky`, `cv17 = 3`: Hooky `i`. - * `i = line`, `cv17 = 4`: `i` like a straight line. - * `i = zshaped`, `cv17 = 5`: Z-shaped `i`. - * `i = tailed`, `cv17 = 6`: Tailed `i`. - * `i = hookybottom`, `cv17 = 7`: `i` with a straight tail. - * `i = serifed-asymmetric`, `cv17 = 8`: `i` with shorter top serif and full bottom serif. - * Styles for `j`: - * `j = line`, `cv18 = 1`: `j` like a straight line. - * `j = serifed`, `cv18 = 2`: `j` with top serif (default). - * `j = straight`, `cv18 = 3`: `j` without serif. - * `j = flat-hook-serifed`, `cv18 = 4`: undefined. - * `j = flat-hook-serifless`, `cv18 = 5`: undefined. - * Styles for `k`: - * `k = straight`, `cv19 = 1`: `k` with standard shape (default for Upright). - * `k = curly`, `cv19 = 2`: Slightly curly `k`, like Iosevka 2.x. - * `k = cursive`, `cv19 = 3`: `k` with a cursive loop (default for Italic). - * Styles for `l`: - * `l = hooky`, `cv20 = 1`: Hooky `l`. - * `l = zshaped`, `cv20 = 2`: Z-shaped `l`. - * `l = serifed`, `cv20 = 3`: Serifed `l` (default for Upright). - * `l = italic`, `cv20 = 4`: Italic, cursive `l` (default for Italic). - * `l = line`, `cv20 = 5`: `l` like a straight line. - * `l = tailed`, `cv20 = 6`: `l` with a curved tail. - * `l = hookybottom`, `cv20 = 7`: `l` with a straight tail. - * `l = serifed-asymmetric`, `cv20 = 8`: `l` with shorter top serif and full bottom serif. - * Styles for `m`: - * `m = normal`, `cv21 = 1`: `m` with normal middle leg, touching the baseline (default). - * `m = shortleg`, `cv21 = 2`: `m` with shorter middle leg, like Ubuntu Mono. - * `m = tailed`, `cv21 = 3`: `m` with normal middle leg, touching the baseline, and a curly tail. - * `m = shortleg-tailed`, `cv21 = 4`: `m` with shorter middle leg, like Ubuntu Mono, and a curly tail. - * `m = earless-corner-double-arch`, `cv21 = 5`: Earless (corner top-left) `m` with normal middle leg touching baseline. - * `m = earless-corner-double-arch-shortleg`, `cv21 = 6`: Earless (corner top-left) `m` with a shorter middle leg like Ubuntu Mono. - * `m = earless-corner-double-arch-tailed`, `cv21 = 7`: Earless (corner top-left) `m` with normal middle leg touching baseline, and a curly tail. - * `m = earless-corner-double-arch-shortleg-tailed`, `cv21 = 8`: Earless (corner top-left) `m` with a shorter middle leg like Ubuntu Mono, and a curly tail. - * `m = earless-rounded-double-arch`, `cv21 = 9`: Earless (rounded top-left) `m` with normal middle leg touching baseline. - * `m = earless-rounded-double-arch-shortleg`, `cv21 = 10`: Earless (rounded top-left) `m` with a shorter middle leg like Ubuntu Mono. - * `m = earless-rounded-double-arch-tailed`, `cv21 = 11`: Earless (rounded top-left) `m` with normal middle leg touching baseline, and a curly tail. - * `m = earless-rounded-double-arch-shortleg-tailed`, `cv21 = 12`: Earless (rounded top-left) `m` with a shorter middle leg like Ubuntu Mono, and a curly tail. - * `m = earless-single-arch`, `cv21 = 13`: Earless (single-arch) `m` with normal middle leg touching baseline. - * `m = earless-single-arch-shortleg`, `cv21 = 14`: Earless (single-arch) `m` with a shorter middle leg like Ubuntu Mono. - * `m = earless-single-arch-tailed`, `cv21 = 15`: Earless (single-arch) `m` with normal middle leg touching baseline, and a curly tail. - * `m = earless-single-arch-shortleg-tailed`, `cv21 = 16`: Earless (single-arch) `m` with a shorter middle leg like Ubuntu Mono, and a curly tail. - * `m = motion-serifed`, `cv21 = 17`: `m` with motion serifs, normal middle leg touching baseline. - * `m = motion-serifed-shortleg`, `cv21 = 18`: `m` with motion serifs, a shorter middle leg like Ubuntu Mono. - * `m = motion-serifed-tailed`, `cv21 = 19`: `m` with motion serifs, normal middle leg touching baseline, and a curly tail. - * `m = motion-serifed-shortleg-tailed`, `cv21 = 20`: `m` with motion serifs, a shorter middle leg like Ubuntu Mono, and a curly tail. - * Styles for `n`: - * `n = straight`, `cv22 = 1`: `n` with straight ending (default). - * `n = tailed`, `cv22 = 2`: `n` with a curly tail. - * `n = earless-corner-straight`, `cv22 = 3`: Earless (corner top-left) `n` with straight ending. - * `n = earless-corner-tailed`, `cv22 = 4`: Earless (corner top-left) `n` with a curly tail. - * `n = earless-rounded-straight`, `cv22 = 5`: Earless (rounded top-left) `n` with straight ending. - * `n = earless-rounded-tailed`, `cv22 = 6`: Earless (rounded top-left) `n` with a curly tail. - * `n = motion-serifed-straight`, `cv22 = 7`: `n` with motion serifs and straight ending. - * `n = motion-serifed-tailed`, `cv22 = 8`: `n` with motion serifs and a curly tail. - * Styles for `p`: - * `p = eared`, `cv23 = 1`: `p` with top-left ear (default). - * `p = earless-corner`, `cv23 = 2`: `p` without top-left ear (corner). - * `p = earless-rounded`, `cv23 = 3`: `p` without top-left ear (rounded). - * `p = motion-serifed`, `cv23 = 4`: `p` with motion serifs. - * Styles for `q`: - * `q = straight`, `cv24 = 1`: `q` with straight bar (default). - * `q = tailed`, `cv24 = 2`: `q` with tail. - * `q = earless-corner`, `cv24 = 3`: Earless (cornered top-left) single-storey `q`. - * `q = earless-corner-tailed`, `cv24 = 4`: Earless (cornered top-left) single-storey `q` with curly tail. - * `q = earless-rounded`, `cv24 = 5`: Earless (rounded top-left) single-storey `q`. - * `q = earless-rounded-tailed`, `cv24 = 6`: Earless (rounded top-left) single-storey `q` with curly tail. - * Styles for `r`: - * `r = straight`, `cv25 = 1`: Straight, serif-less `r` (default for Sans). - * `r = serifed`, `cv25 = 2`: `r` with serif at both top and bottom (default for Slab Upright). - * `r = top-serifed`, `cv25 = 3`: `r` with serifs at top-left only (default for Slab Italic). - * `r = earless-corner`, `cv25 = 4`: Earless (corner top-left), serif-less `r`. - * `r = earless-rounded`, `cv25 = 5`: Earless (rounded top-left), serif-less `r`. - * Styles for `t`: - * `t = standard`, `cv26 = 1`: Standard `t` shape (default). - * `t = cross`, `cv26 = 2`: Futura-like `t` shape. - * `t = flat-hook`, `cv26 = 3`: `t` with flat hook. - * `t = hookless-asymmetric`, `cv26 = 4`: `t` without hook and ony half the cross bar. - * `t = flat-hook-short-neck`, `cv26 = 5`: `t` with flat hook and a slightly shorter neck. - * `t = flat-hook-short-neck2`, `cv26 = 6`: `t` with flat hook and a more shorter neck. - * Styles for `u`: - * `u = with-bar`, `cv27 = 1`: Normal `u` with right bar (default for Upright). - * `u = without-bar`, `cv27 = 2`: Normal `u` without right bar, like a smaller uppercase `U`. - * `u = tailed`, `cv27 = 3`: `u` with right bar and a slightly curly tail (default for Italic). - * `u = motion-serifed`, `cv27 = 4`: Normal `u` with right bar and motion serifs. - * `u = motion-serifed-tailed`, `cv27 = 5`: `u` with right bar, motion serifs and a slightly curly tail. - * Styles for `v`, `V`: - * `v = straight`, `cv28 = 1`: Standard, straight `V` and `v` (default). - * `v = curly`, `cv28 = 2`:  Slightly curly `V` and `v`, like Iosevka 2.x. - * Styles for `w`, `W`: - * `w = straight`, `cv29 = 1`: Standard, straight `W` and `w` (default). - * `w = curly`, `cv29 = 2`: Slightly curly `W` and `w`, like Iosevka 2.x. - * `w = straight-flat-top`, `cv29 = 3`: Standard, straight `W` and `w`, and the middle is forced to be aligned the top. - * Styles for `x`, `X`: - * `x = straight`, `cv30 = 1`: Standard, straight `X` and `x` (default). - * `x = curly`, `cv30 = 2`: Slightly curly `X` and `x`, like Iosevka 2.x. - * Styles for `y`: - * `y = straight`, `cv31 = 1`: Letter `y` that is fully straight (default for Sans Upright). - * `y = straight-turn`, `cv31 = 2`: Letter `y` with straight upper and a tail turns leftward (default for Slab Upright). - * `y = curly`, `cv31 = 3`: More curly letter `y`, like Iosevka 2.x. - * `y = cursive`, `cv31 = 4`: Cursive-like `y` (default for Italic). - * Styles for `z`, `Z`: - * `z = standard`, `cv32 = 1`: Standard `Z` and `z` (default). - * `z = with-crossbar`, `cv32 = 2`: `Z` and `z` with a diagonal cross bar for better dsitinction with `2`. - * `z = with-horizontal-crossbar`, `cv32 = 3`: `Z` and `z` with a horizontal cross bar for better dsitinction with `2`. - * Styles for `ß`: - * `eszet = traditional`, `cv33 = 1`: Traditional, Fraktur-like Eszet. - * `eszet = sulzbacher`, `cv33 = 2`: A more modern, beta-like Eszet (default). - * `eszet = longs-s-lig`, `cv33 = 3`: An Eszet shown as a ligature of long-S (`ſ`) and `s`. - * Styles for `λ`: - * `lambda = straight`, `cv34 = 1`: More-straight letter `λ` (default). - * `lambda = curly`, `cv34 = 2`: More curly letter `λ`, like Iosevka 2.x. - * Styles for `0`: - * `zero = slashed`, `cv35 = 1`: Slashed Zero `0` (default). - * `zero = dotted`, `cv35 = 2`: Dotted Zero `0`. - * `zero = unslashed`, `cv35 = 3`: O-like `0`. - * `zero = reverse-slashed`, `cv35 = 4`: Reverse-slashed `0`. - * `zero = long-dotted`, `cv35 = 5`: Long-dotted Zero `0` like Hack. - * Styles for `1`: - * `one = nobase`, `cv36 = 1`: `1` with bottom serif (default for Sans). - * `one = base`, `cv36 = 2`: `1` without bottom serif (default for Slab). - * `one = line`, `cv36 = 3`: `1` drawn just like a straight line. - * Styles for `3`: - * `three = flattop`, `cv37 = 1`: Flat top `3` (Like Museo Sans / Montserrat). - * `three = twoarcs`, `cv37 = 2`: Arched top `3` (default). - * Styles for `4`: - * `four = closed`, `cv38 = 1`: `4` with closed contour (default). - * `four = closed-non-crossing`, `cv38 = 2`: `4` with closed contour but the horizontal bar does not overflow the vertical bar. - * `four = semi-open`, `cv38 = 3`: `4` with semi-open contour. - * `four = semi-open-non-crossing`, `cv38 = 4`: `4` with semi-open contour but the horizontal bar does not overflow the vertical bar. - * `four = open`, `cv38 = 5`: `4` with open contour. - * `four = open-non-crossing`, `cv38 = 6`: `4` with open contour but the horizontal bar does not overflow the vertical bar. - * Styles for `6`: - * `six = closed-contour`, `cv40 = 1`: `6` with a more closed contour. - * `six = open-contour`, `cv40 = 2`: `6` with a more open contour. - * `six = straight-bar`, `cv40 = 3`: `6` with a straight bar (default). - * Styles for `7`: - * `seven = noserif`, `cv41 = 1`: `7` without serif (default for Sans). - * `seven = serifed`, `cv41 = 2`: `7` with initial serif (default for Slab). - * `seven = crossbar`, `cv41 = 3`: `7` with crossbar. - * `seven = crossbar-serifed`, `cv41 = 4`: `7` with crossbar and initial serif. - * Styles for `9`: - * `nine = closed-contour`, `cv42 = 1`: `9` with a more closed contour. - * `nine = open-contour`, `cv42 = 2`: `9` with a more open contour. - * `nine = straight-bar`, `cv42 = 3`: `9` with a straight bar (default). - * Styles for `~`: - * `tilde = high`, `cv43 = 1`: Higher tilde `~`. - * `tilde = low`, `cv43 = 2`: Lower tilde `~` (default). - * Styles for `*`: - * `asterisk = high`, `cv44 = 1`: Higher five-pointed asterisk `*` (default). - * `asterisk = low`, `cv44 = 2`: Lower five-pointed asterisk `*`. - * `asterisk = hexhigh`, `cv44 = 3`: Higher six-pointed asterisk `*`. - * `asterisk = hexlow`, `cv44 = 4`: Lower six-pointed asterisk `*`. - * `asterisk = flip-penta-high`, `cv44 = 5`: Higher five-pointed and turned asterisk `*`. - * `asterisk = flip-penta-low`, `cv44 = 6`: Lower five-pointed and turned asterisk `*`. - * Styles for `_`: - * `underscore = high`, `cv45 = 1`: Higher underscore `_`, placed right below baseline (default). - * `underscore = low`, `cv45 = 2`: Lower underscore `_`, placed right above descender line. - * `underscore = above-baseline`, `cv45 = 3`: Extra-high `_`, placed right below baseline. - * Styles for `¶`: - * `paragraph-sign = high`, `cv46 = 1`: Higher paragraph sign `¶` (default). - * `paragraph-sign = low`, `cv46 = 2`: Lower paragraph sign `¶`. - * Styles for `^`: - * `caret = high`, `cv47 = 1`: Higher circumflex `^` (default). - * `caret = low`, `cv47 = 2`: Lower circumflex `^`. - * Styles for `(`, `)`: - * `paren = normal`, `cv48 = 1`: Parenthesis with normal contour. - * `paren = large-contour`, `cv48 = 2`: Parenthesis with larger contour, like that in Monaco. - * Styles for `{`, `}`: - * `brace = straight`, `cv49 = 1`: More straight braces. - * `brace = curly`, `cv49 = 2`: More curly braces. - * Styles for `#`: - * `number-sign = upright`, `cv50 = 1`: Number sign with vertical bars (default). - * `number-sign = slanted`, `cv50 = 2`: Number sign with slanted bars. - * `number-sign = upright-open`, `cv50 = 3`: Number sign with vertical bars and open inner. - * `number-sign = slanted-open`, `cv50 = 4`: Number sign with slanted bars and open inner. - * Styles for `&`: - * `ampersand = closed`, `cv51 = 1`: Ampersand (`&`) with a closed contour (default). - * `ampersand = upper-open`, `cv51 = 2`: Ampersand (`&`) with an open contour at upper half. - * `ampersand = lower-open`, `cv51 = 3`: Ampersand (`&`) with an open contour at lower half. - * `ampersand = et`, `cv51 = 4`: Ampersand (`&`) drawn like a ligature of Ɛ and t. - * `ampersand = et-toothed`, `cv51 = 5`: Ampersand (`&`) drawn like a ligature of Ɛ and t with tooth. - * `ampersand = flat-top`, `cv51 = 6`: Ampersand (`&`) drawn with a flat top. - * Styles for `@`: - * `at = threefold`, `cv52 = 1`: The long, three-fold At symbol (`@`) (default). - * `at = fourfold`, `cv52 = 2`: The traditional, four-fold At symbol (`@`). - * `at = short`, `cv52 = 3`: The shorter, Fira-like At symbol (`@`). - * Styles for `$`: - * `dollar = open`, `cv53 = 1`: Dollar symbol with open contour. - * `dollar = through`, `cv53 = 2`: Dollar symbol with strike-through vertical bar (default). - * `dollar = opencap`, `cv53 = 3`: Dollar symbol with open contour, not exceeding baseline and ascender. - * `dollar = throughcap`, `cv53 = 4`: Dollar symbol with strike-through vertical bar, not exceeding baseline and ascender. - * Styles for `%`: - * `percent = dots`, `cv54 = 1`: Percent `%`, Per-mille `‰` and basis point `‱` using rectangular dots. - * `percent = rings`, `cv54 = 2`: Percent `%` with rings and broken bar; Per-mille `‰` and basis point `‱` with rings (default). - * `percent = rings-connected`, `cv54 = 3`: Percent `%`, Per-mille `‰` and basis point `‱` using rings and continuous bar. - * Styles for `|`: - * Styles for `<=`, `>=`: - * `lig-ltgteq = flat`, `cv56 = 1`: The lower bar of `<=` and `>=` ligation is flat. - * `lig-ltgteq = slanted`, `cv56 = 2`: The lower bar of `<=` and `>=` ligation is slanted. - * Styles for `'`: - * `ascii-single-quote = straight`, `cv57 = 1`: Show ASCII quote (`'`) as short vertical straight bar. (default). - * `ascii-single-quote = raised-comma`, `cv57 = 2`: Show ASCII quote (`'`) as raised comma.. - * Styles for `` ` ``: - * `ascii-grave = straight`, `cv58 = 1`: Show ASCII grave (`` ` ``) as short diagonal straight bar. (default). - * `ascii-grave = raised-inverse-comma`, `cv58 = 2`: Show ASCII grave (`` ` ``) as raised comma.. + - Styles for `A`, `Λ`, `Δ`: + + `turn-v = 'straight'`, `cv01 = 1`: Standard, straight `A`, `Λ`, `Δ` (default). + + `turn-v = 'curly'`, `cv01 = 2`: Slightly curly `A`, `Λ`, `Δ`, like Iosevka 2.x. + - Styles for `B`: + + `capital-b = 'standard'`, `cv02 = 1`: Standard `B` (default). + + `capital-b = 'more-asymmetric'`, `cv02 = 2`: More asymmetric `B` to differentiate with `8`. + - Styles for `D`: + + `capital-d = 'standard'`, `cv03 = 1`: Standard `D` (default). + + `capital-d = 'more-rounded'`, `cv03 = 2`: More rounded `D` to differentiate with `O`. + - Styles for `G`: + + `capital-g = 'toothed'`, `cv04 = 1`: Toothed G (default). + + `capital-g = 'toothless'`, `cv04 = 2`: Toothless G. + - Styles for `J`: + + `capital-j = 'serifless'`, `cv05 = 1`: J without top serif. + + `capital-j = 'serifed'`, `cv05 = 2`: J with top serif at left side (default). + + `capital-j = 'serifed-both-sides'`, `cv05 = 3`: J with symmetric at both sides. + + `capital-j = 'serifed-symmetric'`, `cv05 = 4`: J with symmetric at both sides and is symmetric. + - Styles for `K`: + + `capital-k = 'straight'`, `cv06 = 1`: `K` with standard shape (default). + + `capital-k = 'curly'`, `cv06 = 2`: Slightly curly `K`, like Iosevka 2.x. + - Styles for `M`: + + `capital-m = 'hanging'`, `cv07 = 1`: `M` with middle being hanging off baseline (default). + + `capital-m = 'flat-bottom'`, `cv07 = 2`: `M` with middle aligned to baseline. + - Styles for `Q`: + + `capital-q = 'taily'`, `cv08 = 1`: `Q` with a curly tail (default). + + `capital-q = 'straight'`, `cv08 = 2`: `Q` with a straight tail like in the old versions. + + `capital-q = 'crossing'`, `cv08 = 3`: `Q` with a tail crossing the ring. + - Styles for `R`: + + `capital-r = 'straight'`, `cv09 = 1`: Standard, straight-leg `R` (default). + + `capital-r = 'curly'`, `cv09 = 2`:  Slightly curly-legged `R`, like Iosevka 2.x. + - Styles for `Y`: + + `capital-y = 'straight'`, `cv10 = 1`: Standard, straight `Y` (default). + + `capital-y = 'curly'`, `cv10 = 2`: Slightly curly `Y`, like Iosevka 2.x. + - Styles for `a`: + + `a = 'doublestorey'`, `cv11 = 1`: Double-storey `a` (default for Upright). + + `a = 'singlestorey'`, `cv11 = 2`: Single-storey `a`. + + `a = 'singlestorey-tailed'`, `cv11 = 3`: Single-storey `a` with curly tail (default for Italic). + + `a = 'doublestorey-tailed'`, `cv11 = 4`: Double-storey `a` with curly tail. + + `a = 'singlestorey-earless-corner'`, `cv11 = 5`: Earless (cornered top-right) single-storey `a`. + + `a = 'singlestorey-earless-corner-tailed'`, `cv11 = 6`: Earless (cornered top-right) single-storey `a` with curly tail. + + `a = 'singlestorey-earless-rounded'`, `cv11 = 7`: Earless (rounded top-right) single-storey `a`. + + `a = 'singlestorey-earless-rounded-tailed'`, `cv11 = 8`: Earless (rounded top-right) single-storey `a` with curly tail. + + `a = 'doublestorey-toothless-corner'`, `cv11 = 9`: Toothless (cornered bottom-right) double-storey `a`. + + `a = 'doublestorey-toothless-rounded'`, `cv11 = 10`: Toothless (rounded bottom-right) double-storey `a`. + - Styles for `b`: + + `b = 'toothed'`, `cv12 = 1`: `b` with bottom-left tooth (default). + + `b = 'toothless-corner'`, `cv12 = 2`: `b` without bottom-left tooth, with a corner transition. + + `b = 'toothless-rounded'`, `cv12 = 3`: `b` without bottom-left tooth, with a rounded transition. + - Styles for `d`: + + `d = 'toothed'`, `cv13 = 1`: `d` with bottom-right tooth (default for Upright). + + `d = 'toothless-corner'`, `cv13 = 2`: `d` without bottom-right tooth, with a corner transition. + + `d = 'toothless-rounded'`, `cv13 = 3`: `d` without bottom-right tooth, with a rounded transition. + + `d = 'tailed'`, `cv13 = 4`: `d` with a slightly tail bottom-right tail (default for Italic). + - Styles for `f`: + + `f = 'straight'`, `cv14 = 1`: `f` without bottom hook (default for Sans Upright). + + `f = 'tailed'`, `cv14 = 2`: `f` with a leftward bottom hook (default for Italic). + + `f = 'serifed'`, `cv14 = 3`: `f` with bottom serif (default for Slab Upright). + + `f = 'straight-tailed'`, `cv14 = 4`: `f` with straight tail. + + `f = 'flat-hook'`, `cv14 = 5`: `f` with flat hook. + + `f = 'flat-hook-crossbar-at-x-height'`, `cv14 = 6`: `f` with flat hook and crossbar placed right at X-height. + + `f = 'flat-hook-serifed'`, `cv14 = 7`: `f` with flat hook and bottom serif. + + `f = 'flat-hook-serifed-crossbar-at-x-height'`, `cv14 = 8`: `f` with flat hook, bottom serif, and crossbar placed right at X-height. + + `f = 'flat-hook-round-tailed'`, `cv14 = 9`: `f` with flat hook. + + `f = 'flat-hook-round-tailed-crossbar-at-x-height'`, `cv14 = 10`: `f` with flat hook and crossbar placed right at X-height. + + `f = 'flat-hook-flat-tailed'`, `cv14 = 11`: `f` with flat hook and bottom serif. + + `f = 'flat-hook-flat-tailed-crossbar-at-x-height'`, `cv14 = 12`: `f` with flat hook, bottom serif, and crossbar placed right at X-height. + - Styles for `g`: + + `g = 'singlestorey'`, `cv15 = 1`: Single-storey `g` (default). + + `g = 'doublestorey'`, `cv15 = 2`: Double-storey `g`. + + `g = 'opendoublestorey'`, `cv15 = 3`: Open Double-storey `g`, like Trebuchet MS or Fira Code. + + `g = 'earless-corner'`, `cv15 = 4`: Earless (cornered top-right) single-storey `g`. + + `g = 'earless-rounded'`, `cv15 = 5`: Earless (rounded top-right) single-storey `g`. + - Styles for `h`: + + `h = 'straight'`, `cv16 = 1`: `h` with straight ending (default). + + `h = 'tailed'`, `cv16 = 2`: `h` with curly tailed ending. + + `h = 'motion-serifed-straight'`, `cv16 = 3`: `h` with straight ending. + + `h = 'motion-serifed-tailed'`, `cv16 = 4`: `h` with curly tailed ending. + - Styles for `i`: + + `i = 'serifed'`, `cv17 = 1`: Serifed `i` (default for Upright). + + `i = 'italic'`, `cv17 = 2`: Italic `i` (default for Italic). + + `i = 'hooky'`, `cv17 = 3`: Hooky `i`. + + `i = 'line'`, `cv17 = 4`: `i` like a straight line. + + `i = 'zshaped'`, `cv17 = 5`: Z-shaped `i`. + + `i = 'tailed'`, `cv17 = 6`: Tailed `i`. + + `i = 'hookybottom'`, `cv17 = 7`: `i` with a straight tail. + + `i = 'serifed-asymmetric'`, `cv17 = 8`: `i` with shorter top serif and full bottom serif. + - Styles for `j`: + + `j = 'line'`, `cv18 = 1`: `j` like a straight line. + + `j = 'serifed'`, `cv18 = 2`: `j` with top serif (default). + + `j = 'straight'`, `cv18 = 3`: `j` without serif. + + `j = 'flat-hook-serifed'`, `cv18 = 4`: undefined. + + `j = 'flat-hook-serifless'`, `cv18 = 5`: undefined. + - Styles for `k`: + + `k = 'straight'`, `cv19 = 1`: `k` with standard shape (default for Upright). + + `k = 'curly'`, `cv19 = 2`: Slightly curly `k`, like Iosevka 2.x. + + `k = 'cursive'`, `cv19 = 3`: `k` with a cursive loop (default for Italic). + - Styles for `l`: + + `l = 'hooky'`, `cv20 = 1`: Hooky `l`. + + `l = 'zshaped'`, `cv20 = 2`: Z-shaped `l`. + + `l = 'serifed'`, `cv20 = 3`: Serifed `l` (default for Upright). + + `l = 'italic'`, `cv20 = 4`: Italic, cursive `l` (default for Italic). + + `l = 'line'`, `cv20 = 5`: `l` like a straight line. + + `l = 'tailed'`, `cv20 = 6`: `l` with a curved tail. + + `l = 'hookybottom'`, `cv20 = 7`: `l` with a straight tail. + + `l = 'serifed-asymmetric'`, `cv20 = 8`: `l` with shorter top serif and full bottom serif. + - Styles for `m`: + + `m = 'normal'`, `cv21 = 1`: `m` with normal middle leg, touching the baseline (default). + + `m = 'shortleg'`, `cv21 = 2`: `m` with shorter middle leg, like Ubuntu Mono. + + `m = 'tailed'`, `cv21 = 3`: `m` with normal middle leg, touching the baseline, and a curly tail. + + `m = 'shortleg-tailed'`, `cv21 = 4`: `m` with shorter middle leg, like Ubuntu Mono, and a curly tail. + + `m = 'earless-corner-double-arch'`, `cv21 = 5`: Earless (corner top-left) `m` with normal middle leg touching baseline. + + `m = 'earless-corner-double-arch-shortleg'`, `cv21 = 6`: Earless (corner top-left) `m` with a shorter middle leg like Ubuntu Mono. + + `m = 'earless-corner-double-arch-tailed'`, `cv21 = 7`: Earless (corner top-left) `m` with normal middle leg touching baseline, and a curly tail. + + `m = 'earless-corner-double-arch-shortleg-tailed'`, `cv21 = 8`: Earless (corner top-left) `m` with a shorter middle leg like Ubuntu Mono, and a curly tail. + + `m = 'earless-rounded-double-arch'`, `cv21 = 9`: Earless (rounded top-left) `m` with normal middle leg touching baseline. + + `m = 'earless-rounded-double-arch-shortleg'`, `cv21 = 10`: Earless (rounded top-left) `m` with a shorter middle leg like Ubuntu Mono. + + `m = 'earless-rounded-double-arch-tailed'`, `cv21 = 11`: Earless (rounded top-left) `m` with normal middle leg touching baseline, and a curly tail. + + `m = 'earless-rounded-double-arch-shortleg-tailed'`, `cv21 = 12`: Earless (rounded top-left) `m` with a shorter middle leg like Ubuntu Mono, and a curly tail. + + `m = 'earless-single-arch'`, `cv21 = 13`: Earless (single-arch) `m` with normal middle leg touching baseline. + + `m = 'earless-single-arch-shortleg'`, `cv21 = 14`: Earless (single-arch) `m` with a shorter middle leg like Ubuntu Mono. + + `m = 'earless-single-arch-tailed'`, `cv21 = 15`: Earless (single-arch) `m` with normal middle leg touching baseline, and a curly tail. + + `m = 'earless-single-arch-shortleg-tailed'`, `cv21 = 16`: Earless (single-arch) `m` with a shorter middle leg like Ubuntu Mono, and a curly tail. + + `m = 'motion-serifed'`, `cv21 = 17`: `m` with motion serifs, normal middle leg touching baseline. + + `m = 'motion-serifed-shortleg'`, `cv21 = 18`: `m` with motion serifs, a shorter middle leg like Ubuntu Mono. + + `m = 'motion-serifed-tailed'`, `cv21 = 19`: `m` with motion serifs, normal middle leg touching baseline, and a curly tail. + + `m = 'motion-serifed-shortleg-tailed'`, `cv21 = 20`: `m` with motion serifs, a shorter middle leg like Ubuntu Mono, and a curly tail. + - Styles for `n`: + + `n = 'straight'`, `cv22 = 1`: `n` with straight ending (default). + + `n = 'tailed'`, `cv22 = 2`: `n` with a curly tail. + + `n = 'earless-corner-straight'`, `cv22 = 3`: Earless (corner top-left) `n` with straight ending. + + `n = 'earless-corner-tailed'`, `cv22 = 4`: Earless (corner top-left) `n` with a curly tail. + + `n = 'earless-rounded-straight'`, `cv22 = 5`: Earless (rounded top-left) `n` with straight ending. + + `n = 'earless-rounded-tailed'`, `cv22 = 6`: Earless (rounded top-left) `n` with a curly tail. + + `n = 'motion-serifed-straight'`, `cv22 = 7`: `n` with motion serifs and straight ending. + + `n = 'motion-serifed-tailed'`, `cv22 = 8`: `n` with motion serifs and a curly tail. + - Styles for `p`: + + `p = 'eared'`, `cv23 = 1`: `p` with top-left ear (default). + + `p = 'earless-corner'`, `cv23 = 2`: `p` without top-left ear (corner). + + `p = 'earless-rounded'`, `cv23 = 3`: `p` without top-left ear (rounded). + + `p = 'motion-serifed'`, `cv23 = 4`: `p` with motion serifs. + - Styles for `q`: + + `q = 'straight'`, `cv24 = 1`: `q` with straight bar (default). + + `q = 'tailed'`, `cv24 = 2`: `q` with tail. + + `q = 'earless-corner'`, `cv24 = 3`: Earless (cornered top-left) single-storey `q`. + + `q = 'earless-corner-tailed'`, `cv24 = 4`: Earless (cornered top-left) single-storey `q` with curly tail. + + `q = 'earless-rounded'`, `cv24 = 5`: Earless (rounded top-left) single-storey `q`. + + `q = 'earless-rounded-tailed'`, `cv24 = 6`: Earless (rounded top-left) single-storey `q` with curly tail. + - Styles for `r`: + + `r = 'straight'`, `cv25 = 1`: Straight, serif-less `r` (default for Sans). + + `r = 'serifed'`, `cv25 = 2`: `r` with serif at both top and bottom (default for Slab Upright). + + `r = 'top-serifed'`, `cv25 = 3`: `r` with serifs at top-left only (default for Slab Italic). + + `r = 'earless-corner'`, `cv25 = 4`: Earless (corner top-left), serif-less `r`. + + `r = 'earless-rounded'`, `cv25 = 5`: Earless (rounded top-left), serif-less `r`. + - Styles for `t`: + + `t = 'standard'`, `cv26 = 1`: Standard `t` shape (default). + + `t = 'cross'`, `cv26 = 2`: Futura-like `t` shape. + + `t = 'flat-hook'`, `cv26 = 3`: `t` with flat hook. + + `t = 'hookless-asymmetric'`, `cv26 = 4`: `t` without hook and ony half the cross bar. + + `t = 'flat-hook-short-neck'`, `cv26 = 5`: `t` with flat hook and a slightly shorter neck. + + `t = 'flat-hook-short-neck2'`, `cv26 = 6`: `t` with flat hook and a more shorter neck. + - Styles for `u`: + + `u = 'with-bar'`, `cv27 = 1`: Normal `u` with right bar (default for Upright). + + `u = 'without-bar'`, `cv27 = 2`: Normal `u` without right bar, like a smaller uppercase `U`. + + `u = 'tailed'`, `cv27 = 3`: `u` with right bar and a slightly curly tail (default for Italic). + + `u = 'motion-serifed'`, `cv27 = 4`: Normal `u` with right bar and motion serifs. + + `u = 'motion-serifed-tailed'`, `cv27 = 5`: `u` with right bar, motion serifs and a slightly curly tail. + - Styles for `v`, `V`: + + `v = 'straight'`, `cv28 = 1`: Standard, straight `V` and `v` (default). + + `v = 'curly'`, `cv28 = 2`:  Slightly curly `V` and `v`, like Iosevka 2.x. + - Styles for `w`, `W`: + + `w = 'straight'`, `cv29 = 1`: Standard, straight `W` and `w` (default). + + `w = 'curly'`, `cv29 = 2`: Slightly curly `W` and `w`, like Iosevka 2.x. + + `w = 'straight-flat-top'`, `cv29 = 3`: Standard, straight `W` and `w`, and the middle is forced to be aligned the top. + - Styles for `x`, `X`: + + `x = 'straight'`, `cv30 = 1`: Standard, straight `X` and `x` (default). + + `x = 'curly'`, `cv30 = 2`: Slightly curly `X` and `x`, like Iosevka 2.x. + - Styles for `y`: + + `y = 'straight'`, `cv31 = 1`: Letter `y` that is fully straight (default for Sans Upright). + + `y = 'straight-turn'`, `cv31 = 2`: Letter `y` with straight upper and a tail turns leftward (default for Slab Upright). + + `y = 'curly'`, `cv31 = 3`: More curly letter `y`, like Iosevka 2.x. + + `y = 'cursive'`, `cv31 = 4`: Cursive-like `y` (default for Italic). + - Styles for `z`, `Z`: + + `z = 'standard'`, `cv32 = 1`: Standard `Z` and `z` (default). + + `z = 'with-crossbar'`, `cv32 = 2`: `Z` and `z` with a diagonal cross bar for better dsitinction with `2`. + + `z = 'with-horizontal-crossbar'`, `cv32 = 3`: `Z` and `z` with a horizontal cross bar for better dsitinction with `2`. + - Styles for `ß`: + + `eszet = 'traditional'`, `cv33 = 1`: Traditional, Fraktur-like Eszet. + + `eszet = 'sulzbacher'`, `cv33 = 2`: A more modern, beta-like Eszet (default). + + `eszet = 'longs-s-lig'`, `cv33 = 3`: An Eszet shown as a ligature of long-S (`ſ`) and `s`. + - Styles for `λ`: + + `lambda = 'straight'`, `cv34 = 1`: More-straight letter `λ` (default). + + `lambda = 'curly'`, `cv34 = 2`: More curly letter `λ`, like Iosevka 2.x. + - Styles for `0`: + + `zero = 'slashed'`, `cv35 = 1`: Slashed Zero `0` (default). + + `zero = 'dotted'`, `cv35 = 2`: Dotted Zero `0`. + + `zero = 'unslashed'`, `cv35 = 3`: O-like `0`. + + `zero = 'reverse-slashed'`, `cv35 = 4`: Reverse-slashed `0`. + + `zero = 'long-dotted'`, `cv35 = 5`: Long-dotted Zero `0` like Hack. + - Styles for `1`: + + `one = 'nobase'`, `cv36 = 1`: `1` with bottom serif (default for Sans). + + `one = 'base'`, `cv36 = 2`: `1` without bottom serif (default for Slab). + + `one = 'line'`, `cv36 = 3`: `1` drawn just like a straight line. + - Styles for `3`: + + `three = 'flattop'`, `cv37 = 1`: Flat top `3` (Like Museo Sans / Montserrat). + + `three = 'twoarcs'`, `cv37 = 2`: Arched top `3` (default). + - Styles for `4`: + + `four = 'closed'`, `cv38 = 1`: `4` with closed contour (default). + + `four = 'closed-non-crossing'`, `cv38 = 2`: `4` with closed contour but the horizontal bar does not overflow the vertical bar. + + `four = 'semi-open'`, `cv38 = 3`: `4` with semi-open contour. + + `four = 'semi-open-non-crossing'`, `cv38 = 4`: `4` with semi-open contour but the horizontal bar does not overflow the vertical bar. + + `four = 'open'`, `cv38 = 5`: `4` with open contour. + + `four = 'open-non-crossing'`, `cv38 = 6`: `4` with open contour but the horizontal bar does not overflow the vertical bar. + - Styles for `6`: + + `six = 'closed-contour'`, `cv40 = 1`: `6` with a more closed contour. + + `six = 'open-contour'`, `cv40 = 2`: `6` with a more open contour. + + `six = 'straight-bar'`, `cv40 = 3`: `6` with a straight bar (default). + - Styles for `7`: + + `seven = 'noserif'`, `cv41 = 1`: `7` without serif (default for Sans). + + `seven = 'serifed'`, `cv41 = 2`: `7` with initial serif (default for Slab). + + `seven = 'crossbar'`, `cv41 = 3`: `7` with crossbar. + + `seven = 'crossbar-serifed'`, `cv41 = 4`: `7` with crossbar and initial serif. + - Styles for `9`: + + `nine = 'closed-contour'`, `cv42 = 1`: `9` with a more closed contour. + + `nine = 'open-contour'`, `cv42 = 2`: `9` with a more open contour. + + `nine = 'straight-bar'`, `cv42 = 3`: `9` with a straight bar (default). + - Styles for `~`: + + `tilde = 'high'`, `cv43 = 1`: Higher tilde `~`. + + `tilde = 'low'`, `cv43 = 2`: Lower tilde `~` (default). + - Styles for `*`: + + `asterisk = 'high'`, `cv44 = 1`: Higher five-pointed asterisk `*` (default). + + `asterisk = 'low'`, `cv44 = 2`: Lower five-pointed asterisk `*`. + + `asterisk = 'hexhigh'`, `cv44 = 3`: Higher six-pointed asterisk `*`. + + `asterisk = 'hexlow'`, `cv44 = 4`: Lower six-pointed asterisk `*`. + + `asterisk = 'flip-penta-high'`, `cv44 = 5`: Higher five-pointed and turned asterisk `*`. + + `asterisk = 'flip-penta-low'`, `cv44 = 6`: Lower five-pointed and turned asterisk `*`. + - Styles for `_`: + + `underscore = 'high'`, `cv45 = 1`: Higher underscore `_`, placed right below baseline (default). + + `underscore = 'low'`, `cv45 = 2`: Lower underscore `_`, placed right above descender line. + + `underscore = 'above-baseline'`, `cv45 = 3`: Extra-high `_`, placed right below baseline. + - Styles for `¶`: + + `paragraph-sign = 'high'`, `cv46 = 1`: Higher paragraph sign `¶` (default). + + `paragraph-sign = 'low'`, `cv46 = 2`: Lower paragraph sign `¶`. + - Styles for `^`: + + `caret = 'high'`, `cv47 = 1`: Higher circumflex `^` (default). + + `caret = 'low'`, `cv47 = 2`: Lower circumflex `^`. + - Styles for `(`, `)`: + + `paren = 'normal'`, `cv48 = 1`: Parenthesis with normal contour. + + `paren = 'large-contour'`, `cv48 = 2`: Parenthesis with larger contour, like that in Monaco. + - Styles for `{`, `}`: + + `brace = 'straight'`, `cv49 = 1`: More straight braces. + + `brace = 'curly'`, `cv49 = 2`: More curly braces. + - Styles for `#`: + + `number-sign = 'upright'`, `cv50 = 1`: Number sign with vertical bars (default). + + `number-sign = 'slanted'`, `cv50 = 2`: Number sign with slanted bars. + + `number-sign = 'upright-open'`, `cv50 = 3`: Number sign with vertical bars and open inner. + + `number-sign = 'slanted-open'`, `cv50 = 4`: Number sign with slanted bars and open inner. + - Styles for `&`: + + `ampersand = 'closed'`, `cv51 = 1`: Ampersand (`&`) with a closed contour (default). + + `ampersand = 'upper-open'`, `cv51 = 2`: Ampersand (`&`) with an open contour at upper half. + + `ampersand = 'lower-open'`, `cv51 = 3`: Ampersand (`&`) with an open contour at lower half. + + `ampersand = 'et'`, `cv51 = 4`: Ampersand (`&`) drawn like a ligature of Ɛ and t. + + `ampersand = 'et-toothed'`, `cv51 = 5`: Ampersand (`&`) drawn like a ligature of Ɛ and t with tooth. + + `ampersand = 'flat-top'`, `cv51 = 6`: Ampersand (`&`) drawn with a flat top. + - Styles for `@`: + + `at = 'threefold'`, `cv52 = 1`: The long, three-fold At symbol (`@`) (default). + + `at = 'fourfold'`, `cv52 = 2`: The traditional, four-fold At symbol (`@`). + + `at = 'short'`, `cv52 = 3`: The shorter, Fira-like At symbol (`@`). + - Styles for `$`: + + `dollar = 'open'`, `cv53 = 1`: Dollar symbol with open contour. + + `dollar = 'through'`, `cv53 = 2`: Dollar symbol with strike-through vertical bar (default). + + `dollar = 'opencap'`, `cv53 = 3`: Dollar symbol with open contour, not exceeding baseline and ascender. + + `dollar = 'throughcap'`, `cv53 = 4`: Dollar symbol with strike-through vertical bar, not exceeding baseline and ascender. + - Styles for `%`: + + `percent = 'dots'`, `cv54 = 1`: Percent `%`, Per-mille `‰` and basis point `‱` using rectangular dots. + + `percent = 'rings'`, `cv54 = 2`: Percent `%` with rings and broken bar; Per-mille `‰` and basis point `‱` with rings (default). + + `percent = 'rings-connected'`, `cv54 = 3`: Percent `%`, Per-mille `‰` and basis point `‱` using rings and continuous bar. + - Styles for `|`: + - Styles for `<=`, `>=`: + + `lig-ltgteq = 'flat'`, `cv56 = 1`: The lower bar of `<=` and `>=` ligation is flat. + + `lig-ltgteq = 'slanted'`, `cv56 = 2`: The lower bar of `<=` and `>=` ligation is slanted. + - Styles for `'`: + + `ascii-single-quote = 'straight'`, `cv57 = 1`: Show ASCII quote (`'`) as short vertical straight bar. (default). + + `ascii-single-quote = 'raised-comma'`, `cv57 = 2`: Show ASCII quote (`'`) as raised comma.. + - Styles for `` ` ``: + + `ascii-grave = 'straight'`, `cv58 = 1`: Show ASCII grave (`` ` ``) as short diagonal straight bar. (default). + + `ascii-grave = 'raised-inverse-comma'`, `cv58 = 2`: Show ASCII grave (`` ` ``) as raised comma.. -### Using Docker +#### Configuring Weights, Widths and Slopes -Refer to these [instructions.](https://github.com/ejuarezg/containers/tree/master/iosevka_font#container-method-1) +Subsection `weights` is used to change the weight grades that the custom family needs. It is a dictionary of sub-objects with properties: + +* `shape`: Integer, configures the weight grade of the glyphs' shapes. +* `menu`: Integer, configures the weight grade used when naming fonts. +* `css`: Integer, configures the weight grade used in web font CSS. + +Subsection `widths` is used to change the weight grades that the custom family needs. It is a dictionary of sub-objects with properties: + +* `shape`: Integer, configures the width of the glyphs' shapes, measured in 1/1000 em. +* `menu`: Integer, configures the width grade used when naming fonts. The valid values are `1` to `9`, inclusive. +* `css`: String, configures the [font-stretch](https://developer.mozilla.org/en-US/docs/Web/CSS/font-stretch) value used in web font CSS. + +Subsection `slopes` is a simple string-to-string dictionary maps slopes (`upright`, `italic` or `oblique`) to [CSS font-style](https://developer.mozilla.org/zh-CN/docs/Web/CSS/font-style) values, represented in string. + +#### Compatibility Ligatures + +Certain software, notably Emacs, relies on pre-encoded ligatures instead of OpenType to provide ligations. Iosevka could be configured with additional subsection `compatibility-ligatures`, being an array of records with following fields: + +* `unicode`: The PUA code point being assigned to. +* `featureTag`: The feature tag to compute ligations. +* `sequence`: The source character sequence. + +A sample of compatibility ligature config is: + +```toml +[[buildPlans.iosevka-custom.compatibility-ligatures]] +unicode = 57600 # 0xE100 +featureTag = 'calt' +sequence = '<*>' +``` + +#### Sample Configuration + +A sample configuration could be found at [private-build-plans.sample.toml](private-build-plans.sample.toml): + + + + +```toml +[buildPlans.iosevka-custom] # is your plan name +family = "Iosevka Custom" # Font menu family name +spacing = "normal" # Optional; Values: `normal`, `term`, `fontconfig-mono`, or `fixed` +serifs = "sans" # Optional; Values: `sans` or `slab` +digit-form = "lining" # Optional; Values `lining` or `old-style` + +################################################################################################### +# Configure variants + +# Optional; Whether to inherit a `ss##` variant +[buildPlans.iosevka-custom.variants] +inherits = "ss01" + +# Optional; Configure single character's variant +[buildPlans.iosevka-custom.variants.design] +g = 'singlestorey' + +# Optional; Configure single character's variant for Upright and Oblique; Overrides [design] +[buildPlans.iosevka-custom.variants.upright] +i = 'zshaped' +l = 'zshaped' + +# Optional; Configure single character's variant for Italic only; Overrides [design] +[buildPlans.iosevka-custom.variants.italic] +i = 'italic' +l = 'italic' + +# End variant section +################################################################################################### + +################################################################################################### +# Configure ligations + +[buildPlans.iosevka-custom.ligations] +inherits = "calt" # Optional; inherits an existing ligation set +disables = [] # Optional; disable specific ligation groups, overrides inherited ligation set +enables = [] # Optional; enable specific ligation groups, overrides inherited ligation set + +# End ligation section +################################################################################################### + + +################################################################################################### +# Override default building weights +# When buildPlans..weights is absent, all weights would built and mapped to +# default values. +# IMPORTANT : Currently "menu" and "css" property only support numbers between 0 and 1000. +# and "shape" properly only supports number between 100 and 900 (inclusive). +# If you decide to use custom weights you have to define all the weights you +# plan to use otherwise they will not be built. +[buildPlans.iosevka-custom.weights.regular] +shape = 400 # Weight for glyph shapes. +menu = 400 # Weight for the font's names. +css = 400 # Weight for webfont CSS. + +[buildPlans.iosevka-custom.weights.book] +shape = 450 +menu = 450 # Use 450 here to name the font's weight "Book" +css = 450 + +[buildPlans.iosevka-custom.weights.bold] +shape = 700 +menu = 700 +css = 700 + +# End weight section +################################################################################################### + +################################################################################################### +# Override default building slope sets +# Format: = <"normal"|"italic"|"oblique"> +# When this section is absent, all slopes would be built. + +[buildPlans.iosevka-custom.slopes] +upright = "normal" +italic = "italic" +oblique = "oblique" + +# End slope section +################################################################################################### + +################################################################################################### +# Override default building widths +# When buildPlans..widths is absent, all widths would built and mapped to +# default values. +# IMPORTANT : Currently "shape" property only supports numbers between 434 and 664 (inclusive), +# while "menu" only supports integers between 1 and 9 (inclusive). +# The "shape" parameter specifies the unit width, measured in 1/1000 em. The glyphs' +# width are equal to, or a simple multiple of the unit width. +# If you decide to use custom widths you have to define all the widths you plan to use, +# otherwise they will not be built. + +[buildPlans.iosevka-custom.widths.normal] +shape = 500 # Unit Width, measured in 1/1000 em. +menu = 5 # Width grade for the font's names. +css = "normal" # "font-stretch' property of webfont CSS. + +[buildPlans.iosevka-custom.widths.extended] +shape = 576 +menu = 7 +css = "expanded" + +# End width section +################################################################################################### + +################################################################################################### +# Character Exclusion +# Specify character ranges in the section below to exclude certain characters from the font being +# built. Remove this section when this feature is not needed. + +[buildPlans.iosevka-custom.exclude-chars] +ranges = [[10003, 10008]] + +# End character exclusion +################################################################################################### + +################################################################################################### +# Compatibility Ligatures +# Certain applications like Emacs does not support proper programming liagtures provided by +# OpenType, but can support ligatures provided by PUA codepoints. Therefore you can edit the +# following section to build PUA characters that are generated from the OpenType ligatures. +# Remove this section when compatibility ligatures are not needed. + +[[buildPlans.iosevka-custom.compatibility-ligatures]] +unicode = 57600 # 0xE100 +featureTag = 'calt' +sequence = '<*>' + +# End compatibility ligatures section +################################################################################################### + +################################################################################################### +# Metric overrides +# Certain metrics like line height (leading) could be overridden in your build plan file. +# Edit the values to change the metrics. Remove this section when overriding is not needed. + +[buildPlans.iosevka-custom.metric-override] +leading = 1250 +winMetricAscenderPad = 0 +winMetricDescenderPad = 0 +powerlineScaleY = 1 +powerlineScaleX = 1 +powerlineShiftY = 0 +powerlineShiftX = 0 + +# End metric override section +################################################################################################### +``` + + ## For Chinese and Japanese users... @@ -638,4 +689,4 @@ Refer to these [instructions.](https://github.com/ejuarezg/containers/tree/maste --- -![Family Matrix](https://raw.githubusercontent.com/be5invis/Iosevka/master/images/matrix.png) +![Family Matrix](images/matrix.png) diff --git a/build-plans.toml b/build-plans.toml index 2cf97a080..502675b98 100644 --- a/build-plans.toml +++ b/build-plans.toml @@ -46,7 +46,7 @@ family = "Iosevka Curly" snapshotFamily = 'iosevka' snapshotFeature = '"ss20" on' [buildPlans.iosevka-curly.variants] -inherits = ["ss20"] +inherits = "ss20" [buildPlans.iosevka-fixed-curly] family = "Iosevka Fixed Curly" @@ -54,7 +54,7 @@ spacing = "fixed" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss20" on' [buildPlans.iosevka-fixed-curly.variants] -inherits = ["ss20"] +inherits = "ss20" [buildPlans.iosevka-term-curly] family = "Iosevka Term Curly" @@ -62,7 +62,7 @@ spacing = "term" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss20" on' [buildPlans.iosevka-term-curly.variants] -inherits = ["ss20"] +inherits = "ss20" # Curly Slab [buildPlans.iosevka-curly-slab] @@ -71,7 +71,7 @@ serifs = "slab" snapshotFamily = 'iosevka-slab' snapshotFeature = '"ss20" on' [buildPlans.iosevka-curly-slab.variants] -inherits = ["ss20"] +inherits = "ss20" [buildPlans.iosevka-fixed-curly-slab] family = "Iosevka Fixed Curly Slab" @@ -80,7 +80,7 @@ spacing = "fixed" snapshotFamily = 'iosevka-slab' snapshotFeature = '"NWID" on, "ss20" on' [buildPlans.iosevka-fixed-curly-slab.variants] -inherits = ["ss20"] +inherits = "ss20" [buildPlans.iosevka-term-curly-slab] family = "Iosevka Term Curly Slab" @@ -89,7 +89,7 @@ spacing = "term" snapshotFamily = 'iosevka-slab' snapshotFeature = '"NWID" on, "ss20" on' [buildPlans.iosevka-term-curly-slab.variants] -inherits = ["ss20"] +inherits = "ss20" ################################################################################################### # SSxx @@ -106,7 +106,7 @@ spacing = "fixed" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss01" on' [buildPlans.iosevka-fixed-ss01.variants] -inherits = ["ss01"] +inherits = "ss01" [buildPlans.iosevka-term-ss01] family = "Iosevka Term SS01" @@ -114,7 +114,7 @@ spacing = "term" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss01" on' [buildPlans.iosevka-term-ss01.variants] -inherits = ["ss01"] +inherits = "ss01" [buildPlans.iosevka-ss02] @@ -130,7 +130,7 @@ spacing = "fixed" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss02" on' [buildPlans.iosevka-fixed-ss02.variants] -inherits = ["ss02"] +inherits = "ss02" [buildPlans.iosevka-term-ss02] family = "Iosevka Term SS02" @@ -138,7 +138,7 @@ spacing = "term" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss02" on' [buildPlans.iosevka-term-ss02.variants] -inherits = ["ss02"] +inherits = "ss02" [buildPlans.iosevka-ss03] @@ -154,7 +154,7 @@ spacing = "fixed" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss03" on' [buildPlans.iosevka-fixed-ss03.variants] -inherits = ["ss03"] +inherits = "ss03" [buildPlans.iosevka-term-ss03] family = "Iosevka Term SS03" @@ -162,7 +162,7 @@ spacing = "term" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss03" on' [buildPlans.iosevka-term-ss03.variants] -inherits = ["ss03"] +inherits = "ss03" [buildPlans.iosevka-ss04] @@ -178,7 +178,7 @@ spacing = "fixed" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss04" on' [buildPlans.iosevka-fixed-ss04.variants] -inherits = ["ss04"] +inherits = "ss04" [buildPlans.iosevka-term-ss04] family = "Iosevka Term SS04" @@ -186,7 +186,7 @@ spacing = "term" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss04" on' [buildPlans.iosevka-term-ss04.variants] -inherits = ["ss04"] +inherits = "ss04" [buildPlans.iosevka-ss05] @@ -202,7 +202,7 @@ spacing = "fixed" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss05" on' [buildPlans.iosevka-fixed-ss05.variants] -inherits = ["ss05"] +inherits = "ss05" [buildPlans.iosevka-term-ss05] family = "Iosevka Term SS05" @@ -210,7 +210,7 @@ spacing = "term" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss05" on' [buildPlans.iosevka-term-ss05.variants] -inherits = ["ss05"] +inherits = "ss05" [buildPlans.iosevka-ss06] @@ -226,7 +226,7 @@ spacing = "fixed" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss06" on' [buildPlans.iosevka-fixed-ss06.variants] -inherits = ["ss06"] +inherits = "ss06" [buildPlans.iosevka-term-ss06] family = "Iosevka Term SS06" @@ -234,7 +234,7 @@ spacing = "term" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss06" on' [buildPlans.iosevka-term-ss06.variants] -inherits = ["ss06"] +inherits = "ss06" [buildPlans.iosevka-ss07] @@ -250,7 +250,7 @@ spacing = "fixed" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss07" on' [buildPlans.iosevka-fixed-ss07.variants] -inherits = ["ss07"] +inherits = "ss07" [buildPlans.iosevka-term-ss07] family = "Iosevka Term SS07" @@ -258,7 +258,7 @@ spacing = "term" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss07" on' [buildPlans.iosevka-term-ss07.variants] -inherits = ["ss07"] +inherits = "ss07" # The SS08 has curly bars, so apply ss20 first @@ -275,7 +275,7 @@ spacing = "fixed" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss08" on' [buildPlans.iosevka-fixed-ss08.variants] -inherits = ["ss08"] +inherits = "ss08" [buildPlans.iosevka-term-ss08] family = "Iosevka Term SS08" @@ -283,7 +283,7 @@ spacing = "term" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss08" on' [buildPlans.iosevka-term-ss08.variants] -inherits = ["ss08"] +inherits = "ss08" [buildPlans.iosevka-ss09] @@ -299,7 +299,7 @@ spacing = "fixed" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss09" on' [buildPlans.iosevka-fixed-ss09.variants] -inherits = ["ss09"] +inherits = "ss09" [buildPlans.iosevka-term-ss09] family = "Iosevka Term SS09" @@ -307,7 +307,7 @@ spacing = "term" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss09" on' [buildPlans.iosevka-term-ss09.variants] -inherits = ["ss09"] +inherits = "ss09" [buildPlans.iosevka-ss10] @@ -323,7 +323,7 @@ spacing = "fixed" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss10" on' [buildPlans.iosevka-fixed-ss10.variants] -inherits = ["ss10"] +inherits = "ss10" [buildPlans.iosevka-term-ss10] family = "Iosevka Term SS10" @@ -331,7 +331,7 @@ spacing = "term" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss10" on' [buildPlans.iosevka-term-ss10.variants] -inherits = ["ss10"] +inherits = "ss10" [buildPlans.iosevka-ss11] @@ -347,7 +347,7 @@ spacing = "fixed" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss11" on' [buildPlans.iosevka-fixed-ss11.variants] -inherits = ["ss11"] +inherits = "ss11" [buildPlans.iosevka-term-ss11] family = "Iosevka Term SS11" @@ -355,7 +355,7 @@ spacing = "term" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss11" on' [buildPlans.iosevka-term-ss11.variants] -inherits = ["ss11"] +inherits = "ss11" [buildPlans.iosevka-ss12] @@ -371,7 +371,7 @@ spacing = "fixed" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss12" on' [buildPlans.iosevka-fixed-ss12.variants] -inherits = ["ss12"] +inherits = "ss12" [buildPlans.iosevka-term-ss12] family = "Iosevka Term SS12" @@ -379,7 +379,7 @@ spacing = "term" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss12" on' [buildPlans.iosevka-term-ss12.variants] -inherits = ["ss12"] +inherits = "ss12" [buildPlans.iosevka-ss13] @@ -395,7 +395,7 @@ spacing = "fixed" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss13" on' [buildPlans.iosevka-fixed-ss13.variants] -inherits = ["ss13"] +inherits = "ss13" [buildPlans.iosevka-term-ss13] family = "Iosevka Term SS13" @@ -403,7 +403,7 @@ spacing = "term" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss13" on' [buildPlans.iosevka-term-ss13.variants] -inherits = ["ss13"] +inherits = "ss13" [buildPlans.iosevka-ss14] @@ -419,7 +419,7 @@ spacing = "fixed" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss14" on' [buildPlans.iosevka-fixed-ss14.variants] -inherits = ["ss14"] +inherits = "ss14" [buildPlans.iosevka-term-ss14] family = "Iosevka Term SS14" @@ -427,7 +427,7 @@ spacing = "term" snapshotFamily = 'iosevka' snapshotFeature = '"NWID" on, "ss14" on' [buildPlans.iosevka-term-ss14.variants] -inherits = ["ss14"] +inherits = "ss14" ################################################################################################### diff --git a/font-src/otl/gsub-ligation.ptl b/font-src/otl/gsub-ligation.ptl index b394a444a..3b8cc8aa1 100644 --- a/font-src/otl/gsub-ligation.ptl +++ b/font-src/otl/gsub-ligation.ptl @@ -150,7 +150,7 @@ define [buildLigationsImpl sink para featureName mappedFeature rankedLookups] : set lookupRank : lookupRank + 1 do "Operator centering" - define centerizeGroups : { asterisk_center caret_center tilde_center colon_center [if [hasLG 'dotoper'] period_center nothing]}.filter (x => x) + define centerizeGroups : { asterisk_center caret_center tilde_center colon_center [if [hasLG 'dot-oper'] period_center nothing]}.filter (x => x) do "Bracket-star" CreateLigationLookup : keep-if 'brst' : list diff --git a/font-src/support/gr.js b/font-src/support/gr.js index 3c87086b9..d968d40be 100644 --- a/font-src/support/gr.js +++ b/font-src/support/gr.js @@ -253,11 +253,11 @@ function createGrDisplaySheet(glyphStore, gid) { let charVariantFeatures = []; const decomposition = CvDecompose.get(glyph); if (decomposition) { - const variantFeatureSet = new Set(); + const variantAssignmentSet = new Set(); for (const componentGn of decomposition) { const component = glyphStore.queryByName(componentGn); if (!component) continue; - const cvRow = queryCvFeatureTagsOf(componentGn, component, variantFeatureSet); + const cvRow = queryCvFeatureTagsOf(componentGn, component, variantAssignmentSet); if (cvRow.length) charVariantFeatures.push(cvRow); } } else { @@ -273,7 +273,7 @@ function queryPairFeatureTags(gid, f1, f2, sink) { const re1 = new RegExp(`\\.${f1}$`), re2 = new RegExp(`\\.${f2}$`); if (re1.test(gid) || re2.test(gid)) { - sink.push(f1, f2); + sink.push(`'${f1}' 1`, `'${f2}' 1`); } } } @@ -284,7 +284,7 @@ function byTagPreference(a, b) { if (ua > ub) return 1; return 0; } -function queryCvFeatureTagsOf(gid, glyph, vfs) { +function queryCvFeatureTagsOf(gid, glyph, variantAssignmentSet) { const cvs = AnyCv.query(glyph).sort(byTagPreference); let results = []; let existingGlyphs = new Set(); @@ -294,10 +294,13 @@ function queryCvFeatureTagsOf(gid, glyph, vfs) { if (target === gid) continue; if (existingGlyphs.has(target)) continue; existingGlyphs.add(target); - if (!vfs) results.push(tag); - else if (!vfs.has(tag)) { - results.push(tag); - vfs.add(tag); + + const assignCss = `'${tag}' ${gr.rank}`; + if (!variantAssignmentSet) { + results.push(assignCss); + } else if (!variantAssignmentSet.has(assignCss)) { + results.push(assignCss); + variantAssignmentSet.add(assignCss); } } return results; diff --git a/font-src/support/ligation-data.js b/font-src/support/ligation-data.js index 680c3a82f..e5f6694fc 100644 --- a/font-src/support/ligation-data.js +++ b/font-src/support/ligation-data.js @@ -9,7 +9,8 @@ module.exports = function applyLigationData(data, para, argv) { const hives = {}; hives["default"] = { caltBuildup: [] }; for (const gr in data.simple) { - hives[gr] = { appends: { caltBuildup: [data.simple[gr].ligGroup] } }; + hives["enable-" + gr] = { appends: { caltBuildup: [data.simple[gr].ligGroup] } }; + hives["disable-" + gr] = { removes: { caltBuildup: [data.simple[gr].ligGroup] } }; } for (const gr in data.composite) { const comp = data.composite[gr]; @@ -22,7 +23,7 @@ module.exports = function applyLigationData(data, para, argv) { optInBuildup[comp.tag] = ligSets; } if (!comp.isOptOut) { - hives[gr] = { caltBuildup: ligSets }; + hives["ligset-" + gr] = { caltBuildup: ligSets }; } } @@ -30,7 +31,22 @@ module.exports = function applyLigationData(data, para, argv) { defaultBuildup: { ...optInBuildup, ...optOutBuildup }, caltBuildup: [] }; - if (argv.ligationBuildup) Parameters.apply(para.ligation, hives, [argv.ligationBuildup]); + if (argv.ligations) { + if (argv.ligations.inherits) + Parameters.apply(para.ligation, hives, ["ligset-" + argv.ligations.inherits]); + if (argv.ligations.disables) + Parameters.apply( + para.ligation, + hives, + argv.ligations.disables.map(x => `disable-${x}`) + ); + if (argv.ligations.enables) + Parameters.apply( + para.ligation, + hives, + argv.ligations.enables.map(x => `enable-${x}`) + ); + } }; function createBuildup(simple, buildup) { diff --git a/font-src/support/parameters.js b/font-src/support/parameters.js index ab63c9305..af4b8ec4f 100644 --- a/font-src/support/parameters.js +++ b/font-src/support/parameters.js @@ -48,6 +48,14 @@ function intro(source, style, blendArgs, sink) { for (const k in mu) sink[k] = [...(sink[k] || []), ...mu[k]]; delete hive.appends; } + if (hive.removes) { + const mu = hive.removes; + for (const k in mu) { + const s = new Set(mu[k]); + sink[k] = [...(sink[k] || [])].filter(x => !s.has(x)); + } + delete hive.removes; + } hive = hiveBlend(hive, getBlendArg(blendArgs, style)); for (const k in hive) sink[k] = hive[k]; diff --git a/font-src/support/variant-data.js b/font-src/support/variant-data.js index 383301a3f..3778fe801 100644 --- a/font-src/support/variant-data.js +++ b/font-src/support/variant-data.js @@ -88,10 +88,10 @@ class Composite { } resolve(para, selTree, catalog, vs) { if (this.inherits) { - for (const item of this.inherits) { - if (!catalog.has(item)) throw new Error(`Cannot find composite variant: ${item}`); - catalog.get(item).resolve(para, selTree, catalog, vs); + if (!catalog.has(this.inherits)) { + throw new Error(`Cannot find composite variant: ${this.inherits}`); } + catalog.get(this.inherits).resolve(para, selTree, catalog, vs); } for (const [prime, variant] of this.decompose(para, selTree)) { variant.resolve(para, vs); diff --git a/params/ligation-set.toml b/params/ligation-set.toml index f4ec27a25..ed1d94759 100644 --- a/params/ligation-set.toml +++ b/params/ligation-set.toml @@ -1,195 +1,197 @@ -[simple.calt-center-ops] +[simple.center-ops] ligGroup = 'center-ops' desc = 'Vertically align some of the operators (like `*`) to the center position it is before or after a "center" operator (like `+`)' -[simple.calt-arrow] +[simple.arrow] ligGroup = "arrow" desc = 'Enable ligation set that forms arrows' -[simple.calt-arrow2] +[simple.arrow2] ligGroup = "arrow2" desc = 'Enable ligation for more arrows, like `>>=`' -[simple.calt-trig] +[simple.trig] ligGroup = "trig" desc = 'Enable ligation for `<|`, `|>` , `<||`, and other bar-and-angle-bracket symbols' -[simple.calt-eqeqeq] +[simple.eqeqeq] ligGroup = "eqeqeq" desc = 'Enable special ligation for `===` with triple lines' -[simple.calt-eqeq] +[simple.eqeq] ligGroup = "eqeq" desc = 'Enable ligation for `==` and `===`' -[simple.calt-ineq] +[simple.ineq] ligGroup = "ineq" desc = 'Enable ligation for `<=` and `>=`' -[simple.calt-exeqeq] +[simple.exeqeq] ligGroup = "exeqeq" desc = 'Enable special ligation for `!==` with triple lines' -[simple.calt-eqexeq] +[simple.eqexeq] ligGroup = "eqexeq" desc = 'Enable special ligation for `=!=` with triple lines' -[simple.calt-eqexeq-dl] +[simple.eqexeq-dl] ligGroup = "eqexeq-dl" desc = 'Enable special ligation for `=!=` with double lines' -[simple.calt-exeq] +[simple.exeq] ligGroup = "exeq" desc = 'Enable ligation for `!=` and `!==`' -[simple.calt-exeq-alt-1] +[simple.exeq-alt-1] ligGroup = "exeq-alt-1" desc = 'Enable ligation for `!=` and `!==` with a dot at below for distinction' -[simple.calt-tildeeq] +[simple.tildeeq] ligGroup = "tildeeq" desc = 'Enable ligation for `~=` as inequality' -[simple.calt-eqslasheq] +[simple.eqslasheq] ligGroup = "eqslasheq" desc = 'Enable special triple-line ligation for `=/=` as inequality' -[simple.calt-slasheq] +[simple.slasheq] ligGroup = "slasheq" desc = 'Enable ligation for `/=` and `=/=` as inequality' -[simple.calt-ltgt-ne] +[simple.ltgt-ne] ligGroup = "ltgt-ne" desc = 'Enable ligation for `<>` as inequality' -[simple.calt-ltgt-diamond] +[simple.ltgt-diamond] ligGroup = "ltgt-diamond" desc = 'Enable ligation for `<>` as diamond' -[simple.calt-brst] +[simple.brst] ligGroup = "brst" desc = 'Center asterisk in `(*` and `*)`' -[simple.calt-plusplus] +[simple.plusplus] ligGroup = "plusplus" desc = 'Enable ligation for `++` and further plus-chaining' -[simple.calt-kern-dotty] +[simple.kern-dotty] ligGroup = "kern-dotty" desc = 'Move connecting dotty punctuations closer, like for `::`, `:::` and `...`' -[simple.calt-logic] +[simple.logic] ligGroup = "logic" desc = 'Enable ligation for `/\` and `\/`' -[simple.calt-llgg] +[simple.llgg] ligGroup = "llgg" desc = 'Enable ligation for `<<`, `>>` and other angle-bracket chaining' -[simple.calt-llggeq] +[simple.llggeq] ligGroup = "llggeq" desc = 'Enable ligation for `<<=`, `>>=` as shift operator' -[simple.calt-dotoper] -ligGroup = "dotoper" +[simple.dot-as-operator] +ligGroup = "dot-oper" desc = 'Treat dot (`.`) as operator and perform chained centering' -[simple.calt-arrowZALE] +[simple.lteq-as-arrow] ligGroup = "arrowZALE" desc = 'Treat `<=` as arrow' -[simple.calt-arrowZAGE] +[simple.gteq-as-co-arrow] ligGroup = "arrowZAGE" desc = 'Treat `>=` as co-arrow' -[simple.calt-html-comment] +[simple.html-comment] ligGroup = "html-comment" desc = 'Enable ligation for `