Thank you for providing the repro project.
I finally got a chance to look at this again. The issue is visible when using vertical alignment other than top.
The change in behavior is related to how the descender of a given line is tracked.
In previous versions like Preview 1, the descender wasn’t tracked correctly where in the case of using a positive offset, this value remained uninitialized at zero instead of some positive value reflective of where the character’s descender ends up above 0 which is the baseline. As such, it ended up using a descender value of 0. In Preview 8 for example, the descender is tracked correctly where in this case we end up with some positive value which is why the vertical alignment is different.
The question now is how to handle this…
Here is how alignment in Preview 8 when using <voffset=1em>
Top Alignment where highest Ascender is aligned with top of text container.
Center vertical alignment which uses the highest Ascender and lowest Descender and aligns the text in the middle vertically.
Bottom Alignment where lowest Descender is aligned with bottom of text container.
As you can see it is correctly aligned in Preview 8.
In Preview 1, with middle vertical alignment we were getting the following which used the correct Ascender with voffset but used 0 as the Descender instead of the actual descender of the offset letter A.
In terms of a potential revised behavior when using voffset, I could make it such that voffset would use the Descender of the current font and size which would be the same / consistent whether you have a single character using voffset or not on a line. Unfortunately, this would still result in a different position then in Preview 1 but it would be closer in the sense of the different between baseline and descender position vs. the much larger shift of baseline to voffset adjusted descender.
Thoughts?