Shift mark position contextually?

My font includes ǟ and ȫ, but the related unencoded combination ë̄is also required. With the two first, I’ve used an additional “stacked” anchor to move the first mark closer to the body. Now, with ë̄, most software defaults to ë + combining macron, which makes it impossible to match the mark alignment of ǟ and ȫ. Is there any way I could solve this? Basically, I want to shift the dieresis down when followed by additional marks. Having extra glyphs in the font is an unacceptable tradeoff for me.

In InDesign, this depends on the composer the user applies. It should keep the separate combining marks in the World Ready Composer.

Do I get this right you have glyphs for all three in the font?

adieresismacron
odieresismacron
edieresismacron

If that is the case, you could add this line, either to ccmp or rlig, or both:

sub edieresis macroncomb by edieresismacron;

This will not trick the (old-style) Latin composers in InDesign though.

No, I don’t have a edieresismacron: ë̄is just one of many unencoded combinations with two or three stacked marks. Should I use GPOS to shift the first mark vertically, or is there some way to tell it to align to another anchor contextually?

Once it is a precomposed glyph, there is nothing to shift around anymore. (That is, unless you have another precomposed glyph like edieresis.stack, but that is not an option in your case if I understand it correctly.) If you want to shift marks with a pos rule, the marks need to remain separate glyphs.

What you could do is always decompose edieresis into e plus the combining accent:

sub edieresis by e dieresiscomb;

You can put it into rlig, then it will work at least in the World Ready Composer. I just tried an I could not get it to work in locl or ccmp.

Then you should be able to do something like this in kern (which will not overwrite the kern feature but add a lookup to it):

pos e dieresiscomb' <0 -50 0 0> macroncomb;

Or I suppose you aim for something like this:

pos e dieresiscomb' <0 -50 0 0> macroncomb' <0 -50 0 0>;

Again, this only works in the World Ready Composer. I haven’t tested outside Adobe CC now.

Hmm.

pos @base @CombiningTopAccents' <0 -90 0 0>;
pos @base @CombiningTopAccents @CombiningTopAccents' <0 -90 0 0>;
pos @base @CombiningTopAccents @CombiningTopAccents @CombiningTopAccents' <0 -90 0 0>;

This works for two marks (in the World Ready Composer), but once you add a third mark, the second is not shifted. Any idea why?

This method would also require an unique feature per instance. Is that possible?

I just tried an I could not get it to work in locl or ccmp.

Why doesn’t ccmp decompose stuff in the World Ready Composer? Is that a bug, or intentional? Isn’t that what ccmp is supposed to do?

maybe put each line in its own lookup?

No effect.