Thank you, Merci and Danke, jpl! It is certainly a great improvement to avoid using Selection.TypeText but if you remove the line
Code:
Set plage = Insere(MathTerm.Range, "+")
then the inverse metric appears before the metric! Grrr. So I have made what I hope is a further improvement so that functions and text can be added in the expected order:
Code:
Function InsertFunction(Functions As OMathFunctions, InsertionPoint As Range, FuncType As WdOMathFunctionType) As OMathFunction
'Add a function in Functions at InsertionPoint and move InsertionPoint to after the function, ready for next
Dim NewFunction As OMathFunction
Set NewFunction = Functions.Add(InsertionPoint, FuncType)
Set InsertionPoint = NewFunction.Range
InsertionPoint.Collapse (wdCollapseEnd)
Set InsertFunction = NewFunction
End Function
Sub InsertText(InsertionPoint As Range, MyText As String)
'Inserts MyText at InsertionPoint and returns moves InsertionPoint to after that text
'so this is very similar to
'Equation.Functions.Add(InsertionPoint, wdOMathFunctionNormalText) .... which does not work!!
InsertionPoint.Text = MyText
InsertionPoint.Collapse (wdCollapseEnd)
End Sub
Sub ExampleWriteExpression()
'insertion point should be in equation. Metric + inverse metric inserted
Dim Equation As OMath
Dim MathTerm As OMathFunction
Dim InsertionPoint As Range
'If Selection.OMaths.Count <> 1 Then ExpanderFatalError ("Cursor must be in an equation.")
Set Equation = Selection.OMaths(1)
Set InsertionPoint = Selection.Range
Set MathTerm = InsertFunction(Equation.Functions, InsertionPoint, wdOMathFunctionScrSub)
MathTerm.ScrSub.E.Range = "g"
MathTerm.ScrSub.Sub.Range = ChrW(&H3BC) & ChrW(&H3BD)
Call InsertText(InsertionPoint, "+")
Set MathTerm = InsertFunction(Equation.Functions, InsertionPoint, wdOMathFunctionScrSup)
MathTerm.ScrSup.E.Range = "g"
MathTerm.ScrSup.Sup.Range = ChrW(&H3BC) & ChrW(&H3BD)
End Sub
This works perfectly for expanding horrid symbols and tensors in General Relativity which is what I want to do.
*********************
There is only one catch! If you insert brackets (wdOMathFunctionDelim) then you need to back up one character to get inside the brackets. Something like:
Code:
InsertionPoint.Start = InsertionPoint.Start - 1 'get into the bracket
InsertionPoint.Collapse (wdCollapseStart)
I will also update the page on my website that I referenced above. It inserts brackets.
Thanks again! A great example of international collaboration.