Skip to content

Commit b8e1bf0

Browse files
committed
upgraded to LaTeX printing
1 parent e311bfb commit b8e1bf0

File tree

3 files changed

+124
-8
lines changed

3 files changed

+124
-8
lines changed

Project.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "MeasureSystems"
22
uuid = "ea45d09e-59d0-491b-a101-09823c6a9fd4"
33
authors = ["Michael Reed"]
4-
version = "0.1.6"
4+
version = "0.1.7"
55

66
[deps]
77
Similitude = "d70e672a-ff44-4dfc-8031-4cc812d84922"
@@ -15,7 +15,7 @@ FieldConstants = "0.1"
1515
FieldAlgebra = "0.1"
1616
Measurements = "2"
1717
UnitSystems = "0.3.8"
18-
Similitude = "0.2.6"
18+
Similitude = "0.2.7"
1919
julia = "1"
2020

2121
[extras]

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ Specifications for dimensional units are in the [UnitSystems.jl](https://github.
1616
The three packages are designed so that they can be interchanged with compatibility.
1717
On its own `UnitSystems` is the fastest package, while `Similitude` (provides `Quantity` type) and `MeasureSystems` (introduces [Measurements.jl](https://github.com/JuliaPhysics/Measurements.jl) uncertainty) build additional features on top of `UnitSystems` base defintions.
1818
Additionally, in the `UnitSystems` repository there is an equivalent [Wolfram language paclet](https://reference.wolfram.com/language/guide/Paclets) `Kernel` and also an unmaintained Rust `src` implementation.
19-
Defaults are shared: `Metric`, `SI2019`, `CODATA`, `Conventional`, `International`, `InternationalMean`, `MetricTurn`, `MetricGradian`, `MetricDegree`, `MetricArcminute`, `MetricArcsecond`, `MetricEngineering`, `GravitationalMetric`, `FPS`, `IPS`, `British`, `English`, `Survey`, `Gauss`, `LorentzHeaviside`, `EMU`, `ESU`, `IAU`, `IAUE`, `IAUJ`, `Hubble`, `Cosmological`, `CosmologicalQuantum`, `Meridian`, `Nautical`, `MPH`, `KKH`, `MTS`, `FFF`, `Planck`, `PlanckGauss`, `Stoney`, `Hartree`, `Rydberg`, `Schrodinger`, `Electronic`, `Natural`, `NaturalGauss`, `QCD`, `QCDGauss`, `QCDoriginal`.
19+
Defaults are shared: `Metric`, `SI2019`, `CODATA`, `Conventional`, `International`, `InternationalMean`, `MetricTurn`, `MetricGradian`, `MetricDegree`, `MetricArcminute`, `MetricArcsecond`, `Engineering`, `Gravitational`, `FPS`, `IPS`, `British`, `English`, `Survey`, `Gauss`, `LorentzHeaviside`, `EMU`, `ESU`, `IAU`, `IAUE`, `IAUJ`, `Hubble`, `Cosmological`, `CosmologicalQuantum`, `Meridian`, `Nautical`, `MPH`, `KKH`, `MTS`, `FFF`, `Planck`, `PlanckGauss`, `Stoney`, `Hartree`, `Rydberg`, `Schrodinger`, `Electronic`, `Natural`, `NaturalGauss`, `QCD`, `QCDGauss`, `QCDoriginal`.
2020

2121
```Julia
2222
julia> using MeasureSystems # or UnitSystems or Similitude
@@ -50,7 +50,7 @@ Standardized unit/derived quantities are `hyperfine`, `loschmidt`, `wienwaveleng
5050

5151
Standard physics units are at https://geophysics.crucialflow.com/dev/units
5252

53-
Additional reference `UnitSystem` variants: `EMU`, `ESU`, `Gauss`, `LorentzHeaviside`, `SI2019`, `SI1976`, `CODATA`, `Conventional`, `International`, `InternationalMean`, `MetricEngineering`, `GravitationalMetric`, `IAU`, `IAUE`, `IAUJ`, `FPS`, `IPS`, `British`, `Survey`, `Hubble`, `Cosmological`, `CosmologicalQuantum`, `Meridian`, `Nautical`, `MPH`, `KKH`, `MTS`, `FFF`; and natural atomic units based on gravitational `coupling` and `finestructure` constant (`Planck`, `PlanckGauss`, `Stoney`, `Hartree`, `Rydberg`, `Schrodinger`, `Electronic`, `Natural`, `NaturalGauss`, `QCD`, `QCDGauss`, and `QCDoriginal`).
53+
Additional reference `UnitSystem` variants: `EMU`, `ESU`, `Gauss`, `LorentzHeaviside`, `SI2019`, `SI1976`, `CODATA`, `Conventional`, `International`, `InternationalMean`, `Engineering`, `Gravitational`, `IAU`, `IAUE`, `IAUJ`, `FPS`, `IPS`, `British`, `Survey`, `Hubble`, `Cosmological`, `CosmologicalQuantum`, `Meridian`, `Nautical`, `MPH`, `KKH`, `MTS`, `FFF`; and natural atomic units based on gravitational `coupling` and `finestructure` constant (`Planck`, `PlanckGauss`, `Stoney`, `Hartree`, `Rydberg`, `Schrodinger`, `Electronic`, `Natural`, `NaturalGauss`, `QCD`, `QCDGauss`, and `QCDoriginal`).
5454

5555
Unit conversion documentation is at https://geophysics.crucialflow.com/dev/convert
5656

src/MeasureSystems.jl

Lines changed: 120 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,121 @@ Base.:+(a::Measure,b::Measurement) = cache(measure(a)-b)
6060
Base.:-(a::Number,b::Measure) = cache(a-measure(b))
6161
Base.:-(a::Measure,b::Number) = cache(measure(a)-b)
6262

63+
function round_extra(x)
64+
l = length(string(x))
65+
lp = length(string(prevfloat(x)))
66+
ln = length(string(nextfloat(x)))
67+
if ln < l && ln < lp
68+
nextfloat(x)
69+
elseif lp < l && lp <ln
70+
prevfloat(x)
71+
else
72+
x
73+
end
74+
end
75+
76+
function showgroup(io::IO,x::Group{:Measures,T,S,N} where S,u=basistext(x),c='𝟙') where {T,N}
77+
#back = T<:AbstractFloat && x.v[N]<0
78+
#!back && printexpo(io, 10, x.v[N])
79+
FieldAlgebra.printdims(io,x,u)
80+
iz = iszero(FieldAlgebra.norm(x.v))
81+
xc = coef(x)
82+
iz && (isone(xc)||abs(measure(xc))<1) && print(io, c)
83+
#back && printexpo(io, 10, last(x.v))
84+
if !isone(xc)
85+
if float(abs(measure(xc)))<1 && !FieldAlgebra.isgroup(xc)
86+
print(io, '/')
87+
print_special(io, makeint(inv(xc)))
88+
else
89+
!iz && print(io, '')
90+
if FieldAlgebra.isgroup(xc)
91+
print(io, '(')
92+
print_special(io, makeint(xc))
93+
print(io, ')')
94+
else
95+
print_special(io, makeint(xc))
96+
end
97+
end
98+
end
99+
print(io, " = ")
100+
print_special(io, product(x))
101+
end
102+
103+
import FieldAlgebra: special_print, print_special
104+
function special_print(io::IO, M::Measurement, error_digits::Int=get(io,:error_digits,2))
105+
isinf(M) && (return print(io,"\\infty "))
106+
err_digits = -Base.hidigit(M.err, 10) + error_digits
107+
digits = if isfinite(M.val)
108+
max(-Base.hidigit(M.val, 10) + 2, err_digits)
109+
else
110+
err_digits
111+
end
112+
val = if iszero(M.err) || !isfinite(M.err)
113+
M.val
114+
else
115+
round_extra(round(M.val, digits = digits))
116+
end
117+
err = round_extra(round(M.err, sigdigits=error_digits))
118+
sval = string(val)
119+
if 'e' sval
120+
serr = string(err)
121+
'e' serr && (serr = match(r"(\d+.\d+)[e](-?\d+)",serr).captures[1])
122+
m = match(r"(\d+.\d+)[e](-?\d+)",string(val)).captures
123+
ms = replace(serr,'.'=>"")
124+
zs = digits+1+Base.hidigit(M.val, 10)+(M.val<0)-length(m[1])
125+
z = join(string.(zeros(Int,zs)))
126+
print(io,"$(m[1])$z($(ms[1]'0' ? ms[1:error_digits] : ms[end-error_digits+1]'0' ? ms[end-error_digits+1:end] : join(string(ms[end],"0")))) \\times 10^{$(m[2])}")
127+
else
128+
mz = match(r"0\.0*",sval)
129+
zs = digits+1+Base.hidigit(M.val, 10)+(M.val<0)-length(sval)+(isnothing(mz) ? 0 : length(mz.match)-1)
130+
if zs<0 && sval[end]=='0' && sval[end-1]=='.'
131+
print(io, val, " (\\pm ")
132+
special_print(io,err)
133+
print(io, ')')
134+
else
135+
z,ms = join(string.(zeros(Int,zs))),replace(string(err),'.'=>"")
136+
print(io,"$sval$z($(ms[1]'0' ? ms[1:error_digits] : ms[end-error_digits+1]'0' ? ms[end-error_digits+1:end] : join(string(ms[end],"0"))))")
137+
end
138+
end
139+
end
140+
function print_special(io::IO, M::Measurement, error_digits::Int=get(io,:error_digits,2))
141+
isinf(M) && (return print(io,"Inf"))
142+
err_digits = -Base.hidigit(M.err, 10) + error_digits
143+
digits = if isfinite(M.val)
144+
max(-Base.hidigit(M.val, 10) + 2, err_digits)
145+
else
146+
err_digits
147+
end
148+
val = if iszero(M.err) || !isfinite(M.err)
149+
M.val
150+
else
151+
round_extra(round(M.val, digits = digits))
152+
end
153+
err = round_extra(round(M.err, sigdigits=error_digits))
154+
sval = string(val)
155+
if 'e' sval
156+
serr = string(err)
157+
'e' serr && (serr = match(r"(\d+.\d+)[e](-?\d+)",serr).captures[1])
158+
m = match(r"(\d+.\d+)[e](-?\d+)",string(val)).captures
159+
ms = replace(serr,'.'=>"")
160+
zs = digits+1+Base.hidigit(M.val, 10)+(M.val<0)-length(m[1])
161+
z = join(string.(zeros(Int,zs)))
162+
print(io,"$(m[1])$z($(ms[1]'0' ? ms[1:error_digits] : ms[end-error_digits+1]'0' ? ms[end-error_digits+1:end] : join(string(ms[end]),"0"))) × 10")
163+
FieldAlgebra.printexpo(io,Meta.parse(m[2]))
164+
else
165+
mz = match(r"0\.0*",sval)
166+
zs = digits+1+Base.hidigit(M.val, 10)+(M.val<0)-length(sval)+(isnothing(mz) ? 0 : length(mz.match)-1)
167+
if zs<0 && sval[end]=='0' && sval[end-1]=='.'
168+
print(io, val, "")
169+
print_special(io,err)
170+
print(io, ')')
171+
else
172+
z,ms = join(string.(zeros(Int,zs))),replace(string(err),'.'=>"")
173+
print(io,"$sval$z($(ms[1]'0' ? ms[1:error_digits] : ms[end-error_digits+1]'0' ? ms[end-error_digits+1:end] : join(string(ms[end],"0"))))")
174+
end
175+
end
176+
end
177+
63178
# unit systems
64179

65180
const usingSimilitude = true #UnitSystems.similitude()
@@ -82,7 +197,7 @@ end
82197
for unit (:boltzmann,:planckreduced,:lightspeed,:vacuumpermeability,:electronmass,:molarmass)
83198
@eval @pure $unit(U::UnitSystem,C::Coupling) = $unit(U)
84199
end
85-
for unit (Constants...,:vacuumpermeability)
200+
for unit (Constants...,:permeability)
86201
unit:planck && @eval @pure $unit(U::UnitSystem) = UnitSystems.$unit(U)
87202
unit:angle && (@eval @pure $unit(U::UnitSystem,S::UnitSystem) = unit($unit(S)/$unit(U)))
88203
end
@@ -93,7 +208,7 @@ for unit ∈ Convert
93208
@pure @inline $unit(v::Real,U::UnitSystem{kB,ħ,𝘤,μ₀,mₑ,Mᵤ,extra},S::UnitSystem{kB,ħ,𝘤,μ₀,mₑ,Mᵤ,extra}) where {kB,ħ,𝘤,μ₀,mₑ,Mᵤ,extra} = v
94209
end
95210
unit:angle && (@eval @pure @inline $unit(U::UnitSystem{kB,ħ,𝘤,μ₀,mₑ,Mᵤ,extra},S::UnitSystem{kB,ħ,𝘤,μ₀,mₑ,Mᵤ,extra}) where {kB,ħ,𝘤,μ₀,mₑ,Mᵤ,extra} = 𝟏)
96-
if unit (Constants...,:permittivity,:angle)
211+
if unit (Constants...,:permittivity,:permeability,:angle)
97212
@eval @pure @inline $unit(U::UnitSystem) = $unit(Natural,U)
98213
end
99214
end
@@ -108,9 +223,9 @@ end
108223
# fundamental constants, αinv = (34259-1/4366.8123)/250 # 137.036 exactly?
109224

110225
if usingSimilitude
111-
export Similitude, 𝟙, Unified
226+
export Similitude, 𝟙, Unified, quotient
112227
import Similitude
113-
import Similitude: Unified, coefprod, promoteint, USQ
228+
import Similitude: Unified, coefprod, promoteint, USQ, quotient,dimlatex, morphism
114229
import Similitude: Group,AbelianGroup,LogGroup,ExpGroup,Quantity,Dimension,Quantities,𝟙,usq
115230
import Similitude: Values,value,vals,basis,valueat,showgroup,ratio,isq,dims,dimtext
116231
import FieldAlgebra: makeint, product
@@ -119,6 +234,7 @@ for D ∈ (:F,:M,:L,:T,:Q,:Θ,:N,:J,:A,:R,:C)
119234
end
120235
FieldAlgebra.makeint(x::MeasureSystems.Measurements.Measurement) = x
121236
FieldAlgebra.promoteint(x::Measure) = x
237+
FieldAlgebra.latext(::Group{:Measures}) = Similitude.usqlatex
122238
@group Measures begin
123239
kB = UnitSystems.kB
124240
NA = UnitSystems.NA

0 commit comments

Comments
 (0)