Wednesday, 10 October 2018

Word Macros for equations

I have been copying and pasting tables and equations in MS-Word for far too long. At last I have written some word macros to speed things up, so I can more easily produce correctly aligned equations like
Fig 1: Aligning equation numbers neatly using 2 x 1 tables
and
Fig: LHS of equations unchanged and aligning equation numbers
I also wrote macros to create left / centre / right justified equations using font size 12 instead of 10 which MS always uses and I find too small.

So I now have a "Quick access toolbar" like this

After the AB icon, they have the following effects
  1. Select table
  2. Add bars on table
  3. Remove bars from table
  4. Make table a box. 
  5. Insert left justified equation (font size 12)
  6. Insert unbarred 2 x 1 table with centred justified equation in column 1, (xx) in column 2 (Fig 1)
  7. Insert unbarred 3 x 1 with right justified equation in column 1, (xx) in column 3 (Fig 2)
The first four are very useful for quickly sorting problems with tables and tidying them. They are all linked directly to MS-Word commands. 5-7 are linked to the macros. Sadly the equation insertion macros cannot be used twice the table creation macros! Therefore we also need icon 5, π, to manually insert the equation in the middle column of the three column table.

The macros are in WordBasic not VBA which is a bit amateurish, but WordBasic is what the Word macro recorder writes.

If you would like to use these macros click Read more and copy and paste them into the Word Visual Basic editor on the Developer tab.

The version in Read more might be out of date. I am fairly diligent about keeping back up versions here.
'Macros to help with equation editing
'By George Keeling and on my blog at https://spacetime-and-geometry.blogspot.com/
'Please feel free to use, copy and give away.
'Version2 14/10/83 tidied up a bit and got 2 of 3 equations inserting correctly!
'Added vertical alignment
'Version 3 25/10/2018 Introduced EquationFontSize

'TO FIX
'InsertEquationL gets incorrect font!
'Inserting second equation in EquationTable3() does not work

Const EquationFontSize = 12          '**** Change this if you prefer another equation font size

Sub InsertEquationL()
'Insert left justified equation with font EquationFont
'Sadly this cannot be called from inside the table creation Macros, because the font comes out wrong
    Dim SaveFontSize
    SaveFontSize = Selection.Font.Size
 
    Selection.Font.Size = EquationFontSize
    WordBasic.EquationEdit
    Selection.TypeText Text:="="
    Selection.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend
    Selection.Font.Size = EquationFontSize
 
    'Quite often the attempt to justify the equation fails!
    On Error Resume Next
    Selection.OMaths(1).ParentOMath.Justification = wdOMathJcLeft

    Selection.Font.Size = SaveFontSize
End Sub
Sub CreateTable(Columns As Integer)
'Create table with Columns (Columns = 2 or 3) columns
 
    ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=1, NumColumns:= _
        Columns, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _
        wdAutoFitFixed
    With Selection.Tables(1)
        If .Style <> "Table Grid" Then
            .Style = "Table Grid"
        End If
        .ApplyStyleHeadingRows = True
        .ApplyStyleLastRow = False
        .ApplyStyleFirstColumn = True
        .ApplyStyleLastColumn = False
        .ApplyStyleRowBands = True
        .ApplyStyleColumnBands = False
        .Borders(wdBorderTop).LineStyle = wdLineStyleNone
        .Borders(wdBorderLeft).LineStyle = wdLineStyleNone
        .Borders(wdBorderBottom).LineStyle = wdLineStyleNone
        .Borders(wdBorderRight).LineStyle = wdLineStyleNone
        .Borders(wdBorderVertical).LineStyle = wdLineStyleNone
        .Borders(wdBorderDiagonalDown).LineStyle = wdLineStyleNone
        .Borders(wdBorderDiagonalUp).LineStyle = wdLineStyleNone
    End With

End Sub
Sub EquationTable2()
' Create a table with 2 columns suitable for equations of form
'   x = sin a / cos a   (9)
'      x = tan a       (10)
    Dim SaveFontSize
    SaveFontSize = Selection.Font.Size
 
    CreateTable (2)
 
    Selection.Tables(1).Columns(1).PreferredWidthType = wdPreferredWidthPoints
    Selection.Columns.PreferredWidth = CentimetersToPoints(15.6)
    Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter

    'Insert equation
    Selection.Font.Size = EquationFontSize
    WordBasic.EquationEdit
    Selection.TypeText Text:="="

    'Third cell
    Call FinishOff(SaveFontSize)

End Sub
Sub EquationTable3()
' Create a table with 3 columns suitable for equations of form
' x = sin a / cos a      (9)
'   = tan a             (10)
    Dim SaveFontSize
    SaveFontSize = Selection.Font.Size
 
    CreateTable (3)
 
    'In first cell
    Selection.Tables(1).Columns(1).PreferredWidthType = wdPreferredWidthPoints
    Selection.Tables(1).Columns(1).PreferredWidth = CentimetersToPoints(3.38)
    Selection.ParagraphFormat.Alignment = wdAlignParagraphRight

    'Insert right justified equation
    Selection.Font.Size = EquationFontSize
    WordBasic.EquationEdit
    Selection.TypeText Text:="x"
    Selection.OMaths(1).ParentOMath.Justification = wdOMathJcRight

    'Second cell
    Selection.Move Unit:=wdColumn, Count:=1
    Selection.SelectColumn
    Selection.Columns.PreferredWidthType = wdPreferredWidthPoints
    Selection.Columns.PreferredWidth = CentimetersToPoints(11.62)
    Selection.ParagraphFormat.Alignment = wdAlignParagraphLeft
 
    'Insert left justified equation - For some reason this does not work! :-(
    'The equation is not created
'    Selection.Font.Size = EquationFontSize
'    WordBasic.EquationEdit
'    Selection.TypeText Text:="="
'    Selection.OMaths(1).ParentOMath.Justification = wdOMathJcLeft
 
    'Third cell
    Call FinishOff(SaveFontSize)
 
End Sub

Sub FinishOff(FontSize)
'Do the last column which contains formula number. We start at second last column
'Also vertically align central (useful if formula gets tall with fractions or matrices etc)

    Selection.Move Unit:=wdColumn, Count:=1
    Selection.SelectColumn
    Selection.Font.Size = FontSize
    Selection.Columns.PreferredWidthType = wdPreferredWidthPoints
    Selection.Columns.PreferredWidth = CentimetersToPoints(1.38)
    Selection.ParagraphFormat.Alignment = wdAlignParagraphRight
    Selection.TypeText Text:="(xx)"

    Selection.Tables(1).Select
    Selection.Cells.VerticalAlignment = wdCellAlignVerticalCenter
End Sub

No comments:

Post a comment