Closed arrowtype closed 2 years ago
It turns out, there are quite a few kerns against the basic numbers.
from fontParts.fontshell import RFont as Font
font = Font("src/ufo/sans/Recursive Sans-Casual A.ufo")
numbers = "zero one two three four five six seven eight nine".split(" ")
for key in font.kerning.keys():
if key[0] in numbers or key[1] in numbers:
print(key)
Yields:
('P', 'seven')
('at', 'seven')
('eight', 'public.kern2.Punct_low_left')
('eight', 'public.kern2.Punct_straight_quote')
('eight', 'public.kern2.Punct_top_left')
('eight', 'public.kern2.braceright')
('eight', 'public.kern2.bracketright')
('eight', 'public.kern2.parenright')
('eight', 'question')
('five', 'public.kern2.Punct_low_left')
('five', 'public.kern2.Punct_straight_quote')
('five', 'public.kern2.Punct_top_left')
('five', 'public.kern2.braceright')
('five', 'public.kern2.bracketright')
('five', 'public.kern2.parenright')
('five', 'question')
('four', 'public.kern2.Punct_low_left')
('four', 'public.kern2.Punct_straight_quote')
('four', 'public.kern2.Punct_top_left')
('four', 'public.kern2.braceright')
('four', 'question')
('one', 'public.kern2.Punct_low_left')
('one', 'public.kern2.Punct_straight_quote')
('one', 'public.kern2.Punct_top_left')
('one', 'question')
('public.kern1.A_right', 'seven')
('public.kern1.B_right', 'seven')
('public.kern1.C_right', 'seven')
('public.kern1.G_right', 'seven')
('public.kern1.K_right', 'four')
('public.kern1.K_right', 'seven')
('public.kern1.M_right', 'seven')
('public.kern1.O_right', 'seven')
('public.kern1.Punct_low_right', 'eight')
('public.kern1.Punct_low_right', 'five')
('public.kern1.Punct_low_right', 'four')
('public.kern1.Punct_low_right', 'nine')
('public.kern1.Punct_low_right', 'one')
('public.kern1.Punct_low_right', 'seven')
('public.kern1.Punct_low_right', 'three')
('public.kern1.Punct_low_right', 'two')
('public.kern1.Punct_straight_quote', 'eight')
('public.kern1.Punct_straight_quote', 'five')
('public.kern1.Punct_straight_quote', 'four')
('public.kern1.Punct_straight_quote', 'nine')
('public.kern1.Punct_straight_quote', 'one')
('public.kern1.Punct_straight_quote', 'seven')
('public.kern1.Punct_straight_quote', 'three')
('public.kern1.Punct_straight_quote', 'two')
('public.kern1.Punct_top_right', 'eight')
('public.kern1.Punct_top_right', 'five')
('public.kern1.Punct_top_right', 'four')
('public.kern1.Punct_top_right', 'nine')
('public.kern1.Punct_top_right', 'one')
('public.kern1.Punct_top_right', 'seven')
('public.kern1.Punct_top_right', 'three')
('public.kern1.Punct_top_right', 'two')
('public.kern1.R_right', 'seven')
('public.kern1.T_right', 'four')
('public.kern1.T_right', 'seven')
('public.kern1.Y_right', 'four')
('public.kern1.Y_right', 'seven')
('public.kern1.a_right', 'seven')
('public.kern1.braceleft', 'eight')
('public.kern1.braceleft', 'five')
('public.kern1.braceleft', 'four')
('public.kern1.braceleft', 'nine')
('public.kern1.bracketleft', 'eight')
('public.kern1.bracketleft', 'five')
('public.kern1.bracketleft', 'four')
('public.kern1.bracketleft', 'nine')
('public.kern1.bracketleft', 'seven')
('public.kern1.bracketleft', 'two')
('public.kern1.e_right', 'seven')
('public.kern1.n_right', 'seven')
('public.kern1.o_right', 'seven')
('public.kern1.parenleft', 'eight')
('public.kern1.parenleft', 'five')
('public.kern1.parenleft', 'four')
('public.kern1.parenleft', 'nine')
('public.kern1.x_right', 'seven')
('question', 'nine')
('questiondown', 'eight')
('questiondown', 'four')
('questiondown', 'nine')
('questiondown', 'one')
('questiondown', 'seven')
('questiondown', 'three')
('questiondown', 'two')
('seven', 'at')
('seven', 'four')
('seven', 'public.kern2.O_left')
('seven', 'public.kern2.Punct_low_left')
('seven', 'public.kern2.Punct_straight_quote')
('seven', 'public.kern2.Punct_top_left')
('seven', 'public.kern2.braceright')
('seven', 'question')
('six', 'public.kern2.Punct_low_left')
('six', 'public.kern2.Punct_straight_quote')
('six', 'public.kern2.Punct_top_left')
('six', 'public.kern2.braceright')
('six', 'public.kern2.bracketright')
('six', 'public.kern2.parenright')
('six', 'question')
('three', 'public.kern2.Punct_low_left')
('three', 'public.kern2.Punct_straight_quote')
('three', 'public.kern2.Punct_top_left')
('three', 'question')
('two', 'public.kern2.Punct_low_left')
('two', 'public.kern2.Punct_straight_quote')
('two', 'public.kern2.Punct_top_left')
('two', 'public.kern2.braceright')
('two', 'question')
Until I test it, I’ll be unsure whether the best way forward is to remove all that kerning, or to make fresh .tnum
figures without attaching any kerning. I’ll probably make some branches to explore this.
I wanted to see kerning values a little more clearly, so I improved the Python script a bit:
"""
Recursive is intended to have tabular figures by default. However, there are some kerns present in these figures, which disrupts their tabularity.
A known issue is kerning between /seven and /period. But, there may be other kerns beyond that. This will check for them so they can be removed.
"""
# from fontParts.fontshell import RFont as Font
from ufoLib2 import Font
from fontTools.ufoLib.kerning import lookupKerningValue
font = Font("src/ufo/sans/Recursive Sans-Casual A.ufo")
numbers = "zero one two three four five six seven eight nine".split(" ")
grouped = []
for value in font.groups.values():
for name in value:
grouped.append(name)
numberKerns = {}
for number in numbers:
numberKerns[number] = []
for name in font.keys():
kern1 = lookupKerningValue((number, name), font.kerning, font.groups)
kern2 = lookupKerningValue((name, number), font.kerning, font.groups)
if kern1 != 0:
numberKerns[number].append(((number, name), kern1))
if kern2 != 0:
numberKerns[number].append(((name, number), kern2))
import pprint
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(numberKerns)
I’ve realized the fairly obvious solution here: make .pnum
figures, then map kerning to those. Then, remove kerning from default figures.
This is better than making new tnum
figures without kerning, because the default characters already look tabular, and having tabular-by-default characters fits in with the spirit of this project.
Problem description In issue https://github.com/arrowtype/recursive/issues/472 and release 1.079, I corrected the problem that the default 1 and 7 had kerning, which prevented them from being properly tabular figures. However, there is still kerning between the period and 7 (and vice versa) that disrupts tabular data.
It’s also possible that other disruptive kerns exist, so resolving this issue should include a check for and solution to any other kerning that might be lurking around to disrupt tabular data.
Expected behavior
Default figures should work fully as tabular figures, including by having no kerning against adjacent punctuation likely to show up in tabular data (especially the period).
That, OR there should be a
tnum
feature that adds in a alts for period, etc, that are not kerned against numbers.