2009-06-09 379 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