From 2338a8cf6d6d5ae33447f8c6e61e41c487f3a57b Mon Sep 17 00:00:00 2001 From: Ants Aare Alamaa Date: Mon, 13 Jul 2026 01:08:10 +0200 Subject: [PATCH 1/5] added prefixed units, where the unit comes before the value. --- src/units.typ | 24 ++++++++++++++++++------ src/zi.typ | 8 ++++---- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/units.typ b/src/units.typ index aad02fe..c53cfc2 100644 --- a/src/units.typ +++ b/src/units.typ @@ -308,6 +308,7 @@ value, unit, alt: auto, + prefixed: false, ..args, ) = context { let unit = unit @@ -357,12 +358,7 @@ } let breakable = utility.process-breakable(num-state.breakable) - let result = { - num(value, state: num-state, force-parentheses-around-uncertainty: true) - sym.wj - separator - if not breakable.unit { sym.wj } - show-unit( + let unit-content = show-unit( unit.numerator, unit.denominator, fraction: num-state.unit.fraction, @@ -376,6 +372,22 @@ float(info.int + "." + info.frac) }, ) + let result = { + if prefixed { + unit-content + sym.wj + separator + if not breakable.unit { sym.wj } + } + + num(value, state: num-state, force-parentheses-around-uncertainty: true) + + if not prefixed { + sym.wj + separator + if not breakable.unit { sym.wj } + unit-content + } } result diff --git a/src/zi.typ b/src/zi.typ index cb331c4..86f496d 100644 --- a/src/zi.typ +++ b/src/zi.typ @@ -1,12 +1,12 @@ #import "units.typ" -#let declare(alt: auto, ..unit) = { +#let declare(alt: auto, prefixed:false, ..unit) = { assert(unit.named().len() == 0, ) (..value) => if value.pos().len() == 0 { - units.unit(units.parse-unit(..unit.pos()), ..value, alt: alt) + units.unit(units.parse-unit(..unit.pos()), ..value, alt: alt, prefixed: prefixed) } else { - units.qty(..value, units.parse-unit(..unit.pos()), alt: alt) + units.qty(..value, units.parse-unit(..unit.pos()), alt: alt, prefixed: prefixed) } } @@ -117,7 +117,7 @@ #let µH = declare("µH") #let uH = µH #let nH = declare("nH") -#let pH = declare("pH") +#let pH = declare("pH", prefixed: true) #let mC = declare("mC") #let nC = declare("nC") #let µC = declare("µC") From d94968e1d63fa0344a7d240c53f3d049d1618127 Mon Sep 17 00:00:00 2001 From: Ants Aare Alamaa Date: Mon, 13 Jul 2026 01:09:44 +0200 Subject: [PATCH 2/5] added most common currencies to zi --- src/accessibility.typ | 21 +++++++++++++++++++++ src/zi.typ | 27 ++++++++++++++++++++++++++- tests/currency/.gitignore | 4 ++++ tests/currency/ref/1.png | Bin 0 -> 12008 bytes tests/currency/test.typ | 26 ++++++++++++++++++++++++++ 5 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 tests/currency/.gitignore create mode 100644 tests/currency/ref/1.png create mode 100644 tests/currency/test.typ diff --git a/src/accessibility.typ b/src/accessibility.typ index 25bb391..69142fe 100644 --- a/src/accessibility.typ +++ b/src/accessibility.typ @@ -222,6 +222,27 @@ V: "volt", W: "watt", Wb: "weber", + "$": "dollar", + "€": "euro", + "¥": "yen", + "£": "pound", + "Fr.": "franc", + "₹": "rupee", + "₩": "won", + "kr": "krona", + "R": "rand", + "zł": "rand", + "₺": "lira", + "฿": "baht", + "₪": "shekel", + "Ft": "forint", + "Kč": "koruna", + "₱": "peso", + "RM": "ringgit", + "Dhs": "dirham", + "⃁": "riyal", + "₿": "bitcoin", + "Ξ": "ethereum", ), de: ( // identical/similar units are inherited from English diff --git a/src/zi.typ b/src/zi.typ index 86f496d..c2da91e 100644 --- a/src/zi.typ +++ b/src/zi.typ @@ -199,5 +199,30 @@ #let F-m = declare("F/m") #let kWh = declare("kW h") +// the order and if it's included at all is based on https://en.wikipedia.org/wiki/Template:Most_traded_currencies with duplicates removed +#let dollar = declare("$", prefixed: true, alt:"") +#let euro = declare("€") +#let yen = declare("¥", prefixed: true) +#let pound-sterling = declare("£", prefixed: true) +#let francs = declare("Fr.") +#let rupee = declare("₹", prefixed: true) +#let won = declare("₩", prefixed: true) +#let krona = declare("kr") +#let rand = declare("R", prefixed: true) +#let zloty = declare("zł") +#let lira = declare("₺") +#let baht = declare("฿", prefixed: true) +#let shekel = declare("₪", prefixed: true) +#let forint = declare("Ft") +#let koruna = declare("Kč") +#let philipine-peso = declare("₱", prefixed: true) +#let ringgit = declare("RM", prefixed: true) +// unicode symbol for dirham will be added in September 2026 +#let dirham = declare("Dhs", prefixed: true) +#let riyal = declare("⃁") +#let sol = declare([S/], prefixed: true, alt:"sol") -#kWh() \ No newline at end of file + +// two commonly used crypto currencies +#let BTC = declare("₿", prefixed: true) +#let ETH = declare("Ξ", prefixed: true) \ No newline at end of file diff --git a/tests/currency/.gitignore b/tests/currency/.gitignore new file mode 100644 index 0000000..8e21a98 --- /dev/null +++ b/tests/currency/.gitignore @@ -0,0 +1,4 @@ +# generated by tytanic, do not edit + +/diff/ +/out/ diff --git a/tests/currency/ref/1.png b/tests/currency/ref/1.png new file mode 100644 index 0000000000000000000000000000000000000000..1e162c7be8062819258eb1177f5069d8234ce629 GIT binary patch literal 12008 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 Date: Mon, 13 Jul 2026 01:10:08 +0200 Subject: [PATCH 3/5] added percent and promille to zi --- src/zi.typ | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/zi.typ b/src/zi.typ index c2da91e..5fbd012 100644 --- a/src/zi.typ +++ b/src/zi.typ @@ -45,6 +45,8 @@ #let ohm = declare(sym.Omega) #let pascal = declare("Pa") #let radian = declare("rad") +#let percent = declare("%") +#let promille = declare("‰") #let siemens = declare("S") #let sievert = declare("Sv") #let steradian = declare("sr") From 756a83ab4a731cf3a57b4d57ead2e7b736ca37d6 Mon Sep 17 00:00:00 2001 From: Ants Aare Alamaa Date: Mon, 13 Jul 2026 01:10:43 +0200 Subject: [PATCH 4/5] grouped related zi functions together --- src/zi.typ | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/zi.typ b/src/zi.typ index 5fbd012..408c835 100644 --- a/src/zi.typ +++ b/src/zi.typ @@ -45,6 +45,7 @@ #let ohm = declare(sym.Omega) #let pascal = declare("Pa") #let radian = declare("rad") +#let degree = declare(sym.degree) #let percent = declare("%") #let promille = declare("‰") #let siemens = declare("S") @@ -83,14 +84,13 @@ #let dalton = declare("Da") #let day = declare("d") #let decibel = declare("dB") -#let degree = declare(sym.degree) #let electronvolt = declare("eV") #let hectare = declare("ha") -#let hour = declare("h") #let liter = declare("L") #let arcminute = declare(sym.prime) -#let minute = declare("min") #let arcsecond = declare(sym.prime.double) +#let hour = declare("h") +#let minute = declare("min") #let neper = declare("Np") #let tonne = declare("t") #let gram = declare("g") From b890ddfdc0ed10e4f91203a620ee23424bea7f97 Mon Sep 17 00:00:00 2001 From: Ants Aare Alamaa Date: Mon, 13 Jul 2026 01:17:01 +0200 Subject: [PATCH 5/5] fixed accessibility pluralization --- src/accessibility.typ | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/accessibility.typ b/src/accessibility.typ index 69142fe..8c77cee 100644 --- a/src/accessibility.typ +++ b/src/accessibility.typ @@ -486,7 +486,7 @@ #let pluralize = ( en: (unit, count, is-in-denom) => { let singular = units.en.at(unit) - if unit in ("lx", "Hz", "S") { + if unit in ("lx", "Hz", "S", "¥", "₩", "kr", "zł", "฿", "Ft", "Kč", "RM", "Dhs", "₿", "Ξ") { return singular } if unit == sym.degree + "C" {