Hi! Wouldn’t it be cool to link mirrored kerning?
It’s kind of annoying to go through reflected pairs and carefully eyeball the same amount to the other side. And that includes both symmetric (T) and reflected («) glyphs.
I don’t think symmetrical letters can be treated in the same way for spacing and kerning. Spacing is specific to a single letter, kerning is not, as it happens with another letter either on its left or its right, and that is very different.
To take the given example of the /u: if the right side of my /u gets all the kerning from the left side of the /n, and I’ve been kerning /F/n, does that mean I will have that kern value in /u/F ? That’s probably not what I want at all.
I like the idea of having a way to automatically transfer kerning values to opposite-side groups, but it can’t really be defined in a setting as global as the group definition.
I made a script a while ago that lets user transfer kerning pairs between groups with optional rules. I could add support for the | modifier and release it, if that would be helpful to some?
Let me clarify what I mean for you and the developers!
What I’m requesting is not simply u mirroring n’s opposite kerning everywhere, of course that would be stupid. But only when you want it to: for symmetric/reflected cases. Fn is not symmetric to uF, so no kerning mirroring happens. But Tn, Tr, TmTp and uTqT would often have the same kern value, and could be kerned as one group. Other example is most of punctuation: (O and O), [n and u], .V and V. and so on.
Technically, the rule is “if both groups have mirrored relatives, then copy the kern value to them too. If not – then kern separately as usual”.
That doesn’t ruin any current kerning habits, and doesn’t force anything to happen automatically against the user’s will – the user defines this manually for appropriate glyphs
Ah, I see, it’s not a very intuitive idea. Or I’m overcomplicating the explanation of a really simple idea.
Let’s set up the following groups (bold) for the following letters (italic):
Left kerning group Bowl — oqdce
Right group |Bowl — opb
Left kerning group A — AÆ
Right kerning group |A — A
Let’s mark Bowl and |Bowl as “linked” groups. Same for A and |A.
Now, whenever you kern two “linked” groups, copy the value to their opposites: Ae = pA, Ac = bA (which means kerning |A + Bowl and copying it to |Bowl + A).
But, if only one or none of groups is “linked”, just kern it independently as usual: Af ≠ fA, because we didn’t set up any linked groups for f. Ap ≠ pA, because left side of p doesn’t belong to a linked group in this example. oÆ = Ao ≠ Æo, because Æ’s right side doesn’t belong to a linked group either, but the left does.
Then of course it works correctly with other linked groups as well, such as T and |T: Td = pT = Te ≠ dT ≠ Tp AT = TÆ ≠ ÆT
Hope it makes more sense now! The algorithm is really just “if two linked groups get a kerning value between them, copy that value to their opposites pair” and that’s pretty much it, I think.
Hi! I was just searching for a solution for the same problem, @alexs approach sounds actually very promising. Until then I was thinking of a middle way: A script that detects asymmetric spacing and kerning of (to keep it simple) only symmetrical shapes? f.e. open a new tab with asymmetrical spacing and kerning value of selected glyphs.
Reaching out to you because unfortunately I am a zero in coding.
Thanks in advance.
Hi! I’m trying to make this idea work with this script. Just name both left and right “mirroring” groups with a bar symbol (for example @|A or @|V), kern them, and the script should create the opposite pairs. Pretty simple concept, I might have really overcomplicated the explanation previously.
The problem is that it crashes Glyphs, seemingly depending on what groups you kern and what are created with the script. In some cases it gives this error, in other just crashes:
Traceback (most recent call last):
File “”, line 15, in
File “_convenience.py”, line 162, in _getitem__objectForKey
return container_unwrap(res, KeyError, key)
File “_convenience.py”, line 659, in container_unwrap
raise exc_type(*exc_args)
KeyError: 9182865134922256.0
Could you please have a look what am I doing wrong?