The text is jumping with descenders because (I imagine) you are using sourceRectAtTime to control scale and/or anchor point.
To remedy this, if you’re working with multiple text layers (1 per line), you’ll want to add this expression to your sourceText property of each layer:
str = text.sourceText;
time < 0 ? str + "|" : str
Then, for the sourceRectAtTime() values, you’ll want to use sourceRectAtTime(-1) for the .height and .top values. For example, if the Anchor Point is left aligned:
rect = sourceRectAtTime()
rect2 = sourceRectAtTime(-1)
x = rect.left;
y = rect2.top + rect2.height / 2;
[x,y]
If you’re using paragraph text and one single text layer, you’d set each of your sourceRectAtTime() values to a time later in the comp, when the text is fully typed out.