我手邊只有買斷的 MathType 6 終身授權, MathType 7 之後就沒有終身授權,只剩下訂閱制了。所以我想把 Office 裡免面的所有 MathType OLE 物件都轉換成 Office 內建的方程式(OOXML),我轉換的方式如下。
- 先用 MathType 的內建功能 (Toggle TeX) 把方程式轉換為 LaTeX,也就是把要轉換的以滑鼠選取後,再按 Alt + \ (或是 Office 裡面的 MathType 表單中的 Toggle TeX )。
- 搜尋 \[ 與 \] 都替換成 $ 符號。\open \begin \end \close \frac 的部分可能會遇到換行符號,刪除換行符號。
- 向量符號先特別處理:搜尋 \overset{}{\mathop{AB}} 都改成 \hvec{AB} ,當中的 AB 可能是其他符號,也要記得代換調。
- 以下是 Gemini Pro 寫的一個 VBA 巨集(Macro),它會搜尋整份文件中被兩個 $ 符號包圍的文字(例如 $x^2+2x+1$),並將其轉換為 Word 的內建方程式物件。
Sub ConvertLaTeXToEquation()
Dim doc As Document
Dim rng As Range
Dim mathRng As Range
Set doc = ActiveDocument
Set rng = doc.Content
' 設定搜尋選項:使用萬用字元 (Wildcards)
' 搜尋模式:\$([!$]@)\$
' 解釋:找尋被 $ 包圍,且中間不包含 $ 的任意字串
With rng.Find
.ClearFormatting
.MatchWildcards = True
.Text = "\$([!$]@)\$"
.Forward = True
.Wrap = wdFindStop
Do While .Execute
' 當找到 $...$ 時
' 1. 去除前後的 $ 符號
' rng.Text 目前包含前後的 $,我們把它設為中間的內容
rng.Text = Mid(rng.Text, 2, Len(rng.Text) - 2)
' 2. 將該範圍轉換為方程式物件 (OMath)
Set mathRng = rng.OMaths.Add(rng)
' 3. 將方程式轉換為專業格式 (Professional Format)
' 注意:Word 2019/365 支援直接轉換 LaTeX 語法
' 選取該方程式(某些 WordBasic 指令需要選取狀態)
mathRng.Select
' 嘗試使用 LaTeX 轉換指令 (適用於支援 LaTeX 的新版 Word)
On Error Resume Next
WordBasic.EquationTransLatex
' 如果上面的指令失敗 (舊版 Word),則嘗試標準的 BuildUp (適用於簡單數學式)
If Err.Number <> 0 Then
mathRng.OMaths(1).BuildUp
Err.Clear
End If
On Error GoTo 0
' 4. 將搜尋範圍縮小至當前位置之後,繼續往下找
rng.Collapse Direction:=wdCollapseEnd
Loop
End With
MsgBox "轉換完成!", vbInformation, "LaTeX 轉換器"
End Sub
以下是 Gemini Pro 給的使用方式與注意事項:
1. 如何使用此巨集
開啟 VBA 編輯器:
在 Word 中按下 Alt + F11。
插入模組:
在左側的專案視窗中,對著 Normal 或你目前的文件按右鍵。
選擇 Insert (插入) > Module (模組)。
貼上程式碼:
將上面的程式碼完整複製並貼入右側的空白視窗中。
執行巨集:
回到 Word 文件。
按下 Alt + F8 開啟巨集清單。
選擇 ConvertLaTeXToEquation,然後點擊 執行 (Run)。
2. 重要注意事項
(1) Word 版本差異:
Word 2019 或 Office 365:支援度最好。這些版本內建了 LaTeX 轉譯器,上面的程式碼會呼叫 WordBasic.EquationTransLatex,這能處理像 \frac{a}{b} 或 \sum 這種標準 LaTeX 語法。
Word 2016 或更舊版本:這些版本不支援原生 LaTeX 模式,程式碼會退回使用 BuildUp 方法。這對於簡單的表示式(如 x^2+y^2)有效,但對於複雜的 LaTeX 語法(如 \frac)可能會失敗或顯示亂碼(舊版 Word 使用的是 UnicodeMath 語法,例如分數要寫成 a/b 而不是 \frac{a}{b})。
(2) 定界符:
此程式碼預設搜尋 $ ... $(行內公式)。如果你使用的是 $$...$$ 或其他符號(如 \( ... \)),需要自行修改程式碼中的 .Text = "\$([!$]@)\$" 這一行,才能達成你要的效果。
(3) 備份文件:
在大規模執行巨集前,建議先備份你的文件,以免轉換結果不符合預期。
--------------------------------------------------------------
轉換完成後,以後就算用 OnlyOffice 或是 LibreOffice 開啟文件,也能正常編輯數學方程式了,歐耶!!


