From 8a248d97d2d5db6f2e3f8d71fb6e6000c831080d Mon Sep 17 00:00:00 2001 From: Mc-Zen <52877387+Mc-Zen@users.noreply.github.com> Date: Fri, 17 Oct 2025 08:57:57 +0200 Subject: [PATCH 01/15] [improve] when shifting decimal point, retain zero integer part --- src/parsing.typ | 31 +++++++++++++++++++++++++++---- src/utility.typ | 7 +++++-- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/parsing.typ b/src/parsing.typ index ae339a6..3365d10 100644 --- a/src/parsing.typ +++ b/src/parsing.typ @@ -226,15 +226,15 @@ ) #assert.eq( decompose-normalized-number-string(".4(2)"), - (sign: "+", int: "0", frac: "4", pm: ("", "2"), e: none) + (sign: "+", int: "0", frac: "4", pm: ("0", "2"), e: none) ) #assert.eq( decompose-normalized-number-string(".4333(2)"), - (sign: "+", int: "0", frac: "4333", pm: ("", "0002"), e: none) + (sign: "+", int: "0", frac: "4333", pm: ("0", "0002"), e: none) ) #assert.eq( decompose-normalized-number-string(".4333(200)"), - (sign: "+", int: "0", frac: "4333", pm: ("", "0200"), e: none) + (sign: "+", int: "0", frac: "4333", pm: ("0", "0200"), e: none) ) #assert.eq( decompose-normalized-number-string(".43(200)"), @@ -246,5 +246,28 @@ ) #assert.eq( decompose-normalized-number-string("2.3(2.9)"), - (sign: "+", int: "2", frac: "3", pm: ("", "29"), e: none) + (sign: "+", int: "2", frac: "3", pm: ("0", "29"), e: none) ) + + +#let parse-numeral(input) = { + + let num-str = number-to-string(input) + if num-str == none { + assert(false, message: "Cannot parse the number `" + repr(it.number) + "`") + } + decompose-normalized-number-string(num-str) +} + +#let compute-eng(num-info) = { + let integer = num-info.int + let fractional = num-info.frac + + if integer.len() > 3 { + calc.quo(integer.len() - 1, 3) * 3 + } else if integer == "0" { + let leading-zeros = fractional.len() - fractional.trim("0", at: start).len() + + -calc.ceil((leading-zeros + 1) / 3) * 3 + } else { 0 } +} \ No newline at end of file diff --git a/src/utility.typ b/src/utility.typ index 4bd798c..4d73803 100644 --- a/src/utility.typ +++ b/src/utility.typ @@ -19,13 +19,16 @@ fractional = "0" * (digits - available-digits) + fractional integer = integer.slice(0, integer.len() - available-digits) } + if integer == "" { + integer = "0" + } return (integer, fractional) } #assert.eq(shift-decimal-left("123", "456", 0), ("123", "456")) #assert.eq(shift-decimal-left("123", "456", 2), ("1", "23456")) -#assert.eq(shift-decimal-left("123", "456", 5), ("", "00123456")) +#assert.eq(shift-decimal-left("123", "456", 5), ("0", "00123456")) #assert.eq(shift-decimal-left("123", "456", -2), ("12345", "6")) #assert.eq(shift-decimal-left("123", "456", -5), ("12345600", "")) #assert.eq(shift-decimal-left("0", "0012", -4), ("12", "")) -#assert.eq(shift-decimal-left("0", "0012", -2), ("", "12")) +#assert.eq(shift-decimal-left("0", "0012", -2), ("0", "12")) From b6b1aaca7120bdaff7883ff677a59a78f1182361 Mon Sep 17 00:00:00 2001 From: Mc-Zen <52877387+Mc-Zen@users.noreply.github.com> Date: Fri, 17 Oct 2025 08:58:26 +0200 Subject: [PATCH 02/15] [add] engineering mode --- src/num.typ | 15 +++++++++++---- src/state.typ | 3 ++- src/units.typ | 35 +++++++++++++++++++++++++++++++++-- 3 files changed, 46 insertions(+), 7 deletions(-) diff --git a/src/num.typ b/src/num.typ index d22bce0..7823d50 100644 --- a/src/num.typ +++ b/src/num.typ @@ -59,11 +59,18 @@ } if "sign" not in info {info.sign = "" } } else { - let num-str = number-to-string(it.number) - if num-str == none { - assert(false, message: "Cannot parse the number `" + repr(it.number) + "`") + info = parse-numeral(it.number) + } + + if it.unit.eng { + let e = if info.e == none { 0 } else { int(info.e) } + let significant-figures = (info.int + info.frac).trim("0").len() + (info.int, info.frac) = utility.shift-decimal-left(info.int, info.frac, -e) + info.e = none + (info.int, info.frac) = utility.shift-decimal-left(info.int, info.frac, parsing.compute-eng(info)) + if info.int != "0" { + info.frac = info.frac.slice(0, calc.max(0, significant-figures - info.int.len())) } - info = decompose-normalized-number-string(num-str) } /// Maybe shift exponent diff --git a/src/state.typ b/src/state.typ index 3d1d1ed..a78cb77 100644 --- a/src/state.typ +++ b/src/state.typ @@ -26,7 +26,8 @@ unit-separator: sym.space.thin, fraction: "power", breakable: false, - use-sqrt: true + use-sqrt: true, + eng: false ) ) #let num-state = state("num-state", default-state) diff --git a/src/units.typ b/src/units.typ index a41fa52..1170af2 100644 --- a/src/units.typ +++ b/src/units.typ @@ -1,7 +1,8 @@ #import "num.typ": num #import "state.typ": num-state, update-num-state #import "assertations.typ": assert-settable-args - +#import "parsing.typ": parse-numeral, compute-eng +#import "utility.typ" /// [internal function] /// Parse a text-based unit specification. @@ -243,7 +244,8 @@ unit, ..args ) = context { - + let unit = unit + let num-state = update-num-state(num-state.get(), (unit: args.named()) + args.named()) let separator = sym.space.thin @@ -254,6 +256,35 @@ separator = none } + if num-state.unit.eng { + let info = parse-numeral(value) + let e = if info.e == none { 0 } else { int(info.e) } + (info.int, info.frac) = utility.shift-decimal-left(info.int, info.frac, -e) + let eng = compute-eng(info) + + if eng != 0 { + let prefixes = ( + "3": [k], + "6": [M], + "9": [G], + "12": [T], + "15": [P], + "18": [E], + "−3": [m], + "−6": [#sym.mu], + "−9": [n], + "−12": [p], + "−15": [f], + "−18": [a], + ) + + + let prefix = prefixes.at(str(eng)) + assert(unit.numerator.len() != 0) + unit.numerator.first().first() = prefix + unit.numerator.first().first() + } + } + let result = { num(value, state: num-state, force-parentheses-around-uncertainty: true) // force parens around numbers with uncertainty separator From ef9d42ad839f0087e43ce087590b17568fb7bd4d Mon Sep 17 00:00:00 2001 From: Mc-Zen <52877387+Mc-Zen@users.noreply.github.com> Date: Sun, 19 Oct 2025 11:32:41 +0200 Subject: [PATCH 03/15] [replace] `fixed` and `eng` with `exponent` parameter --- src/assertations.typ | 12 ++++++++++++ src/formatting.typ | 4 ++-- src/num.typ | 37 +++++++++++++++++++++++-------------- src/parsing.typ | 22 +++++++++++++++------- src/state.typ | 15 ++++++++++----- src/units.typ | 5 ++--- src/utility.typ | 16 ++++++++-------- tests/num/self/test.typ | 12 ++++++------ tests/table/test.typ | 4 ++-- tests/zi/basic/test.typ | 2 +- 10 files changed, 81 insertions(+), 48 deletions(-) diff --git a/src/assertations.typ b/src/assertations.typ index b2fd811..ef6f3c7 100644 --- a/src/assertations.typ +++ b/src/assertations.typ @@ -44,3 +44,15 @@ assert(false, message: message) } } + + +#let assert-no-fixed(args) = { + return + if "fixed" in args.named() { + let value = str(args.at("fixed")) + assert( + false, + message: "The parameter `fixed` has been removed. Instead use `exponent (fixed: " + value + "`) instead of `fixed: " + value + "`" + ) + } +} \ No newline at end of file diff --git a/src/formatting.typ b/src/formatting.typ index 38b8d52..514a198 100644 --- a/src/formatting.typ +++ b/src/formatting.typ @@ -163,7 +163,7 @@ ) if compact-pm { - pm = pm.map(x => utility.shift-decimal-left(..x, -it.digits)) + pm = pm.map(x => utility.shift-decimal-left(..x, digits: -it.digits)) it.digits = auto } } @@ -215,7 +215,7 @@ let (sign, integer, fractional) = decompose-signed-float-string(it.exponent) let exponent = format-comma-number((sign: sign, int: integer, frac: fractional, digits: auto, group: false, positive-sign: it.positive-sign-exponent, decimal-separator: it.decimal-separator)) - + if it.math { let power = math.attach([#it.base], t: [#exponent]) if it.product == none { (power,) } diff --git a/src/num.typ b/src/num.typ index 7823d50..c20cb8c 100644 --- a/src/num.typ +++ b/src/num.typ @@ -5,6 +5,7 @@ #import "parsing.typ" as parsing: nonum #let update-state(state, args, name: none) = { + assert-no-fixed(args) state.update(s => { assert-settable-args(args, s, name: name) s + args.named() @@ -62,21 +63,26 @@ info = parse-numeral(it.number) } - if it.unit.eng { - let e = if info.e == none { 0 } else { int(info.e) } - let significant-figures = (info.int + info.frac).trim("0").len() - (info.int, info.frac) = utility.shift-decimal-left(info.int, info.frac, -e) - info.e = none - (info.int, info.frac) = utility.shift-decimal-left(info.int, info.frac, parsing.compute-eng(info)) - if info.int != "0" { - info.frac = info.frac.slice(0, calc.max(0, significant-figures - info.int.len())) + if it.exponent != auto { + let new-exponent = if type(it.exponent) == dictionary { + assert( + "fixed" in it.exponent, + message: "Expected key \"shift\", got " + repr(it.exponent) + ) + + it.exponent.fixed + } else if it.exponent == "eng" { + parsing.compute-eng-digits(info) + } else if it.exponent == "sci" { + parsing.compute-sci-digits(info) } - } - /// Maybe shift exponent - if it.fixed != none { let e = if info.e == none { 0 } else { int(info.e) } - let shift(int, frac) = utility.shift-decimal-left(int, frac, it.fixed - e) + // let significant-figures = (info.int + info.frac).trim("0").len() + + let shift = utility.shift-decimal-left.with(digits: new-exponent - e) + + info.e = str(new-exponent).replace("−", "-") (info.int, info.frac) = shift(info.int, info.frac) if info.pm != none { @@ -86,8 +92,9 @@ info.pm = pm.map(x => shift(..x)) } } - - info.e = str(it.fixed).replace("−", "-") + // if info.int != "0" { + // info.frac = info.frac.slice(0, calc.max(0, significant-figures - info.int.len())) + // } } /// Round number and uncertainty @@ -153,6 +160,8 @@ force-parentheses-around-uncertainty: false, ..args ) = { + assert-no-fixed(args) + let inline-args = ( align: align, prefix: prefix, diff --git a/src/parsing.typ b/src/parsing.typ index 3365d10..2703cf5 100644 --- a/src/parsing.typ +++ b/src/parsing.typ @@ -204,7 +204,7 @@ } if normalize-pm { - pm = utility.shift-decimal-left(..pm, fractional.len()) + pm = utility.shift-decimal-left(..pm, digits: fractional.len()) } } if integer == "" { integer = "0" } @@ -259,15 +259,23 @@ decompose-normalized-number-string(num-str) } -#let compute-eng(num-info) = { + +#let compute-sci-digits(num-info) = { let integer = num-info.int let fractional = num-info.frac + let e = if num-info.e == none { 0 } else { int(num-info.e) } - if integer.len() > 3 { - calc.quo(integer.len() - 1, 3) * 3 - } else if integer == "0" { + let exponent = 0 + if integer == "0" { let leading-zeros = fractional.len() - fractional.trim("0", at: start).len() - -calc.ceil((leading-zeros + 1) / 3) * 3 - } else { 0 } + exponent = -leading-zeros - 1 + } else { + exponent = integer.len() - 1 + } + exponent + e +} + +#let compute-eng-digits(num-info) = { + calc.floor(compute-sci-digits(num-info) / 3) * 3 } \ No newline at end of file diff --git a/src/state.typ b/src/state.typ index a78cb77..503de39 100644 --- a/src/state.typ +++ b/src/state.typ @@ -1,15 +1,20 @@ #let default-state = ( + // Mantissa and uncertainty digits: auto, - fixed: none, - product: sym.times, decimal-separator: ".", - tight: false, omit-unity-mantissa: false, + uncertainty-mode: "separate", positive-sign: false, + tight: false, + math: true, + + // Power + product: sym.times, positive-sign-exponent: false, base: 10, - uncertainty-mode: "separate", - math: true, + fixed: none, + exponent: auto, + group: ( size: 3, separator: sym.space.thin, diff --git a/src/units.typ b/src/units.typ index 1170af2..1dbc11c 100644 --- a/src/units.typ +++ b/src/units.typ @@ -1,7 +1,7 @@ #import "num.typ": num #import "state.typ": num-state, update-num-state #import "assertations.typ": assert-settable-args -#import "parsing.typ": parse-numeral, compute-eng +#import "parsing.typ": parse-numeral, compute-eng-digits #import "utility.typ" /// [internal function] @@ -259,8 +259,7 @@ if num-state.unit.eng { let info = parse-numeral(value) let e = if info.e == none { 0 } else { int(info.e) } - (info.int, info.frac) = utility.shift-decimal-left(info.int, info.frac, -e) - let eng = compute-eng(info) + let eng = compute-eng-digits(info) if eng != 0 { let prefixes = ( diff --git a/src/utility.typ b/src/utility.typ index 4d73803..22b675b 100644 --- a/src/utility.typ +++ b/src/utility.typ @@ -4,7 +4,7 @@ /// for `digits` produce a right-shift. Numbers are automatically /// padded with zeros but both integer and fractional parts /// may become "empty" when they are zero. -#let shift-decimal-left(integer, fractional, digits) = { +#let shift-decimal-left(integer, fractional, digits: 0) = { if digits < 0 { let available-digits = calc.min(-digits, fractional.len()) integer += fractional.slice(0, available-digits) @@ -25,10 +25,10 @@ return (integer, fractional) } -#assert.eq(shift-decimal-left("123", "456", 0), ("123", "456")) -#assert.eq(shift-decimal-left("123", "456", 2), ("1", "23456")) -#assert.eq(shift-decimal-left("123", "456", 5), ("0", "00123456")) -#assert.eq(shift-decimal-left("123", "456", -2), ("12345", "6")) -#assert.eq(shift-decimal-left("123", "456", -5), ("12345600", "")) -#assert.eq(shift-decimal-left("0", "0012", -4), ("12", "")) -#assert.eq(shift-decimal-left("0", "0012", -2), ("0", "12")) +#assert.eq(shift-decimal-left("123", "456", digits: 0), ("123", "456")) +#assert.eq(shift-decimal-left("123", "456", digits: 2), ("1", "23456")) +#assert.eq(shift-decimal-left("123", "456", digits: 5), ("0", "00123456")) +#assert.eq(shift-decimal-left("123", "456", digits: -2), ("12345", "6")) +#assert.eq(shift-decimal-left("123", "456", digits: -5), ("12345600", "")) +#assert.eq(shift-decimal-left("0", "0012", digits: -4), ("12", "")) +#assert.eq(shift-decimal-left("0", "0012", digits: -2), ("0", "12")) diff --git a/tests/num/self/test.typ b/tests/num/self/test.typ index 9bb73c8..36043da 100644 --- a/tests/num/self/test.typ +++ b/tests/num/self/test.typ @@ -237,12 +237,12 @@ // fixed exponent -#num("1.234", fixed: -2) \ -#num("1.234", fixed: 1) \ -#num("1e4", fixed: 1) \ -#num("1e-4", fixed: -1) \ -#num("2+-1", fixed: 1) \ -#num("2+-1e1", fixed: 2) \ +#num("1.234", exponent: (fixed: -2)) \ +#num("1.234", exponent: (fixed: 1)) \ +#num("1e4", exponent: (fixed: 1)) \ +#num("1e-4", exponent: (fixed: -1)) \ +#num("2+-1", exponent: (fixed: 1)) \ +#num("2+-1e1", exponent: (fixed: 2)) \ diff --git a/tests/table/test.typ b/tests/table/test.typ index 27b2fed..0baae5b 100644 --- a/tests/table/test.typ +++ b/tests/table/test.typ @@ -35,7 +35,7 @@ #zero.ztable( columns: 2, - format: (auto, (decimal-separator: ",", fixed: 2)), + format: (auto, (decimal-separator: ",", exponent: (fixed: 2))), "2.3", "3422", "10", "101", ) @@ -50,7 +50,7 @@ zero.ztable( columns: 2, - format: (auto, (decimal-separator: ",", fixed: 2)), + format: (auto, (decimal-separator: ",", exponent: (fixed: 2))), [Long title], [Defg], table.hline(), "2.3", "3422", diff --git a/tests/zi/basic/test.typ b/tests/zi/basic/test.typ index 3539c35..4015b40 100644 --- a/tests/zi/basic/test.typ +++ b/tests/zi/basic/test.typ @@ -89,7 +89,7 @@ A #kgm-s2(breakable: true) zi.m-s("2+-2e3"), zi.m-s(uncertainty-mode: "compact", "2+-1"), zi.m-s(uncertainty-mode: "compact-separator", "2+-1"), - zi.m-s(fixed: 1, "2+-1.1"), + zi.m-s(exponent: (fixed: 1), "2+-1.1"), ) #pagebreak() From da229e2698c1989ce83b396a0146653fcf3c2775 Mon Sep 17 00:00:00 2001 From: Mc-Zen <52877387+Mc-Zen@users.noreply.github.com> Date: Mon, 27 Oct 2025 14:36:56 +0100 Subject: [PATCH 04/15] [fix] sign formatting --- src/formatting.typ | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/formatting.typ b/src/formatting.typ index 514a198..e445fa5 100644 --- a/src/formatting.typ +++ b/src/formatting.typ @@ -19,14 +19,14 @@ /// if `positive-sign` is set to true. In all other cases, the result is /// `none`. #let format-sign(sign, positive-sign: false) = { - if sign == "-" { return "−" } - else if sign == "+" and positive-sign { return "+" } + if sign == "-" { return sym.minus } + else if sign == "+" and positive-sign { return sym.plus } } -#assert.eq(format-sign("-", positive-sign: false), "−") +#assert.eq(format-sign("-", positive-sign: false), sym.minus) #assert.eq(format-sign("+", positive-sign: false), none) -#assert.eq(format-sign("-", positive-sign: true), "−") -#assert.eq(format-sign("+", positive-sign: true), "+") +#assert.eq(format-sign("-", positive-sign: true), sym.minus) +#assert.eq(format-sign("+", positive-sign: true), sym.plus) #assert.eq(format-sign(none, positive-sign: true), none) From 62fcdcef8483ac525fa628c4e2aa51060ca38344 Mon Sep 17 00:00:00 2001 From: Mc-Zen <52877387+Mc-Zen@users.noreply.github.com> Date: Mon, 27 Oct 2025 14:50:38 +0100 Subject: [PATCH 05/15] [fix] exponent sign (better) --- src/formatting.typ | 10 +++------- tests/num/identical/ref.typ | 6 +++--- tests/num/identical/ref/1.png | Bin 23674 -> 27509 bytes tests/num/identical/test.typ | 5 +++-- tests/num/self/ref/15.png | Bin 4744 -> 4745 bytes tests/num/self/ref/17.png | Bin 1036 -> 1036 bytes tests/num/self/ref/3.png | Bin 3807 -> 3808 bytes tests/num/self/ref/9.png | Bin 2466 -> 2469 bytes tests/table/ref/2.png | Bin 6969 -> 6970 bytes 9 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/formatting.typ b/src/formatting.typ index e445fa5..a8648d8 100644 --- a/src/formatting.typ +++ b/src/formatting.typ @@ -19,15 +19,11 @@ /// if `positive-sign` is set to true. In all other cases, the result is /// `none`. #let format-sign(sign, positive-sign: false) = { - if sign == "-" { return sym.minus } - else if sign == "+" and positive-sign { return sym.plus } + if sign == "-" { return math.class("unary", sym.minus) } + else if sign == "+" and positive-sign { return math.class("unary", sym.plus) } } -#assert.eq(format-sign("-", positive-sign: false), sym.minus) -#assert.eq(format-sign("+", positive-sign: false), none) -#assert.eq(format-sign("-", positive-sign: true), sym.minus) -#assert.eq(format-sign("+", positive-sign: true), sym.plus) -#assert.eq(format-sign(none, positive-sign: true), none) + diff --git a/tests/num/identical/ref.typ b/tests/num/identical/ref.typ index b30a336..73894b0 100644 --- a/tests/num/identical/ref.typ +++ b/tests/num/identical/ref.typ @@ -4,11 +4,11 @@ #table( $10th 220th 001$, $1times 10^3$, - $-1times 10^3$, + $-1times 10^(−3)$, $1 plus.minus 2$, $(1 plus.minus 2) times 10^1$, $+2$, $1.00^(+0.20)_(-0.10)$, - $1(2)$ + $1(2)$, + $(-2 plus.minus 1) times 10^1$, ) - diff --git a/tests/num/identical/ref/1.png b/tests/num/identical/ref/1.png index ce01a83ecb5a8e77f45ded1b31d5eaf4753929d0..96a3b2298cbe04f027ccba863c9fa38c2ca2ef3d 100644 GIT binary patch literal 27509 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 EKR@%U2><{9 literal 23674 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 diff --git a/tests/num/identical/test.typ b/tests/num/identical/test.typ index ce9748a..ad9ceec 100644 --- a/tests/num/identical/test.typ +++ b/tests/num/identical/test.typ @@ -5,10 +5,11 @@ #table( num[10220001], num[1e3], - num[-1e3], + num[-1e-3], num[1+-2], num[1+-2e1], num(positive-sign: true)[+2], num[1.00+.2-0.1], - num(uncertainty-mode: "compact")[1+-2] + num(uncertainty-mode: "compact")[1+-2], + num[-2+-1e1] ) diff --git a/tests/num/self/ref/15.png b/tests/num/self/ref/15.png index 02380989248232925304708d81d5b473d33ce9ea..ac69a90bf2b68a7b1a219114126ace1a42609ac1 100644 GIT binary patch literal 4745 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 XYujntObOf500000NkvXXu0mjfTz*h5 literal 4744 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 V&(eO-voHVv002ovPDHLkV1nv-AD93D diff --git a/tests/num/self/ref/9.png b/tests/num/self/ref/9.png index 2661bec2c7c8f75e514b8839278d8dc3e760bd1e..70b2f5c6a22b954220e91be78a1898facc98e1e4 100644 GIT binary patch delta 2459 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 Z0u-8E<6W_CEf)X)002ovPDHLkV1kO2rG@|i delta 2456 zcmV;J31{}D6QUE4B!6j1L_t(|+U?tUP!v}J$ML*YJeY(;v$`tannaXSNt9i$pt};q zGrCqZ5d}#i#siFa5kXNR8%0H5 zz))hBB2=^vL{pa>Ki36K-<{YbA*;EFqrV3B3%O{bN~XflmGPCpt4q=Jt#Cnel&4G_ zcMQtuV=hAKR)0)T%zq$NH{wIoFZUZjxr>`2^*CX{imN8XthhJ-je6Cr&WCc3S3H8$ znN{=R^-v~0ybn-r?-589>G_EzqxUA)f_l|FW1uv@D6MybNQlU`M?j^P)8-^Bnp1b+^ zfM*KChu3{5d<>-ytR70{!_YaqxO+QoPn%1uox5hcGI8m=4N;8vdaHB*p{_L&l24yX z7~2t++(VgoefTjOMm%^TfV)=5C{RvL&QGIrXtkhe_t+ePv1<#q1}hVvU9@W|Bi`Qj z5dcqrpntZ&*khjftH?vj#C1VYyBTqX%~k-hoy&ld0#>mCG3z`fR_+Hzy!dqy;W9Z0 zLk|R#e|Dk7%Do{G=L-J>tIpVIpL8~JE$m^5kXn}{L!2iBf|exggh`6TQO1j0o+n2< z*al+l{|wX2CqB?oGCthlvKZ0SnP|*}dE#LtAGA5-unF?;yB@J&@zQjU{c&@|_1ug2A=Qp5LU*8-> zV$PTebHrI>B*bjm0I14HDFAq4Q)4E~6T1@w(L54oLQHiIW&u30sWB7giKB&85T%3< zV3JM;=(RktsWB7gi60PWi1jA*FUwxCR&O3LHD1SrIpPa~M69s}A5Tn;=P_ZP*ngE2 zNiut2s2E&w#LPH^33J3z!Z!vPVK@}xh^g^fCd?6+5+{hckP;}ROpLFD&5$R)&fd6H zHzi`$Evr6gfOr5Y1nmow0WKwC3~G@LdEzZXq(MuVYCbWx2@4=k{EYO3m_rNQ%Mr7s zTh2C*BQ6v?LDLFLKW1A;K97c{Cq^+NrM=UKJ+dQ5)SMZml zx0^>SEgjoD8RGtJYC&r?_$7&%Fqkn%jDhP^<*)`3hciF;P0r1OtrsjQ^g5$ z#ucqP)j`bPLl2y3c^pd3AzL|N-grEbY|=HBgvK{63yRlODhi0Dvh zF7XhTH#8atx2rHV`xK-OEPsQsIya}+G_N|kl>)f^r#1u~64e8jYQ63;=z=q>T7(acI0>-Fj*?HqP(CSnZf1NQEcD*w1d=HJWxV-k=@o zAA54bI4v5_$MsE(_1kV~Fcz^Nkc?;GMP8E6B>?4~i_b;d{{nM~^?y)^Kb5)RWVP%e z?yTaevTgB2P|Ex_TALbkS>Kc|$h!V*`V;l`sCoxlC00|3Rbn-jSS418)l_1YSS5a$ zl0OSx_Z&@9QP8ZgYbvp^3#Bl$=G|&+_tK#Wy4LjsN}aM)Vpik{h~2l^1?X%N(FBco zA3)$Jiy|&529(RM0Dr6WWbywJpAb?2^zcQ!^x1%N&#!@1bN-qhwC>{ptZrFjF~qvt zo7#m!DeaAw)-f=2udmzV5(^vOoU#7LvY2H}U0A@(Ns zK?@+K@smqknNK7vmY5kcVV*dLjDXl{Hm1Z+mIrJs1b;`&88cyy_&rhv+H7(F*gtd0 zaab-fGrq%wIpVWqq(p25LuZP>#}hN-(@dBrb|B>jVqp(h7EKKOlvWENPn=D>A=bJR zxRi*I+Qx+mbHwhX6tw9i-QtPa()DJW#}Vg|zksF}dc%C;`HpP!cw$dd2%0asV)?|< z(y`6siGQD3yMtCvMwv&Pgo-HF*27E=8gYOq9AtM@RZ+5O%;@~Z_f*J#-#`cQBl5q`;C4^2O zLcr2fqHg!Sx@RMO>MW2rDJdl_H97Gij8R6`6TIk$q*Qt;p&GQSArphnK%wj(Q_|8> ze!K`{+8X`>xIj;(rX0KuTE*5+e7ES;8%t^`u}Z8GtEt2)v6@P(605{&D)Dcn{{jpl W=n+?2a?&pV0000`G-aT diff --git a/tests/table/ref/2.png b/tests/table/ref/2.png index 3da0955b6a75bf8e1f3ece23144de2c776292340..d07c40b17433b97b36cdcad701cf5d3d2e086912 100644 GIT binary patch delta 4828 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 z Date: Mon, 27 Oct 2025 14:59:24 +0100 Subject: [PATCH 06/15] [remove] ephemeral test images --- tests/num/identical/.gitignore | 1 + tests/num/identical/ref/1.png | Bin 27509 -> 0 bytes tests/zi/identical/.gitignore | 1 + tests/zi/identical/ref/1.png | Bin 21193 -> 0 bytes 4 files changed, 2 insertions(+) create mode 100644 tests/num/identical/.gitignore delete mode 100644 tests/num/identical/ref/1.png create mode 100644 tests/zi/identical/.gitignore delete mode 100644 tests/zi/identical/ref/1.png diff --git a/tests/num/identical/.gitignore b/tests/num/identical/.gitignore new file mode 100644 index 0000000..db843b2 --- /dev/null +++ b/tests/num/identical/.gitignore @@ -0,0 +1 @@ +/ref \ No newline at end of file diff --git a/tests/num/identical/ref/1.png b/tests/num/identical/ref/1.png deleted file mode 100644 index 96a3b2298cbe04f027ccba863c9fa38c2ca2ef3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27509 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 EKR@%U2><{9 diff --git a/tests/zi/identical/.gitignore b/tests/zi/identical/.gitignore new file mode 100644 index 0000000..db843b2 --- /dev/null +++ b/tests/zi/identical/.gitignore @@ -0,0 +1 @@ +/ref \ No newline at end of file diff --git a/tests/zi/identical/ref/1.png b/tests/zi/identical/ref/1.png deleted file mode 100644 index 164b6722d3726d192791b9bc5c223dfaf61e9e59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21193 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 From 1995b04a4ef5464a9850f629fa12e4bb66df036e Mon Sep 17 00:00:00 2001 From: Mc-Zen <52877387+Mc-Zen@users.noreply.github.com> Date: Mon, 27 Oct 2025 16:16:13 +0100 Subject: [PATCH 07/15] [add] support for a threshold with scientific notation --- src/num.typ | 81 +++++++++++++++++++++++++++++++++-------------------- 1 file changed, 50 insertions(+), 31 deletions(-) diff --git a/src/num.typ b/src/num.typ index c20cb8c..87e25d0 100644 --- a/src/num.typ +++ b/src/num.typ @@ -45,6 +45,55 @@ } +#let process-exponent(info, exponent) = { + let new-exponent = if type(exponent) == dictionary { + assert( + "fixed" in exponent or "sci" in exponent, + message: "Expected key \"fixed\" or \"sci\", got " + repr(exponent) + ) + + if "fixed" in exponent { + exponent.fixed + } else { + let threshold = exponent.sci + if type(threshold) == int { + threshold = (-threshold, threshold) + } + let e = parsing.compute-sci-digits(info) + if e > threshold.at(0) and e < threshold.at(1) { + return info + } + e + } + } else if exponent == "eng" { + parsing.compute-eng-digits(info) + } else if exponent == "sci" { + parsing.compute-sci-digits(info) + } + + let e = if info.e == none { 0 } else { int(info.e) } + // let significant-figures = (info.int + info.frac).trim("0").len() + + let shift = utility.shift-decimal-left.with(digits: new-exponent - e) + + info.e = str(new-exponent).replace("−", "-") + (info.int, info.frac) = shift(info.int, info.frac) + + if info.pm != none { + if type(info.pm.first()) != array { + info.pm = shift(..info.pm) + } else { + info.pm = pm.map(x => shift(..x)) + } + } + // if info.int != "0" { + // info.frac = info.frac.slice(0, calc.max(0, significant-figures - info.int.len())) + // } + + info +} + + #let show-num = it => { @@ -64,37 +113,7 @@ } if it.exponent != auto { - let new-exponent = if type(it.exponent) == dictionary { - assert( - "fixed" in it.exponent, - message: "Expected key \"shift\", got " + repr(it.exponent) - ) - - it.exponent.fixed - } else if it.exponent == "eng" { - parsing.compute-eng-digits(info) - } else if it.exponent == "sci" { - parsing.compute-sci-digits(info) - } - - let e = if info.e == none { 0 } else { int(info.e) } - // let significant-figures = (info.int + info.frac).trim("0").len() - - let shift = utility.shift-decimal-left.with(digits: new-exponent - e) - - info.e = str(new-exponent).replace("−", "-") - (info.int, info.frac) = shift(info.int, info.frac) - - if info.pm != none { - if type(info.pm.first()) != array { - info.pm = shift(..info.pm) - } else { - info.pm = pm.map(x => shift(..x)) - } - } - // if info.int != "0" { - // info.frac = info.frac.slice(0, calc.max(0, significant-figures - info.int.len())) - // } + info = process-exponent(info, it.exponent) } /// Round number and uncertainty From b926f21b1d08b83ce88106de07420fbf593b38ba Mon Sep 17 00:00:00 2001 From: Mc-Zen <52877387+Mc-Zen@users.noreply.github.com> Date: Mon, 27 Oct 2025 16:20:20 +0100 Subject: [PATCH 08/15] [add] tests for scientific exponent --- tests/num/scientific/.gitignore | 5 +++++ tests/num/scientific/ref.typ | 18 ++++++++++++++++++ tests/num/scientific/test.typ | 21 +++++++++++++++++++++ 3 files changed, 44 insertions(+) create mode 100644 tests/num/scientific/.gitignore create mode 100644 tests/num/scientific/ref.typ create mode 100644 tests/num/scientific/test.typ diff --git a/tests/num/scientific/.gitignore b/tests/num/scientific/.gitignore new file mode 100644 index 0000000..03681f9 --- /dev/null +++ b/tests/num/scientific/.gitignore @@ -0,0 +1,5 @@ +# generated by tytanic, do not edit + +diff/** +out/** +ref/** diff --git a/tests/num/scientific/ref.typ b/tests/num/scientific/ref.typ new file mode 100644 index 0000000..07ebc80 --- /dev/null +++ b/tests/num/scientific/ref.typ @@ -0,0 +1,18 @@ +#set page(width: auto, height: auto, margin: .5em) + +$1.23×10^2$ \ +$1.2×10^11$ + +#pagebreak() + +$120$ \ +$1.200×10^3$ \ +$0.01$ \ +$1×10^(-3)$ \ + +#pagebreak() + +$120$ \ +$1.200×10^3$ \ +$0.001$ \ +$1×10^(-4)$ \ diff --git a/tests/num/scientific/test.typ b/tests/num/scientific/test.typ new file mode 100644 index 0000000..724d374 --- /dev/null +++ b/tests/num/scientific/test.typ @@ -0,0 +1,21 @@ +#import "/src/zero.typ": num + +#set page(width: auto, height: auto, margin: .5em) + + +#num(exponent: "sci")[123] \ +#num(exponent: "sci")[12e10] \ + +#pagebreak() + +#num(exponent: (sci: 3))[120] \ +#num(exponent: (sci: 3))[1200] \ +#num(exponent: (sci: 3))[.01] \ +#num(exponent: (sci: 3))[.001] \ + +#pagebreak() + +#num(exponent: (sci: (-4, 3)))[120] \ +#num(exponent: (sci: (-4, 3)))[1200] \ +#num(exponent: (sci: (-4, 3)))[.001] \ +#num(exponent: (sci: (-4, 3)))[.0001] \ \ No newline at end of file From b7924d00a3edb5f87225211df39b8e1e6b0540b1 Mon Sep 17 00:00:00 2001 From: Mc-Zen <52877387+Mc-Zen@users.noreply.github.com> Date: Mon, 27 Oct 2025 16:20:38 +0100 Subject: [PATCH 09/15] [add] tests for fixed exponent --- tests/num/fixed/.gitignore | 5 +++++ tests/num/fixed/ref.typ | 10 ++++++++++ tests/num/fixed/test.typ | 13 +++++++++++++ 3 files changed, 28 insertions(+) create mode 100644 tests/num/fixed/.gitignore create mode 100644 tests/num/fixed/ref.typ create mode 100644 tests/num/fixed/test.typ diff --git a/tests/num/fixed/.gitignore b/tests/num/fixed/.gitignore new file mode 100644 index 0000000..03681f9 --- /dev/null +++ b/tests/num/fixed/.gitignore @@ -0,0 +1,5 @@ +# generated by tytanic, do not edit + +diff/** +out/** +ref/** diff --git a/tests/num/fixed/ref.typ b/tests/num/fixed/ref.typ new file mode 100644 index 0000000..ce99aa5 --- /dev/null +++ b/tests/num/fixed/ref.typ @@ -0,0 +1,10 @@ +#set page(width: auto, height: auto, margin: .5em) + +$1.23×10^2$ \ +$12space.thin 300×10^(-2)$ \ +$123.4×10^(-2)$ \ +$0.1234×10^1$ \ +$1000×10^1$ \ +$0.001×10^(-1)$ \ +$(0.2 plus.minus 0.1)×10^1$ \ +$(0.2 plus.minus 0.1)×10^2$ diff --git a/tests/num/fixed/test.typ b/tests/num/fixed/test.typ new file mode 100644 index 0000000..b7592b4 --- /dev/null +++ b/tests/num/fixed/test.typ @@ -0,0 +1,13 @@ +#import "/src/zero.typ": num + +#set page(width: auto, height: auto, margin: .5em) + + +#num(exponent: (fixed: 2))[123] \ +#num(exponent: (fixed: -2))[123] \ +#num(exponent: (fixed: -2))[1.234] \ +#num(exponent: (fixed: 1))[1.234] \ +#num(exponent: (fixed: 1))[1e4] \ +#num(exponent: (fixed: -1))[1e-4] \ +#num(exponent: (fixed: 1))[2+-1] \ +#num(exponent: (fixed: 2))[2+-1e1] \ From bed94e69e1b270e359dcb92ef2c562d9e06a518e Mon Sep 17 00:00:00 2001 From: Mc-Zen <52877387+Mc-Zen@users.noreply.github.com> Date: Mon, 27 Oct 2025 16:24:36 +0100 Subject: [PATCH 10/15] [add] tests for engineering exponent --- tests/num/engineering/.gitignore | 5 +++++ tests/num/engineering/ref.typ | 18 ++++++++++++++++++ tests/num/engineering/test.typ | 21 +++++++++++++++++++++ 3 files changed, 44 insertions(+) create mode 100644 tests/num/engineering/.gitignore create mode 100644 tests/num/engineering/ref.typ create mode 100644 tests/num/engineering/test.typ diff --git a/tests/num/engineering/.gitignore b/tests/num/engineering/.gitignore new file mode 100644 index 0000000..03681f9 --- /dev/null +++ b/tests/num/engineering/.gitignore @@ -0,0 +1,5 @@ +# generated by tytanic, do not edit + +diff/** +out/** +ref/** diff --git a/tests/num/engineering/ref.typ b/tests/num/engineering/ref.typ new file mode 100644 index 0000000..eb8ce38 --- /dev/null +++ b/tests/num/engineering/ref.typ @@ -0,0 +1,18 @@ +#set page(width: auto, height: auto, margin: .5em) + +$1×10^0$ \ +$10×10^0$ \ +$100×10^0$ \ +$1.000×10^3$ \ +$10.000×10^3$ \ +$100.000×10^3$ \ +$1.0×10^6$ \ + +#pagebreak() + +$100×10^(-3)$ \ +$10×10^(-3)$ \ +$1×10^(-3)$ \ +$100×10^(-6)$ \ +$10×10^(-6)$ \ +$1×10^(-6)$ \ \ No newline at end of file diff --git a/tests/num/engineering/test.typ b/tests/num/engineering/test.typ new file mode 100644 index 0000000..4501f99 --- /dev/null +++ b/tests/num/engineering/test.typ @@ -0,0 +1,21 @@ +#import "/src/zero.typ": num + +#set page(width: auto, height: auto, margin: .5em) + + +#num(exponent: "eng")[1] \ +#num(exponent: "eng")[10] \ +#num(exponent: "eng")[100] \ +#num(exponent: "eng")[1000] \ +#num(exponent: "eng")[10000] \ +#num(exponent: "eng")[100000] \ +#num(exponent: "eng")[10e5] \ + +#pagebreak() + +#num(exponent: "eng")[.1] \ +#num(exponent: "eng")[.01] \ +#num(exponent: "eng")[.001] \ +#num(exponent: "eng")[.0001] \ +#num(exponent: "eng")[.00001] \ +#num(exponent: "eng")[1e-6] \ From ea3fd0ef07aef75d953402ac77f3ebcdfef0067c Mon Sep 17 00:00:00 2001 From: Mc-Zen <52877387+Mc-Zen@users.noreply.github.com> Date: Mon, 27 Oct 2025 16:29:31 +0100 Subject: [PATCH 11/15] [add] docs --- README.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ac92b0c..11f3f34 100644 --- a/README.md +++ b/README.md @@ -99,7 +99,7 @@ Zero's core is the `num()` function, which provides flexible number formatting. #num( number: str | content | int | float | dictionary | array, digits: auto | int = auto, - fixed: none | int = none, + exponent: auto | str = auto, decimal-separator: str = ".", product: content = sym.times, @@ -116,7 +116,12 @@ Zero's core is the `num()` function, which provides flexible number formatting. ``` - `number: str | content | int | float | array` : Number input; `str` is preferred. If the input is `content`, it may only contain text nodes. Numeric types `int` and `float` are supported but not encouraged because of information loss (e.g., the number of trailing "0" digits or the exponent). The remaining types `dictionary` and `array` are intended for advanced use, see [below](#zero-for-third-party-packages). - `digits: auto | int = auto` : Truncates the number at a given (positive) number of decimal places or pads the number with zeros if necessary. This is independent of [rounding](#rounding). -- `fixed: none | int = none` : If not `none`, forces a fixed exponent. Additional exponents given in the number input are taken into account. +- `exponent: auto | str = auto` : Controls the value of the exponent. Possible values are + - `auto` : The exponent is taken to be the _input exponent_, e.g., `5` for `num[1e5]`. + - `"sci"` : The exponent is chosen according to scientific notation. Use `(sci: n)` to activate scientific notation only when the absolute of the exponent is at least `n` or `(sci: (min, max))` to activate scientific notation only when the exponent is less or equal to `min` or greater or equal to `max`. + - `"eng"` : The exponent chosen according to engineering notation, that is the exponent is a multiple of three and the integer part is never zero. + - `(fixed: n)` : The exponent is fixed to the given integer. + - `decimal-separator: str = "."` : Specifies the marker that is used for separating integer and decimal part. - `product: content = sym.times` : Specifies the multiplication symbol used for scientific notation. - `tight: bool = false` : If true, tight spacing is applied between operands (applies to $\times$ and $\pm$). From 7c0a60dae39ae72f7040ad43d460711f02c5fb60 Mon Sep 17 00:00:00 2001 From: Mc-Zen <52877387+Mc-Zen@users.noreply.github.com> Date: Mon, 27 Oct 2025 16:44:44 +0100 Subject: [PATCH 12/15] [add] automatic engineering prefixes --- src/num.typ | 4 ++++ src/units.typ | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/src/num.typ b/src/num.typ index 87e25d0..a5033eb 100644 --- a/src/num.typ +++ b/src/num.typ @@ -114,6 +114,10 @@ if it.exponent != auto { info = process-exponent(info, it.exponent) + + } + if it.unit.eng and it.exponent == "eng" { + info.e = none } /// Round number and uncertainty diff --git a/src/units.typ b/src/units.typ index 1dbc11c..48c3c5f 100644 --- a/src/units.typ +++ b/src/units.typ @@ -257,6 +257,12 @@ } if num-state.unit.eng { + + assert( + num-state.exponent == "eng", + message: "In order to use automatic SI prefixes for engineering notation, `num.exponent` needs to be set to \"eng\" as well" + ) + let info = parse-numeral(value) let e = if info.e == none { 0 } else { int(info.e) } let eng = compute-eng-digits(info) From e2dc2b395bb22de6e79186394956e500857552f3 Mon Sep 17 00:00:00 2001 From: Mc-Zen <52877387+Mc-Zen@users.noreply.github.com> Date: Mon, 27 Oct 2025 16:45:01 +0100 Subject: [PATCH 13/15] [add] tests for engineering prefixes --- tests/zi/engineering/.gitignore | 1 + tests/zi/engineering/ref.typ | 16 ++++++++++++++++ tests/zi/engineering/test.typ | 20 ++++++++++++++++++++ 3 files changed, 37 insertions(+) create mode 100644 tests/zi/engineering/.gitignore create mode 100644 tests/zi/engineering/ref.typ create mode 100644 tests/zi/engineering/test.typ diff --git a/tests/zi/engineering/.gitignore b/tests/zi/engineering/.gitignore new file mode 100644 index 0000000..2e73a39 --- /dev/null +++ b/tests/zi/engineering/.gitignore @@ -0,0 +1 @@ +ref/ \ No newline at end of file diff --git a/tests/zi/engineering/ref.typ b/tests/zi/engineering/ref.typ new file mode 100644 index 0000000..34dac37 --- /dev/null +++ b/tests/zi/engineering/ref.typ @@ -0,0 +1,16 @@ +#set page(width: auto, height: auto, margin: .5em) + +#let th = sym.space.thin +$2th"m"$ \ +$2th"km"$ \ +$20th"km"$ \ + +#pagebreak() + +$20th"ms"$ \ +$200th"ns"$ \ + +#pagebreak() + +$1.2th"km"th"s"^(-1)$ \ +$1.2th"kV"th"m"$ \ \ No newline at end of file diff --git a/tests/zi/engineering/test.typ b/tests/zi/engineering/test.typ new file mode 100644 index 0000000..547e58a --- /dev/null +++ b/tests/zi/engineering/test.typ @@ -0,0 +1,20 @@ +#set page(width: auto, height: auto, margin: .5em) +#import "/src/zero.typ": zi, set-unit, set-num + + +#set-unit(eng: true) +#set-num(exponent: "eng") + +#zi.m[2] \ +#zi.m[2e3] \ +#zi.m[2e4] \ + +#pagebreak() + +#zi.s[2e-2] \ +#zi.s[2e-7] \ + +#pagebreak() + +#zi.m-s[12e2] \ +#zi.declare("V m")([12e2]) From 39bc32067e303fe77b9e88f150fa0a4efa10edbf Mon Sep 17 00:00:00 2001 From: Mc-Zen <52877387+Mc-Zen@users.noreply.github.com> Date: Tue, 28 Oct 2025 08:52:58 +0100 Subject: [PATCH 14/15] [improve] interface for engineering mode with prefixes --- src/num.typ | 7 +++---- src/state.typ | 2 +- src/units.typ | 9 +++------ tests/zi/engineering/test.typ | 1 - 4 files changed, 7 insertions(+), 12 deletions(-) diff --git a/src/num.typ b/src/num.typ index a5033eb..f79597c 100644 --- a/src/num.typ +++ b/src/num.typ @@ -114,10 +114,9 @@ if it.exponent != auto { info = process-exponent(info, it.exponent) - - } - if it.unit.eng and it.exponent == "eng" { - info.e = none + if "prefixed-eng" in it { + info.e = none + } } /// Round number and uncertainty diff --git a/src/state.typ b/src/state.typ index 503de39..ec670d0 100644 --- a/src/state.typ +++ b/src/state.typ @@ -32,7 +32,7 @@ fraction: "power", breakable: false, use-sqrt: true, - eng: false + prefix: auto ) ) #let num-state = state("num-state", default-state) diff --git a/src/units.typ b/src/units.typ index 48c3c5f..9d6c2ad 100644 --- a/src/units.typ +++ b/src/units.typ @@ -256,13 +256,10 @@ separator = none } - if num-state.unit.eng { - - assert( - num-state.exponent == "eng", - message: "In order to use automatic SI prefixes for engineering notation, `num.exponent` needs to be set to \"eng\" as well" - ) + if num-state.unit.prefix == auto and num-state.exponent == "eng" { + num-state.prefixed-eng = true + let info = parse-numeral(value) let e = if info.e == none { 0 } else { int(info.e) } let eng = compute-eng-digits(info) diff --git a/tests/zi/engineering/test.typ b/tests/zi/engineering/test.typ index 547e58a..08c76e9 100644 --- a/tests/zi/engineering/test.typ +++ b/tests/zi/engineering/test.typ @@ -2,7 +2,6 @@ #import "/src/zero.typ": zi, set-unit, set-num -#set-unit(eng: true) #set-num(exponent: "eng") #zi.m[2] \ From 6ff9279cc66a7caefdc9195bdcf361f945093fa7 Mon Sep 17 00:00:00 2001 From: Mc-Zen <52877387+Mc-Zen@users.noreply.github.com> Date: Tue, 28 Oct 2025 08:55:51 +0100 Subject: [PATCH 15/15] [docs] for eng prefix --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 11f3f34..9c4daea 100644 --- a/README.md +++ b/README.md @@ -404,7 +404,8 @@ The appearance of units can be configured via `set-unit`: #set-unit( unit-separator: content = sym.space.thin, fraction: str = "power", - breakable: bool = false + breakable: bool = false, + prefix auto | none = auto ) ``` - `unit-separator: content` : Configures the separator between consecutive unit parts in a composite unit. @@ -413,6 +414,7 @@ The appearance of units can be configured via `set-unit`: - `"fraction"` : When units with negative exponents are present, a fraction is created and the concerned units are put in the denominator. - `"inline"` : An inline fraction is created. - `breakable: bool` : Whether units and quantities can be broken across paragraph lines. +- `prefix: auto` : When set to `auto` and `num.exponent` is set to `"eng"`, a metric prefix is displayed along with the unit, replacing the exponent, e.g. `zi.m[2e4]` will render as 20km. These options are also available when instancing a quantity, e.g., `#zi.m(fraction: "inline")[2.5]`.