自动为 Word 编号方程

Automate numbering equations for Word

最近,我了解到我可以通过在等式后键入 #(1),例如 \alpha#(1),通过此 answer 手动为我的等式编号。现在我想创建一个 VBA 宏,以便它检测我的活动文档中处于显示模式的所有方程式,并自动为它们编号(通过使用字段或其他方式)。目前,我仍在研究代码,但我坚持获取选定的方程式文本并将其替换为自身加上 ​​#(i)。到目前为止,这是我的代码

Sub NumberDisplayedEquations()
  Dim objEq As OMath
  Dim objRange As Range
  With ActiveDocument
      Dim i As Integer
      Dim j As Integer
      j = 1
      For i = 1 To .OMaths.Count
          Set objEq = .OMaths(i)
          If objEq.Type = wdOMathDisplay Then
            objEq.Linearize
            Set objRange = objEq.Range
            objRange.Text = objRange.Text + "#(" + Format(j, (0)) + ")"

            Set objRange = .OMaths.Add(objRange)
            Set objEq = objRange.OMaths(1)
            objEq.BuildUp
            j = j + 1
          End If
      Next i
  End With
End Sub

确实,这适用于简单的方程式。但是,如果我有任何更复杂的东西,例如,通过等号对齐的方程式,那么我的代码就会中断。我不太明白为什么,如果有人能指点一下就好了。

编辑。问题似乎是,如果我要在显示模式下写下一个方程式,例如,按 alt-=,然后键入 \alpha =x+2,按 shift+enter 而不是 enter,然后继续写下一行等式,word 在 \alpha =x+2 的末尾添加了一个额外的 newline 字符。事实上,使用 MsgBox 到 return 等式的文本,在原始等式 \alpha =x+2 的末尾有一个额外的方块状字符。我不知道如何继续检测这样的字符,因为我什至不能输入这样的字符。

编辑 2。我意识到按 shift-enter 会创建一个手动换行符,即添加一个名为 vbVerticalTab 的字符,因此我需要在对方程式编号之前删除该字符。事实上,我已经复制粘贴了我的工作代码。

正如所承诺的,这是一个有效的 vba 宏代码。第一个为方程式编号,第二个清除编号。唯一需要注意的是,以前对齐的方程式在编号时不再对齐。我还不确定如何处理这个问题。

Sub NumberDisplayedEquations()
  Dim objEq As OMath
  Dim objRange As Range
  With ActiveDocument
      Dim i As Integer
      Dim j As Integer
      j = 1
      For i = 1 To .OMaths.Count
          Set objEq = .OMaths(i)
          If objEq.Type = wdOMathDisplay Then
              objEq.Linearize
              Set objRange = objEq.Range
              If InStr(1, objRange.Text, vbVerticalTab) Then
                  objRange.Text = Replace(objRange.Text, vbVerticalTab, "") + "#(" + Format(j, (0)) + ")" + vbNewLine
              Else
                  objRange.Text = objRange.Text + "#(" + Format(j, (0)) + ")"
              End If
              Set objRange = .OMaths.Add(objRange)
              Set objEq = objRange.OMaths(1)
              objEq.BuildUp
              j = j + 1
          End If
      Next i
  End With
End Sub

Sub ClearDisplayedEquationsNumber()
  Dim objEq As OMath
  Dim objRange As Range
  With ActiveDocument
      Dim i As Integer
      Dim j As Integer
      Dim L As Integer
      Dim R As Integer
      j = 1
      For i = 1 To .OMaths.Count
          Set objEq = .OMaths(i)
          If objEq.Type = wdOMathDisplay Then
              objEq.Linearize
              Set objRange = objEq.Range
              R = InStr(1, objRange.Text, "#(")
              If R > 0 Then
                  objRange.Text = Mid(objRange.Text, 3, R - 3)
                  Set objRange = .OMaths.Add(objRange)
                  Set objEq = objRange.OMaths(1)
                  objEq.BuildUp
              End If
          End If
      Next i
  End With
End Sub