自动为 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
最近,我了解到我可以通过在等式后键入 #(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