最近,我了解到,在方程(例如,#(1),通过这个answer )之后,我可以用word逐字对方程进行手动编号。现在,我想创建一个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返回方程的文本,在原始方程\alpha =x+2的末尾有一个额外的方形字符。我不知道如何继续和检测这样的字符,因为我甚至不能键入这样的字符。
编辑2。我意识到按shift-enter会创建一个手动换行,也就是说,添加一个名为vbVerticalTab的字符,所以在对方程进行编号之前,我需要删除这个字符。实际上,我已经复制了我的工作代码。
发布于 2022-01-23 03:43:47
正如所承诺的,这是一个工作的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 Subhttps://stackoverflow.com/questions/70796976
复制相似问题