2009-06-09 126 views
4

我正在從XML & MathML轉換爲MS Word文檔。
我使用MFC和Word自動化,所以不應該這樣寫的文字沒有問題:在MS Word中將MathML轉換爲MathType

_Application app; 
COleVariant vtOpt(DISP_E_PARAMNOTFOUND, VT_ERROR), 
      vtTrue((short)TRUE), 
      vtFalse((short)FALSE); 
app.CreateDispatch("Word.Application",NULL); 
Documents docs = app.GetDocuments(); 
_Document doc = docs.Add (vtOpt, vtOpt, vtOpt, vtOpt); 
Range range = doc.Range (vtOpt, vtOpt); 
range.InsertAfter (_T("Hello Word!")); 

現在的問題是轉換MATHML式到嵌入式MathType的對象。我發現的一種可能的方法是在TeX中編寫方程,然後以編程方式調用MTCommand_TeXToggle(在Word的MathType 6.5庫中找到)宏,用MathType OLE對象替換TeX。但是,我必須以某種方式將MathML轉換爲TeX,但這並不容易。

我知道,MathType的OLE對象應接受原始數據MATHML,但是當我試圖創建和訪問OLE對象編程:

InlineShapes shapes = doc.GetInlineShapes(); 
InlineShape control = shapes.AddOLEObject (COleVariant("Equation.DSMT4"), vtOpt, vtFalse, vtFalse, vtOpt, vtOpt, vtOpt, vtOpt); 
OLEFormat fm = control.GetOLEFormat(); 
COleDispatchDriver drv = fm.GetObject(); 

我最終沒有合理的接口與餵它MathML數據。 所以,問題是: 1)有沒有辦法控制OLE對象併發送一些MathML數據? 或 2)有沒有辦法獲得一個MS Word VB宏,將選擇從MathML轉換爲MathType OLE對象?

由於提前, 尼克止住

回答

2

破解它!

可以使用COleClientItem對象在其代碼中獲取MathType OLE控件的實例。這顯示在MathType SDK MFC示例中。然後,操作COleDataSource,使用MathML數據提供控件並調用COleClientItem::CopyToClipboard();現在,可以在Word自動化類的調用Range::Paste(opt1, opt2);上提供表示控件本身的數據作爲OLE對象。看起來有點奇怪,但爲我工作:)所有你需要做的是再增加一行到示例,即調用CopyToClipboard方法。

0

我能提供的唯一建議是,我一直認爲設計科學的支持是相當不錯的。你可能想問他們他們的OLE接口是否提供MathML支持。

我還沒有調查Word 2007公式編輯器。如果它具有不同的自動化界面,也許它可以更容易地導入其他格式。

3

尼克,你應該試試我們的MathType SDK。它提供「原樣」,但它是免費的:http://www.dessci.com/en/reference/sdk/

Roel,感謝您的客氣話。我將把它傳遞給我們的支持團隊。

鮑勃·馬修斯 設計科學

更新:下面是一些澄清,關於我的建議嘗試MathType的SDK的附加信息。從MathType 6.5開始,可以使用MathType對象上的IDataObject接口來傳入MathML。 MathML編碼的表達式插入當前光標位置。因此,一般來說,策略是插入一個空白的MathType公式,激活它,獲取IDataObject接口,通過MathML設置公式,然後再次關閉公式。

MathType SDK包含更多詳細信息的文檔以及展示該技術的示例「OLECont」應用程序。根據你在這裏發佈的內容,你應該沒有問題讓你的代碼工作。

+0

感謝您的回答。實際上,那時我有SDK,但我用C++編寫,而不是C#,所以我沒有弄清楚如何實現IDataObject。所以,而不是那個,我已經使用你的MFC示例。它是這樣的:我從clsid獲取COleClientItem,用mathml提供它,然後調用CopyToClipboard,只需將它粘貼到文檔中的某處即可。我知道,看起來有點奇怪。儘管如此,它對我來說非常合適。我得到一個免費的mathml-> TeX轉換器!感謝你的偉大產品! – stanch 2009-06-12 19:15:56

+0

好吧,現在我記得OLECont正是我​​告訴過你的事情。所以好像我在前天的兩天預計了你的建議:) – stanch 2009-06-12 19:21:06