VBA Word: Convvert Equation to Latex

  • Thread starter Deleted member 199
  • Ngày gửi
D

Deleted member 199

Guest
1. Chuyển công thức toán thành Tex:
Mã:
Sub MathTypeEqnSearchReplace()
    Dim shapeNum As Long
    Dim eqn As InlineShape    
    shapeNum = ActiveDocument.InlineShapes.Count
    For i = 1 To shapeNum
        Set eqn = ActiveDocument.InlineShapes(i)
        If eqn.OLEFormat.ClassType = "Equation.DSMT4" Then
             eqn.Select
            Call MTCommand_TexToggle
            Stop 'Xử lý gì đó ở đây tùy ý nếu có lỗi
            Call MTCommand_TexToggle
        End If
    Next
End Sub
Nguồn tham khảo:

2. Xử lý lệch dòng:
Có vài trường hợp, công thức toán bị lệch dòng so với chữ, để xử lý việc này, logic như sau:
Tìm \[ và thay bằng ${, tìm ]\ và thay bằng }$.
Ghi lại thao tác bằng tay ra mã macro như sau:
Mã:
Sub macro_sualechdong ()
...
With Selection.Find
.text = "\["
.Replacement.text = "${"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.Execute Replace:=wdReplaceAll
End With
With Selection.Find
.text = "\]"
.Replacement.text = "}$"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.Execute Replace:=wdReplaceAll
End With
Application.Run MacroName:="MTCommand_TeXToggle"
End Sub
 
Em xin đóng góp 1 số cách em đã và đang dùng để xử lí lệch dòng giống ý tưởng của tác giả ạ.
Cách 1: Toggle tex.
Cách 2: Sử dụng classType"Equation.DSMT4".
Cách 3: Canh chỉnh vị trí shape.
Mã:
Sub danhdau()
Selection.WholeStory
Dim ObjMT As InlineShape
    For Each ObjMT In ActiveDocument.InlineShapes
        If ObjMT.Type = wdInlineShapeEmbeddedOLEObject Then
            ObjMT.Select
            Selection.Range.HighlightColorIndex = wdBrightGreen

        End If
    Next
End Sub
Sub formartmathtype()
Call danhdau
Dim ObjMT As InlineShape
    For Each ObjMT In ActiveDocument.InlineShapes
        If ObjMT.Type = wdInlineShapeEmbeddedOLEObject Then
        ObjMT.Select
        If Selection.Range.HighlightColorIndex = wdBrightGreen Then
           ObjMT.Select
            Application.Run MacroName:="MTCommand_TeXToggle"
            ''''''''''''''''
            Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "\["
        .Replacement.Text = "${"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Application.DisplayAlerts = False
    Selection.Find.Execute Replace:=wdReplaceAll
    With Selection.Find
        .Text = "\]"
        .Replacement.Text = "}$"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Application.DisplayAlerts = False
    Selection.Find.Execute Replace:=wdReplaceAll
    Application.DisplayAlerts = False
    Application.Run MacroName:="MTCommand_TeXToggle"
    ActiveDocument.UndoClear
        End If
        End If
        Next
End Sub
Sub fixloilechdong_toggle()
Application.Visible = False
Call formartmathtype
'**********************************
Application.Visible = True
End Sub
Sub fixloilechdong_MT4()
Dim hinh As InlineShape
For Each hinh In ActiveDocument.InlineShapes
    If hinh.OLEFormat.ClassType = "Equation.DSMT4" Then
        hinh.OLEFormat.ConvertTo ("Equation.DSMT4")
    End If
Next
End Sub
Sub fixloilechdong_shape()
On Error Resume Next
Selection.HomeKey Unit:=wdStory
    Dim iShapeCount As Integer
    Dim iILShapeCount As Integer
    Dim docThis As Document
    Dim j As Integer
    Dim sTemp As String
    Set docThis = ActiveDocument
    iILShapeCount = docThis.InlineShapes.Count
    For j = 1 To iILShapeCount
        sTemp = docThis.InlineShapes(j).Height
        With Selection.Find
        .Text = "^g"
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = True
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute
         With Selection.Font
        .Name = "+Body"
        .Size = 11
        .Bold = False
        .Italic = False
        .Underline = wdUnderlineNone
        .UnderlineColor = wdColorAutomatic
        .StrikeThrough = False
        .DoubleStrikeThrough = False
        .Outline = False
        .Emboss = False
        .Shadow = False
        .Hidden = False
        .SmallCaps = False
        .AllCaps = False
        .Color = wdColorBlack
        .Engrave = False
        .Superscript = False
        .Subscript = False
        .Spacing = 0
        .Scaling = 100
        If sTemp >= 14.4 Then
        .Position = -sTemp / 2 + 3.5
        Else
        .Position = -sTemp / 2 + 3
        End If
        .Kerning = 0
        .Animation = wdAnimationNone
        .Ligatures = wdLigaturesNone
        .NumberSpacing = wdNumberSpacingDefault
        .NumberForm = wdNumberFormDefault
        .StylisticSet = wdStylisticSetDefault
        .ContextualAlternates = 0
    End With
    Next j
      Selection.HomeKey Unit:=wdStory
    '
End Sub
 
T

thanhphong

Guest
Để bài viết dễ hiểu hơn, em xin giải thích:
Chạy thử code đánh dấu công thức của #2.
Mã:
Sub danhdau()
Selection.WholeStory
Dim ObjMT As InlineShape
    For Each ObjMT In ActiveDocument.InlineShapes
        If ObjMT.Type = wdInlineShapeEmbeddedOLEObject Then
            ObjMT.Select
            Selection.Range.HighlightColorIndex = wdBrightGreen

        End If
    Next
End Sub
Trước khi chạy:
Bạn cần đăng nhập để thấy đính kèm

Sau khi chạy code:
Bạn cần đăng nhập để thấy đính kèm


Chú ý: Mỗi công thức toán gõ bằng Mathtype, khi hiển thị trên word, nó là một shape (tương tự một bức ảnh-có thể chỉnh sửa nội dung bên trong thông qua phần mềm MathType).
Bạn cần đăng nhập để thấy đính kèm
 
T

thanhphong

Guest
Khái niệm này bạn tự nghĩ ra à? Không nên sử dụng thuật ngữ chỉ mình bạn hiểu. Trong trường hợp này bạn nên cung cấp file demo, upload lên google drive (để public) hoặc mediafire kéo về diễn đàn.

Đối với công thức MathType bị hóa ảnh, tức là shape bị biến thành ảnh hoàn toàn, không thể sửa chữa nội dung công thức bên trong, thì code phát hiện mathtype hóa ảnh, bạn có thể tham khảo:
Mã:
Sub xacdinhsoluongcongthuchoaanh()
    On Error Resume Next
    Dim demLoi As Integer
    Selection.HomeKey unit:=wdStory 'Dua con tro ve dau van ban
    'SoCongThuc = ActiveDocument.InlineShapes.Count
    demLoi= 0
    Dim shp As InlineShape
            For Each shp In ActiveDocument.InlineShapes
                If shp.Type = wdInlineShapePicture And shp.Height < 80 Then
                        'Xac dinh cong thuc hoa anh
                        demLoi= demLoi+ 1
                        If (demLoi> 200) Then Exit For 'Neu phat hien co hon 200 cong thuc hoa anh thi khong kiem tra nua
                        shp.Select
                        Selection.Font.Underline = wdUnderlineThick
                        Selection.Font.UnderlineColor = wdColorRed 'To mau do cong thuc bi loi
                End If
    Next
        If (demLoi= 0) Then
                MsgBox "Khong tim thay cong thi bi hoa anh"
        ElseIf demLoi< 201 Then
                MsgBox "So anh tim thay: " & demLoi
        Else
                MsgBox "Co hon " & 200 & " cong thuc bi hoa anh"
        End If
End Sub
 
Con số 80 ở #6 theo mình nên nới rộng ra thành 90.
Cách kiểm thử kích thước chiều cao của một shape do mathtype tạo ra như sau:
Mã:
Sub kiemtrakichthuocshape()
    On Error Resume Next
    Dim shp As InlineShape
    For Each shp In ActiveDocument.InlineShapes
               MsgBox shp.Height
    Next
        
End Sub
Kết quả kiểm thử:
Bạn cần đăng nhập để thấy hình ảnh
 

ldhpm2

Yêu THVBA
thanhphong

Thuật ngữ "mathtype ma" này dân toán thường để nói 1 lỗi trong mahttype đó là code của nó (dạng tex) không đúng như dạng shape của nó.
 
Sửa lần cuối:

tuhocvba

Administrator
Thành viên BQT
@ldhpm2 : Bạn lưu ý tránh dùng thuật ngữ chuyên môn chỉ mình bạn hoặc nhóm người thiểu số trên diễn đàn hiểu.
Cụ thể hơn hãy đưa ra file demo nếu không thể định nghĩa được khái niệm của bạn bằng lời.
Bạn tham khảo thêm các chú ý khi tương tác trên diễn đàn:
 
Cảm ơn bạn.
Em xin đóng góp 1 số cách em đã và đang dùng để xử lí lệch dòng giống ý tưởng của tác giả ạ.
Cách 1: Toggle tex.
Cách 2: Sử dụng classType"Equation.DSMT4".
Cách 3: Canh chỉnh vị trí shape.
Cách 1 chắc là lâu nhất.
Cách 2 và 3 thì cách nào tốc độ nhanh hơn bạn? Tại sao lại có các con số như này, từ suy luận như nào vậy bạn?
Mã:
   If sTemp >= 14.4 Then

        .Position = -sTemp / 2 + 3.5

        Else

        .Position = -sTemp / 2 + 3
Mong được chỉ giáo.
 

tuhocvba

Administrator
Thành viên BQT
Cùng một mẫu dữ liệu thì MT4 mất 10s. Sửa hết lỗi lệch dòng .
Canh chỉnh shape mất 7s . Không sửa hết lỗi .
Có lẽ phương án 1 Toggle là triệt để hơn cả . Nhưng phương án này chắc sẽ mất nhiều thời gian nhất .
 
Top