Khi soạn giáo án, đề thi hay tài liệu kỹ thuật, việc sao chép công thức toán LaTeX (kẹp giữa $…$ hoặc $$…$$) từ ChatGPT, Claude, DeepSeek hay Overleaf sang Microsoft Word rất phổ biến.
Ở phiên bản v1 trước đây[cite: 1], chúng ta đã tận dụng bộ parser LaTeX nội sinh của Office 2019 / Microsoft 365 để chuyển đổi hàng loạt[cite: 1]. Tuy nhiên, trong thực tế tài liệu dài vài chục trang, chỉ cần 1-2 công thức sai cú pháp LaTeX (thiếu ngoặc \frac{}{, dùng lệnh Word không hỗ trợ) là macro v1 có thể bị gián đoạn hoặc lướt qua mà không biết lỗi ở đâu.
Bản v2 nâng cấp cơ chế:
-
Giữ nguyên ưu điểm không cần cắt chuỗi thủ công[cite: 1].
-
Bổ sung bộ bẫy lỗi
On Error Resume Next. -
Tự động đếm và bôi vàng (
HighlightColorIndex = wdYellow) chính xác các vị trí công thức bị lỗi để người dùng kiểm tra lại sau khi chạy xong.
1. Cơ chế hoạt động & So sánh giữa bản v1 và v2
| Tiêu chí | Bản v1 (Cơ bản)[cite: 1] | Bản v2 (Nâng cấp) |
| Xử lý cú pháp lỗi | Không bẫy lỗi; gặp mã LaTeX hỏng dễ crash hoặc biến dạng hiển thị[cite: 1]. | Bẫy lỗi cục bộ (Err.Number <> 0), không dừng chương trình. |
| Nhận diện lỗi trực quan | Người dùng phải tự dò mắt lại toàn bộ văn bản[cite: 1]. | Tự động bôi vàng (Highlight) ngay vị trí công thức sai. |
| Thống kê kết quả | Chỉ báo tổng số công thức đã quét qua[cite: 1]. | Tách biệt rõ ràng: Số thành công & Số lỗi cú pháp. |
| Hiệu năng & Trực quan | Render kèm cuộn màn hình realtime qua DoEvents[cite: 1]. |
Giữ nguyên realtime, thanh StatusBar hiển thị chi tiết tiến độ. |
Bản chất kỹ thuật cần nắm:
-
Tại sao không cần hàm
Mid()để cắt dấu$?[cite: 1] Từ Office 2019/365, lệnhOMaths.Addkết hợp.BuildUptự động hiểu cặp dấu$hoặc$$là ranh giới khối toán học (math delimiter)[cite: 1]. Việc cắt chuỗi thủ công bằng VBA vừa thừa, vừa dễ làm lệch con trỏRange.Start/Range.Endtrong tài liệu phức tạp[cite: 1]. -
Thứ tự quét: Luôn xử lý
$$...$$(Display Math) trước rồi mới đến$..$(Inline Math)[cite: 1]. Nếu quét dấu đơn trước, biểu thức$$...$$sẽ bị regex nhận nhầm thành 2 khối đô-la đơn kề nhau, làm vỡ khung hiển thị.
2. Mã nguồn VBA chuẩn hóa (Phiên bản v2)
Nhấn Alt + F11 trong Word > vào Insert > Module > Dán đoạn mã sau:
Sub ConvertAllInlineAndDisplayLatex_Realtime_v2()
Dim doc As Document
Dim R As Range
Dim R_Equation As Range
Dim Latex As String
Dim countSuccess As Long
Dim countFail As Long
Set doc = ActiveDocument
countSuccess = 0
countFail = 0
' Bat cap nhat man hinh de nguoi dung theo doi truc quan
Application.ScreenUpdating = True
' =======================================================
' GIAI DOAN 1: TIM VA CHUYEN DOI DANG DO LA DOI $$...$$
' =======================================================
Set R = doc.Content
With R.Find
.ClearFormatting
.Text = "\$$([!\$]@)\$$"
.MatchWildcards = True
.Forward = True
.Wrap = wdFindStop
End With
Do While R.Find.Execute
Set R_Equation = R.Duplicate
Latex = R_Equation.Text
If Len(Latex) > 0 Then
R_Equation.Text = Latex
doc.OMaths.Add R_Equation
' Bay loi neu cu phap LaTeX khong hop le
On Error Resume Next
R_Equation.OMaths(1).BuildUp
If Err.Number <> 0 Then
countFail = countFail + 1
R_Equation.HighlightColorIndex = wdYellow ' Boi vang de kiem tra lai
Err.Clear
Else
countSuccess = countSuccess + 1
End If
On Error GoTo 0
End If
' Cuon man hinh va cap nhat tien do xu ly
R_Equation.Select
DoEvents
Application.StatusBar = "Dang xu ly $$: Thanh cong " & countSuccess & " | Loi: " & countFail
' Dich con tro tim kiem tiep theo ra sau cong thuc vua xu ly
R.Start = R_Equation.End
Loop
' =======================================================
' GIAI DOAN 2: TIM VA CHUYEN DOI DANG DO LA DON $...$
' =======================================================
Set R = doc.Content
With R.Find
.ClearFormatting
.Text = "\$([!\$]@)\$"
.MatchWildcards = True
.Forward = True
.Wrap = wdFindStop
End With
Do While R.Find.Execute
Set R_Equation = R.Duplicate
Latex = R_Equation.Text
If Len(Latex) > 0 Then
R_Equation.Text = Latex
doc.OMaths.Add R_Equation
' Bay loi neu cu phap LaTeX khong hop le
On Error Resume Next
R_Equation.OMaths(1).BuildUp
If Err.Number <> 0 Then
countFail = countFail + 1
R_Equation.HighlightColorIndex = wdYellow ' Boi vang de kiem tra lai
Err.Clear
Else
countSuccess = countSuccess + 1
End If
On Error GoTo 0
End If
R_Equation.Select
DoEvents
Application.StatusBar = "Dang xu ly $: Thanh cong " & countSuccess & " | Loi: " & countFail
R.Start = R_Equation.End
Loop
' Tra ve trang thai mac dinh
Application.StatusBar = False
MsgBox "Hoan tat!" & vbCrLf & _
"- Chuyen doi thanh cong: " & countSuccess & " cong thuc" & vbCrLf & _
"- Loi cu phap: " & countFail & " (da duoc boi vang trong van ban)", _
vbInformation, "Thong Bao Ket Qua"
End Sub
3. Các bước thực hiện & Lưu ý thực tế
-
Thiết lập chế độ toán học mặc định trong Word:
-
Vào tab Insert > Equation hoặc nhấn
Alt + =. -
Trên thanh công cụ Equation, chọn nút LaTeX (thay vì Unicode). Word cần cấu hình này để hiểu cú pháp khi
.BuildUpđược gọi qua code.
-
-
Xử lý tài liệu dung lượng lớn (trên 50 trang):
-
Trong code có sử dụng
R_Equation.SelectvàDoEventsđể cuộn màn hình và tránh bị treo giao diện (Not Responding). -
Nếu tài liệu quá dài và cần tối ưu tốc độ tối đa, bạn có thể comment lại 2 dòng
R_Equation.SelectvàDoEvents, đồng thời đặtApplication.ScreenUpdating = Falseở đầu macro để code chạy ngầm tốc độ cao.
-
-
Cách rà soát lại công thức lỗi sau khi chạy:
-
Nhấn
Ctrl + F, chuyển sang tab Find > More > Format > Highlight để nhảy nhanh đến các vị trí bôi màu vàng sửa lại các cú pháp mà Word từ chối nhận diện.
-