Feature request: mirroring kerning

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.

The amount of such pairs is not as small as it might seem:
A H O T U V W X Y i n l o v w x y 0 8 . , ’ : ; ( { [ « - _ * ^ < \ @ © +−×÷=>± then add case sensitive forms, non-latin scripts and multiply by ten masters (who doesn’t have ten these days) and that’s a good chunk of manual labor that could be reduced with a piece of code.

And this could be elegantly done with no interface butchering, just by adding a Bar to kerning groups:

That would mean if two linked groups meet, they will know what to do: [nu], otherwise behave normally.

I’ll have to think about it.

1 Like

From experience: Works very well for spacing, but not so well for kerning, even in sans designs.

There is a mekkablue script that lists uneven pairings. I have been meaning to extend it, but haven’t gotten around to it yet.

1 Like

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, Tm Tp and uT qT 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 :slight_smile:

I still don’t really see how that should work. Can you post a list of all the class definitions of the glyphs in the ‘T’ examples?

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 Bowloqdce
  • Right group |Bowlopb
  • Left kerning group A
  • Right kerning group |AA

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:
AffA, because we didn’t set up any linked groups for f.
AppA, because left side of p doesn’t belong to a linked group in this example.
= 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 = TedTTp

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.


Aha, I see you define a group with its name already as the mirror of another shape.

didn’t… Fontographer do this? I could be wrong.

Hi! Just wanted to check whether this can be expected in an update at some point?

We are thinking about it. But not soon.

1 Like

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.

There is a script like that already. Look for New Tab with Uneven Symmetric Kernings in the mekkablue scripts:

You genius! Thank you very much.

1 Like

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?