From f579a2fd991f82481085d7c673faff195584538a Mon Sep 17 00:00:00 2001 From: Mc-Zen <52877387+Mc-Zen@users.noreply.github.com> Date: Fri, 8 May 2026 08:49:06 +0200 Subject: [PATCH 1/4] [change] rounding behavior Co-authored-by: Copilot --- src/formatting.typ | 2 +- src/num.typ | 19 +++- src/rounding.typ | 148 ++++++++++++++++++---------- src/state.typ | 4 +- tests/num/rounding/test.typ | 188 +++++++++++++++++++----------------- 5 files changed, 216 insertions(+), 145 deletions(-) diff --git a/src/formatting.typ b/src/formatting.typ index db2e34b..e7da552 100644 --- a/src/formatting.typ +++ b/src/formatting.typ @@ -210,7 +210,7 @@ sign: none, int: int, frac: frac, - digits: it.digits, + digits: auto, group: false, positive-sign: false, decimal-separator: it.decimal-separator, diff --git a/src/num.typ b/src/num.typ index 963338d..a00a084 100644 --- a/src/num.typ +++ b/src/num.typ @@ -117,13 +117,24 @@ } /// Round number and uncertainty - if it.round.precision != none { - (info.int, info.frac, info.pm) = round( + if info.pm != none and it.round.follow-uncertainty { + (info.int, info.frac, info.pm) = round-to-uncertainty( info.int, info.frac, - pm: info.pm, + info.pm, + sign: info.sign, ..it.round, + precision: it.round.uncertainty-precision, ) + } else { + if it.round.precision != none { + (info.int, info.frac) = round( + info.int, + info.frac, + sign: info.sign, + ..it.round, + ) + } } let digits = if it.digits == auto { info.frac.len() } else { it.digits } @@ -134,7 +145,7 @@ if info.pm != none { let pm = info.pm if type(pm.first()) != array { pm = (pm,) } - digits = calc.max(digits, ..pm.map(array.last).map(str.len)) + // digits = calc.max(digits, ..pm.map(array.last).map(str.len)) } // info.digits = digits diff --git a/src/rounding.typ b/src/rounding.typ index ec97f52..015322d 100644 --- a/src/rounding.typ +++ b/src/rounding.typ @@ -197,7 +197,7 @@ /// Rounds (and/or pads) a number given by an integer part and a fractional -/// part. Several rounding modes are supported. +/// part. #let round( /// Integer part. @@ -216,15 +216,11 @@ /// - `"places"`: The number is rounded to the number of places after the /// decimal point given by the `precision` parameter. /// - `"figures"`: The number is rounded to a number of significant figures. - /// - `"uncertainty"`: Requires giving the uncertainty. The uncertainty is - /// rounded to significant figures given by the `precision` argument and - /// then the number is rounded to the same number of places as the - /// uncertainty. mode: "places", /// The precision to round to. See parameter `mode` for the different modes. - /// If set to `none`, no rounding is performed. - /// -> int | none + /// If set to `auto` or `none`, no rounding is performed. + /// -> int | auto | none precision: 2, /// Rounding direction. @@ -242,19 +238,15 @@ /// -> bool | int pad: true, - /// Uncertainty - pm: none, + .. ) = { - if precision == none { - return (int, frac, pm) - } - if mode == "uncertainty" and pm == none { - return (int, frac, pm) + if precision in (auto, none) { + return (int, frac) } - assert-option(mode, "round-mode", ("places", "figures", "uncertainty")) + assert-option(mode, "round-mode", ("places", "figures")) // Removal hint if direction == "down" { @@ -277,55 +269,107 @@ )) - if mode == "uncertainty" { - // Round uncertainties to `precision` figures. + pad-decimal( + ..round-decimal( + int, frac, + precision: precision, + mode: mode, + dir: direction, + sign: sign, + ties: ties, + ), + pad, mode, precision + ) +} - let is-symmetric = type(pm.first()) != array - if is-symmetric { - pm = (pm,) - } - - /// Find the (fractional) place of the smallest uncertainty - let places = precision + calc.max( - ..pm.map(((i, f)) => count-leading-zeros(i + f) - i.len()) - ) - pm = pm - .map(((i, f)) => round-decimal( - i, f, - dir: direction, - precision: places, - mode: "places" - )) - .map(((i, f)) => pad-decimal( - i, f, - pad, - "places", - places - )) - - if is-symmetric { - pm = pm.first() - } - - // Then, round number to the same number of places - mode = "places" - precision = places +/// Rounds a number to the same decimal place as its uncertainty. +#let round-to-uncertainty( + + /// Integer part. + /// -> str + int, + + /// Fractional part. + /// -> str + frac, + + /// Uncertainty, given as a tuple of integer and fractional part. Can also be a tuple of two tuples, in the case of asymmetric uncertainty. + /// -> (str, str) | ((str, str), (str, str)) + uncertainty, + + /// The sign of the number. + /// -> "+" | "-" + sign: "+", + + /// The precision to round the uncertainty to. If `auto`, the uncertainty left as is. + /// -> auto | int + precision: auto, + + /// Rounding direction. + /// -> str + direction: "nearest", + + /// How to round ties. + /// -> "away-from-zero" | "towards-zero" | "to-odd" | "to-even" | "towards-infinity" | "towards-negative-infinity" + ties: "away-from-zero", + + /// Determines whether the number should be padded with zeros if the number + /// has less digits than the rounding precision. If an integer is given, + /// determines the minimum number of decimal digits (`mode: "places"`) or + /// significant figures (`mode: "figures"`) to display. + /// -> bool | int + pad: true, + .. + +) = { + let is-symmetric = type(uncertainty.first()) != array + if is-symmetric { + uncertainty = (uncertainty,) + } + + /// Find the (fractional) place of the smallest uncertainty + let places = if precision == auto { + calc.max( + ..uncertainty.map(((i, f)) => f.len()) + ) + } else { + precision + calc.max( + ..uncertainty.map(((i, f)) => count-leading-zeros(i + f) - i.len()) + ) } + uncertainty = uncertainty + .map(((i, f)) => round-decimal( + i, f, + dir: direction, + precision: places, + mode: "places" + )) + .map(((i, f)) => pad-decimal( + i, f, + pad, + "places", + places + )) + + if is-symmetric { + uncertainty = uncertainty.first() + } + + // Then, round number to the same number of places as the uncertainty. ( ..pad-decimal( ..round-decimal( int, frac, - precision: precision, - mode: mode, + precision: places, + mode: "places", dir: direction, sign: sign, ties: ties, ), - pad, mode, precision + pad, "places", places ), - pm + uncertainty ) } - diff --git a/src/state.typ b/src/state.typ index d3edcea..f9dd00f 100644 --- a/src/state.typ +++ b/src/state.typ @@ -23,7 +23,9 @@ ), round: ( mode: "places", - precision: none, + precision: auto, + follow-uncertainty: true, + uncertainty-precision: auto, pad: true, direction: "nearest", ties: "away-from-zero", diff --git a/tests/num/rounding/test.typ b/tests/num/rounding/test.typ index aa0b86b..27e85fa 100644 --- a/tests/num/rounding/test.typ +++ b/tests/num/rounding/test.typ @@ -120,142 +120,138 @@ #let round-places = round.with(mode: "places") #let round-figures = round.with(mode: "figures") -#assert.eq(round("23", "5", precision: none), ("23", "5", none)) - -#assert.eq(round-places("1", "234", precision: 3), ("1", "234", none)) -#assert.eq(round-places("1", "234", precision: 2), ("1", "23", none)) -#assert.eq(round-places("1", "234", precision: 1), ("1", "2", none)) -#assert.eq(round-places("1", "234", precision: 0), ("1", "", none)) -#assert.eq(round-places("23", "534", precision: -1), ("20", "", none)) -#assert.eq(round-places("12345", "534", precision: -3), ("12000", "", none)) -#assert.eq(round-places("70", "", precision: -2), ("100", "", none)) -#assert.eq(round-places("70", "", precision: -3), ("", "", none)) -#assert.eq(round-places("70", "", precision: -4), ("", "", none)) -#assert.eq(round-places("", "0022", precision: 3), ("", "002", none)) - -#assert.eq(round-places("1", "1", precision: 0), ("1", "", none)) -#assert.eq(round-places("1", "1", precision: 3), ("1", "100", none)) -#assert.eq(round-places("1", "1", precision: 5), ("1", "10000", none)) -#assert.eq(round-places("1", "1", precision: 5), ("1", "10000", none)) - -#assert.eq(round-places("1", "1", precision: 5, pad: false), ("1", "1", none)) -#assert.eq(round-places("1", "1", precision: 5, pad: true), ("1", "10000", none)) -#assert.eq(round-places("1", "1", precision: 5, pad: -1), ("1", "1", none)) -#assert.eq(round-places("1", "1", precision: 5, pad: 0), ("1", "1", none)) -#assert.eq(round-places("1", "1", precision: 5, pad: 3), ("1", "100", none)) -#assert.eq(round-places("1", "1", precision: 5, pad: 6), ("1", "10000", none)) - -#assert.eq(round-figures("1", "234", precision: 4), ("1", "234", none)) -#assert.eq(round-figures("1", "234", precision: 3), ("1", "23", none)) -#assert.eq(round-figures("1", "234", precision: 2), ("1", "2", none)) -#assert.eq(round-figures("1", "234", precision: 1), ("1", "", none)) -#assert.eq(round-figures("1", "234", precision: 0), ("", "", none)) -#assert.eq(round-figures("1", "234", precision: -1), ("", "", none)) -#assert.eq(round-figures("8", "234", precision: 0), ("10", "", none)) -#assert.eq(round-figures("8", "234", precision: -1), ("", "", none)) -#assert.eq(round-figures("8", "234", precision: -2), ("", "", none)) -#assert.eq(round-figures("11", "", precision: -3), ("", "", none)) - -#assert.eq(round-figures("1", "2", precision: 4), ("1", "200", none)) - -#assert.eq(round-figures("1", "2", precision: 4, pad: false), ("1", "2", none)) -#assert.eq(round-figures("1", "2", precision: 4, pad: true), ("1", "200", none)) -#assert.eq(round-figures("1", "2", precision: 4, pad: -1), ("1", "2", none)) -#assert.eq(round-figures("1", "2", precision: 4, pad: 0), ("1", "2", none)) -#assert.eq(round-figures("1", "2", precision: 4, pad: 3), ("1", "20", none)) -#assert.eq(round-figures("1", "2", precision: 4, pad: 6), ("1", "200", none)) - -#assert.eq(round-figures("0", "00126", precision: 2), ("", "0013", none)) -#assert.eq(round-figures("0", "000126", precision: 3), ("", "000126", none)) - -#assert.eq(round-figures("0", "0016", precision: 4, pad: false), ("", "0016", none)) -#assert.eq(round-figures("0", "0016", precision: 4, pad: true), ("", "001600", none)) -#assert.eq(round-figures("0", "0016", precision: 4, pad: -1), ("", "0016", none)) -#assert.eq(round-figures("0", "0016", precision: 4, pad: 0), ("", "0016", none)) -#assert.eq(round-figures("0", "0016", precision: 4, pad: 3), ("", "00160", none)) -#assert.eq(round-figures("0", "0016", precision: 4, pad: 6), ("", "001600", none)) - - -#assert.eq(round-places("99", "92", precision: 2), ("99", "92", none)) -#assert.eq(round-places("99", "92", precision: 0), ("100", "", none)) -#assert.eq(round-places("99", "99", precision: 1), ("100", "0", none)) -#assert.eq(round-places("99", "99", precision: -1), ("100", "", none)) -#assert.eq(round-places("1", "299995", precision: 5), ("1", "30000", none)) -#assert.eq(round-places("1", "299994", precision: 5), ("1", "29999", none)) -#assert.eq(round-places("523", "", precision: -2), ("500", "", none)) +#assert.eq(round("23", "5", precision: none), ("23", "5")) + +#assert.eq(round-places("1", "234", precision: 3), ("1", "234")) +#assert.eq(round-places("1", "234", precision: 2), ("1", "23")) +#assert.eq(round-places("1", "234", precision: 1), ("1", "2")) +#assert.eq(round-places("1", "234", precision: 0), ("1", "")) +#assert.eq(round-places("23", "534", precision: -1), ("20", "")) +#assert.eq(round-places("12345", "534", precision: -3), ("12000", "")) +#assert.eq(round-places("70", "", precision: -2), ("100", "")) +#assert.eq(round-places("70", "", precision: -3), ("", "")) +#assert.eq(round-places("70", "", precision: -4), ("", "")) +#assert.eq(round-places("", "0022", precision: 3), ("", "002")) + +#assert.eq(round-places("1", "1", precision: 0), ("1", "")) +#assert.eq(round-places("1", "1", precision: 3), ("1", "100")) +#assert.eq(round-places("1", "1", precision: 5), ("1", "10000")) +#assert.eq(round-places("1", "1", precision: 5), ("1", "10000")) + +#assert.eq(round-places("1", "1", precision: 5, pad: false), ("1", "1")) +#assert.eq(round-places("1", "1", precision: 5, pad: true), ("1", "10000")) +#assert.eq(round-places("1", "1", precision: 5, pad: -1), ("1", "1")) +#assert.eq(round-places("1", "1", precision: 5, pad: 0), ("1", "1")) +#assert.eq(round-places("1", "1", precision: 5, pad: 3), ("1", "100")) +#assert.eq(round-places("1", "1", precision: 5, pad: 6), ("1", "10000")) + +#assert.eq(round-figures("1", "234", precision: 4), ("1", "234")) +#assert.eq(round-figures("1", "234", precision: 3), ("1", "23")) +#assert.eq(round-figures("1", "234", precision: 2), ("1", "2")) +#assert.eq(round-figures("1", "234", precision: 1), ("1", "")) +#assert.eq(round-figures("1", "234", precision: 0), ("", "")) +#assert.eq(round-figures("1", "234", precision: -1), ("", "")) +#assert.eq(round-figures("8", "234", precision: 0), ("10", "")) +#assert.eq(round-figures("8", "234", precision: -1), ("", "")) +#assert.eq(round-figures("8", "234", precision: -2), ("", "")) +#assert.eq(round-figures("11", "", precision: -3), ("", "")) + +#assert.eq(round-figures("1", "2", precision: 4), ("1", "200")) + +#assert.eq(round-figures("1", "2", precision: 4, pad: false), ("1", "2")) +#assert.eq(round-figures("1", "2", precision: 4, pad: true), ("1", "200")) +#assert.eq(round-figures("1", "2", precision: 4, pad: -1), ("1", "2")) +#assert.eq(round-figures("1", "2", precision: 4, pad: 0), ("1", "2")) +#assert.eq(round-figures("1", "2", precision: 4, pad: 3), ("1", "20")) +#assert.eq(round-figures("1", "2", precision: 4, pad: 6), ("1", "200")) + +#assert.eq(round-figures("0", "00126", precision: 2), ("", "0013")) +#assert.eq(round-figures("0", "000126", precision: 3), ("", "000126")) + +#assert.eq(round-figures("0", "0016", precision: 4, pad: false), ("", "0016")) +#assert.eq(round-figures("0", "0016", precision: 4, pad: true), ("", "001600")) +#assert.eq(round-figures("0", "0016", precision: 4, pad: -1), ("", "0016")) +#assert.eq(round-figures("0", "0016", precision: 4, pad: 0), ("", "0016")) +#assert.eq(round-figures("0", "0016", precision: 4, pad: 3), ("", "00160")) +#assert.eq(round-figures("0", "0016", precision: 4, pad: 6), ("", "001600")) + + +#assert.eq(round-places("99", "92", precision: 2), ("99", "92")) +#assert.eq(round-places("99", "92", precision: 0), ("100", "")) +#assert.eq(round-places("99", "99", precision: 1), ("100", "0")) +#assert.eq(round-places("99", "99", precision: -1), ("100", "")) +#assert.eq(round-places("1", "299995", precision: 5), ("1", "30000")) +#assert.eq(round-places("1", "299994", precision: 5), ("1", "29999")) +#assert.eq(round-places("523", "", precision: -2), ("500", "")) #assert.eq( - round("42", "3734", pm: ("", "0025"), precision: 2, mode: "uncertainty"), + round-to-uncertainty("42", "3734", ("", "0025"), precision: 2), ("42", "3734", ("", "0025")), ) #assert.eq( - round("42", "3734", pm: ("", "0025"), precision: 1, mode: "uncertainty"), + round-to-uncertainty("42", "3734", ("", "0025"), precision: 1), ("42", "373", ("", "003")), ) #assert.eq( - round("42", "3734", pm: ("2", "2"), precision: 1, mode: "uncertainty"), + round-to-uncertainty("42", "3734", ("2", "2"), precision: 1), ("42", "", ("2", "")), ) #assert.eq( - round("42", "3734", pm: ("2", "2"), precision: 2, mode: "uncertainty"), + round-to-uncertainty("42", "3734", ("2", "2"), precision: 2), ("42", "4", ("2", "2")), ) #assert.eq( - round("42", "3734", pm: ("2", "2"), precision: 3, mode: "uncertainty"), + round-to-uncertainty("42", "3734", ("2", "2"), precision: 3), ("42", "37", ("2", "20")), ) #assert.eq( - round("4211", "3734", pm: ("230", "2"), precision: 1, mode: "uncertainty"), + round-to-uncertainty("4211", "3734", ("230", "2"), precision: 1), ("4200", "", ("200", "")), ) #assert.eq( - round("1", "23", pm: ("0", "2"), precision: 1, mode: "uncertainty"), + round-to-uncertainty("1", "23", ("0", "2"), precision: 1), ("1", "2", ("", "2")), ) #assert.eq( - round("123", "9", pm: ("20", ""), precision: 1, mode: "uncertainty"), + round-to-uncertainty("123", "9", ("20", ""), precision: 1), ("120", "", ("20", "")), ) #assert.eq( - round( + round-to-uncertainty( "1", "23", - pm: (("0", "2"), ("0", "3")), + (("0", "2"), ("0", "3")), precision: 1, - mode: "uncertainty", ), ("1", "2", (("", "2"), ("", "3"))), ) #assert.eq( - round( + round-to-uncertainty( "123", "9", - pm: (("020", ""), ("30", "")), + (("020", ""), ("30", "")), precision: 1, - mode: "uncertainty", ), ("120", "", (("20", ""), ("30", ""))), ) #assert.eq( - round( + round-to-uncertainty( "1", "23", - pm: (("0", "24"), ("0", "3")), + (("0", "24"), ("0", "3")), precision: 1, - mode: "uncertainty", ), ("1", "2", (("", "2"), ("", "3"))), ) #assert.eq( - round( + round-to-uncertainty( "1", "23", - pm: (("0", "04"), ("0", "3")), + (("0", "04"), ("0", "3")), precision: 1, - mode: "uncertainty", ), ("1", "23", (("", "04"), ("", "30"))), ) @@ -266,7 +262,7 @@ precision: 2, mode: "places", ), - ("", "00", none), + ("", "00"), ) #assert.eq( @@ -276,7 +272,7 @@ precision: 2, mode: "figures", ), - ("", "", none), + ("", ""), ) @@ -316,8 +312,26 @@ // Uncertainty -#set-round(mode: "uncertainty", precision: 1) -#num("1.234(34)") \ + +#num("12.378+-0.2") \ +#num("1.234(9)") \ +#num("1.23422(310)") \ +// num is rounded +#num("8.8+-2") \ +// num is padded +#num("8+-0.02") \ +// signs are respected +#num("-8.8+-2", round: (direction: "towards-negative-infinity")) \ +// num is not padded +#num("8.8+-0.02", round: (pad: false)) \ +// num is rounded and padded +#num(round: (pad: true))[0.299+-.12] \ +// num is rounded and not padded +#num(round: (pad: false))[0.299+-.12] \ + +#set-round(follow-uncertainty: false) +#num("12.378+-0.2", round: (precision: 2, mode: "places")) \ +#num("12.378+-0.2", round: (precision: 2, mode: "figures")) \ #num("1.23422(34)") \ #num("8.8+-2") \ From 7e21a560490bd4c88aea91909dedfe01b4cff0b1 Mon Sep 17 00:00:00 2001 From: Mc-Zen <52877387+Mc-Zen@users.noreply.github.com> Date: Fri, 8 May 2026 09:04:42 +0200 Subject: [PATCH 2/4] [add] tests --- tests/num/rounding/ref.typ | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/tests/num/rounding/ref.typ b/tests/num/rounding/ref.typ index e60e111..4d52bec 100644 --- a/tests/num/rounding/ref.typ +++ b/tests/num/rounding/ref.typ @@ -18,9 +18,20 @@ $10#sym.space.thin 000$ \ #pagebreak() -$1.23plus.minus 0.03$ \ -$1.2342plus.minus 0.0003$ \ -$9plus.minus 2$ +$12.4plus.minus 0.2$ \ +$1.234plus.minus 0.009$ \ +$1.234#sym.space.thin 22plus.minus 0.00310$ \ +$9plus.minus 2$ \ +$8.00plus.minus 0.02$ \ +$-9plus.minus 2$ \ +$8.8plus.minus 0.02$ \ +$0.30plus.minus 0.12$ \ +$0.3plus.minus 0.12$ \ + +$12.38plus.minus 0.2$ \ +$12plus.minus 0.2$ \ +$1.2plus.minus 0.00034$ \ +$8.8plus.minus 2$ \ #pagebreak() From e70aaab37b7b4d9f8e22b2922c7b063cbd9ae2e9 Mon Sep 17 00:00:00 2001 From: Mc-Zen <52877387+Mc-Zen@users.noreply.github.com> Date: Fri, 8 May 2026 09:12:33 +0200 Subject: [PATCH 3/4] [update] tests Co-authored-by: Copilot --- tests/num/uncertainty/ref.typ | 16 ++++++++-------- tests/table/format/ref/2.png | Bin 6970 -> 6605 bytes tests/table/format/test.typ | 4 ++-- tests/table/nonum/test.typ | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/tests/num/uncertainty/ref.typ b/tests/num/uncertainty/ref.typ index 32d5591..c4e0ad9 100644 --- a/tests/num/uncertainty/ref.typ +++ b/tests/num/uncertainty/ref.typ @@ -18,9 +18,9 @@ $1.7±2.8$, $1.7(28)$, $1.7(2.8)$, $2.2^(+0.2)_(-0.5)$, $2.2^(+2)_(-5)$, $2.2^(+2)_(-5)$, - $2.2^(+2.0)_(-5.0)$, $2.2^(+20)_(-50)$, $2.2^(+2.0)_(-5.0)$, + $2^(+2)_(-5)$, $2^(+2)_(-5)$, $2^(+2)_(-5)$, $2.2^(+2.0)_(-0.5)$, $2.2^(+20)_(-5)$, $2.2^(+2.0)_(-0.5)$, - $9.99^(+2.00)_(-0.50)$, $9.99^(+200)_(-50)$, $9.99^(+2.00)_(-0.50)$, + $10.0^(+2.0)_(-0.5)$, $10.0^(+20)_(-5)$, $10.0^(+2.0)_(-0.5)$, ) @@ -47,15 +47,15 @@ non-math-attach([2.2], t: [+0.2], b: [-0.5]), non-math-attach([2.2], t: [+2], b: [-5]), non-math-attach([2.2], t: [+2], b: [-5]), - non-math-attach([2.2], t: [+2.0], b: [-5.0]), - non-math-attach([2.2], t: [+20], b: [-50]), - non-math-attach([2.2], t: [+2.0], b: [-5.0]), + non-math-attach([2], t: [+2], b: [-5]), + non-math-attach([2], t: [+2], b: [-5]), + non-math-attach([2], t: [+2], b: [-5]), non-math-attach([2.2], t: [+2.0], b: [-0.5]), non-math-attach([2.2], t: [+20], b: [-5]), non-math-attach([2.2], t: [+2.0], b: [-0.5]), - non-math-attach([9.99], t: [+2.00], b: [-0.50]), - non-math-attach([9.99], t: [+200], b: [-50]), - non-math-attach([9.99], t: [+2.00], b: [-0.50]), + non-math-attach([10.0], t: [+2.0], b: [-0.5]), + non-math-attach([10.0], t: [+20], b: [-5]), + non-math-attach([10.0], t: [+2.0], b: [-0.5]), ) #pagebreak() diff --git a/tests/table/format/ref/2.png b/tests/table/format/ref/2.png index d07c40b17433b97b36cdcad701cf5d3d2e086912..3194e94c0dd8e50788f4fa4ccc375e3ff608367c 100644 GIT binary patch literal 6605 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

F9AtmM}{5IlUR2 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 Date: Fri, 8 May 2026 09:20:31 +0200 Subject: [PATCH 4/4] [remove] digit sensitivity to uncertainty --- src/num.typ | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/num.typ b/src/num.typ index a00a084..b4fa3bd 100644 --- a/src/num.typ +++ b/src/num.typ @@ -141,14 +141,6 @@ if digits < 0 { assert(false, message: "`digits` needs to be positive, got " + str(digits)) } - - if info.pm != none { - let pm = info.pm - if type(pm.first()) != array { pm = (pm,) } - // digits = calc.max(digits, ..pm.map(array.last).map(str.len)) - } - - // info.digits = digits it.digits = digits // Format number