generated from ivoa-std/doc-template
-
Notifications
You must be signed in to change notification settings - Fork 4
/
known-units-to-tex.py
59 lines (50 loc) · 1.88 KB
/
known-units-to-tex.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#!/usr/bin/python3
import sys
import re
lines = []
for line in sys.stdin:
if not re.search('#',line):
lines.append(line.strip().split(','))
nrows = (len(lines)+1)//2
# The name-generating hack below doesn't work well in all cases,
# so supply some explicit replacements.
replacements = { 'unity:DetectorChannel': 'channel',
'qudt:DegreeAngle': 'degree (angle)',
'unity:DistributionBin': 'bin',
'qudt:Gram': 'gramme',
'unity:MilliArcSecond': 'milliarcsecond',
'qudt:MinuteTime': 'minute (time)',
'qudt:SecondTime': 'second (time)',
'unity:SolarLuminosity': 'luminosity',
'unity:StellarMagnitude': 'magnitudes',
'qudt:UnifiedAtomicMassUnit': 'AMU',
}
all_uppercase = re.compile('^[A-Z]+$')
initial_capital = re.compile('[A-Z][^A-Z]*')
def fmtname(uname):
if uname in replacements:
rval = replacements[uname]
else:
nameparts = uname.split(':')
if len(nameparts) != 2:
print("name {} malformed".format(uname), file=sys.stderr)
rval ='XXX'
else:
tname = nameparts[1]
if all_uppercase.match(tname):
rval = tname
elif initial_capital.match(tname):
rval = " ".join(s.lower()
for s in initial_capital.findall(tname))
else:
rval = tname
return [rval]
def fmtrow(r):
s = "&".join([r[0]] + fmtname(r[1]) + (["$\\cdot$" if s=="1" else s[1:] for s in r[2:]]))
return s.replace("%", "\\%") # one of the units is '%' (ie, the TeX comment character)
for r in range(nrows):
r2 = r+nrows
if r2 >= len(lines):
print("{}\\\\".format(fmtrow(lines[r])))
else:
print("{}\n\t& {}\\\\".format(fmtrow(lines[r]), fmtrow(lines[r2])))