A supplemental units package for Unitful, for dealing with typographic units. For example:
julia> 1pt + 1pc |> bp
10400//803 bpThe preferred length dimension is set to pt, so as not to end up with meters
if you mix in cm or mm (from Unitful.DefaultSymbols):
julia> 1cm + 1pt
7481//254 ptFor absolute units like pt, dd, etc., that's basically all there is to it.
Relative units like the em provide more of a challenge, as their definition
depends on the current font, wherever a given measurement is to be used.
TypographicUnits makes no assumptions here, and rather treats
incommensurable relative units as separate “length-like” dimensions.
Thus, where 1pc - 6pt yields 6pt, for example, the relative units don't
mix:
julia> 1pt + 1em
1 pt + 1 emConstructing such a mixed length will promote the values to the same underlying scalar type:
julia> 1.0pt + 1em
1.0 pt + 1.0 emThey can also be multiplied by (or divided by) real numbers:
julia> (6pt + 12em)/2
3.0 pt + 6.0 emThere are currently separate length-like dimensions defined for the units
em, ex and px. (The last relative unit defined, the en, is set to half
an em, and thus shares its dimension.)
If you want to do advanced calculations, you should probably do so before
combining values into a mixed length. Many computations don't really make
sense for the combinations. For example, what is abs(1em - 10pt)? If 1em ≥ 10pt, then it's simply 1em - 10pt; otherwise, it's 10pt - 1em. Since we
don't know their relative sizes, we can't meaningfully give an answer. Other
functions (such as sqrt or sin) aren't distributive, for one, and change
the units so they no longer fall within the purview of the mixed length type.
For convenience, however, the float function is available, in case one wants
to get rid of rationals:
julia> 3cm + 4pt + 4em
22697//254 pt + 4//1 em
julia> float(3cm + 4pt + 4em)
89.35826771653544 pt + 4.0 em