Word VBA:Mathtype公式與Latex公式切換
一、準備
1.調(diào)用MathType庫
(1)點開發(fā)工具-工具-引用

(2)勾選【MathTypeCommands】類

2.內(nèi)部方法/命令
MathTypeCommands.MTCommand_TeXToggle
意思是在MathType格式和Latex格式之間,切換所選區(qū)域公式的格式
二、操作方法
因為是通過VBA代碼編寫我們既可以寫循環(huán)(對選區(qū)的每個公式單獨選中,切換),又可以一步完成(全選需要處理的所有公式,直接寫一條語句即可完成)。簡單對比一下:
1.假設(shè)需求
這里準備了兩內(nèi)容相同的文檔,都是34頁公式,我們對全文公式操作。

2.處理速度對比
(1)循環(huán)方法
A.示例代碼
Rem 運行此代碼請先勾選上MathType庫
Sub mtEqToLatex()
? ?Dim fd As Field
? ?Dim fw As Range
? ?Dim i As Long
? ?
? ?t0 = Now
? ?Set fw = Selection.Range
? ?If fw.Start = fw.End Then Exit Sub
? ?Application.ScreenUpdating = False
? ?
? ?For Each fd In fw.Fields
? ? ? ?If fd.Code Like "*EMBED Equation.*" Then
? ? ? ? ? ?fd.Select
? ? ? ? ? ?MathTypeCommands.MTCommand_TeXToggle
? ? ? ? ? ?i = i + 1
? ? ? ?End If
? ?Next
? ?
? ?fw.Select
? ?Application.ScreenUpdating = True
? ?Set fw = Nothing
? ?Set fd = Nothing
? ?Debug.Print DateDiff("s", t0, Now)
? ?MsgBox Format(i, "完成 共處理了0個公式")
End Sub
B.測試結(jié)果
全選【文檔1】,運行上面的代碼

在立即窗口看到,運行完成用了149秒,速度挺慢。
(2)直接運行
A.示例代碼
Rem 運行此代碼請先勾選上MathType庫
Sub mtEqToLatex_All()
? ?Dim fd As Field
? ?Dim fw As Range
? ?Dim i As Long
? ?
? ?t0 = Now
? ?Set fw = Selection.Range
? ?If fw.Start = fw.End Then Exit Sub
? ?Application.ScreenUpdating = False
? ?
? ?For Each fd In fw.Fields
? ? ? ?If fd.Code Like "*EMBED Equation.*" Then
? ? ? ? ? ?i = i + 1
? ? ? ?End If
? ?Next
? ?
? ?MathTypeCommands.MTCommand_TeXToggle
? ?fw.Select
? ?Application.ScreenUpdating = True
? ?Set fw = Nothing
? ?Set fd = Nothing
? ?Debug.Print DateDiff("s", t0, Now)
? ?MsgBox Format(i, "完成 共處理了0個公式")
End Sub
B.測試結(jié)果
全選【文檔2】,運行上面的代碼

在立即窗口看到,運行完成用了???秒。
大概運行了4-5分鐘,屏幕還在一直抖動,因為運行太慢,就手動停止了。(此時還只運行到第5頁)
這種方法運行更慢,不可取。
3.分析
最初還以為全選一次運行可以更快,因為我認為MathType插件里面應(yīng)該優(yōu)化了方法,本來就是循環(huán)。但是最終的結(jié)果并不是。
所以說有時候代碼操作和手動操作的區(qū)域還是很大的。
三、完整思路與代碼
1.思路
(1)選擇區(qū)域,防止誤操作
(2)遍歷區(qū)域內(nèi)的域,因為MathType公式的域代碼必定包含【EMBED Equation.】,用like方法比較判斷是否為MathType公式
注:此處可以用MathType內(nèi)部方法逐個選中公式,有興趣可先自行研究,后面可能會專門講
(3)如果是MathType公式,則選中這個域(公式)所在區(qū)域,執(zhí)切換命令,然后計數(shù)
(4)循環(huán)完成,操作結(jié)束
2.最終推薦代碼
Rem 運行此代碼請先勾選上MathType庫
Sub mtEqToLatex()
? ?Dim fd As Field
? ?Dim fw As Range
? ?Dim i As Long
? ?
? ?t0 = Now
? ?Set fw = Selection.Range
? ?If fw.Start = fw.End Then Exit Sub
? ?Application.ScreenUpdating = False
? ?
? ?For Each fd In fw.Fields
? ? ? ?If fd.Code Like "*EMBED Equation.*" Then
? ? ? ? ? ?fd.Select
? ? ? ? ? ?MathTypeCommands.MTCommand_TeXToggle
? ? ? ? ? ?i = i + 1
? ? ? ?End If
? ?Next
? ?
? ?fw.Select
? ?Application.ScreenUpdating = True
? ?Set fw = Nothing
? ?Set fd = Nothing
? ?Debug.Print DateDiff("s", t0, Now)
? ?MsgBox Format(i, "完成 共處理了0個公式")
End Sub