angleToTex function
\ang{12;30;15} → 12°30′15″; \ang{12.5} → 12.5°.
Implementation
String angleToTex(String input, {SiOptions options = const SiOptions()}) {
final o = options;
var parts = input.split(';').map((p) => p.trim()).toList();
if (parts.length > 3) parts = parts.sublist(0, 3);
final mode = o['angle-mode'];
if (mode == 'decimal' && parts.length > 1) {
final d = double.tryParse(parts[0].isEmpty ? '0' : parts[0]) ?? 0;
final m = parts.length > 1 ? double.tryParse(parts[1]) ?? 0 : 0;
final s = parts.length > 2 ? double.tryParse(parts[2]) ?? 0 : 0;
final sign = parts[0].startsWith('-') ? -1 : 1;
parts = [_double(d + sign * (m / 60 + s / 3600))];
} else if (mode == 'arc' && parts.length == 1 && parts[0].isNotEmpty) {
final v = double.tryParse(parts[0].replaceAll(',', '.'));
if (v != null) {
final a = v.abs();
var d = a.floor();
var m = ((a - d) * 60).floor();
var s = (a - d - m / 60) * 3600;
s = double.parse(s.toStringAsFixed(6));
if (s >= 60) {
s -= 60;
m++;
}
if (m >= 60) {
m -= 60;
d++;
}
parts = [
'${v < 0 ? '-' : ''}$d',
if (m != 0 || s != 0) '$m' else '',
if (s != 0) _double(s) else '',
];
}
}
final symbols = [
_symbolFor(o['angle-symbol-degree']),
_symbolFor(o['angle-symbol-minute']),
_symbolFor(o['angle-symbol-second']),
];
final fill = [
o._flag('fill-angle-degrees'),
o._flag('fill-angle-minutes'),
o._flag('fill-angle-seconds'),
];
final last = parts.lastIndexWhere((p) => p.isNotEmpty);
final out = <String>[];
for (var i = 0; i < parts.length; i++) {
var p = parts[i];
if (p.isEmpty) {
final later = i < last;
final earlier = parts.sublist(0, i).any((q) => q.isNotEmpty);
if (!(fill[i] && (later || earlier))) continue;
p = '0';
}
out.add(_withSymbolOverDecimal(p, symbols[i], o));
}
final sep = o['angle-separator'];
return out.join(sep);
}