在MS Word中将MathML转换为MathType

时间:2009-06-09 11:08:04

标签: mfc automation ole mathml

我正在编写一个从XML& MathML到MS Word文档的转换器 我正在使用MFC和Word自动化,因此编写这样的文本没有问题:

_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(在MathType 6.5库中找到Word)宏,用Tex替换MathType OLE对象。但是我必须以某种方式将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对象?

提前致谢, Nick Stanch

3 个答案:

答案 0 :(得分:3)

尼克,你应该试试我们的MathType SDK。它按“原样”提供,但它是免费的:http://www.dessci.com/en/reference/sdk/

罗尔,谢谢你的客气话。我将把它传递给我们的支持团队。

鲍勃马修斯 设计科学

更新: 以下是有关我尝试使用MathType SDK的建议的一些说明和其他信息。从MathType 6.5开始,可以使用MathType对象上的IDataObject接口传入MathML。 MathML编码的表达式插入当前光标位置。因此,一般来说,策略是插入一个空白的MathType方程,激活它,获取IDataObject接口,通过MathML设置方程,然后再次关闭方程。

MathType SDK包含更详细的文档,以及演示该技术的示例“OLECont”应用程序。根据您在此处发布的内容,您可以毫无困难地使代码正常工作。

答案 1 :(得分:2)

破解了!

可以使用COleClientItem对象在其代码中获取MathType OLE Con​​trol的实例。这在MathType SDK MFC示例中显示。然后,操纵COleDataSource,使用MathML数据提供控件并调用COleClientItem::CopyToClipboard();现在,表示控件本身的数据作为OLE对象,可以在Word自动化类Range::Paste(opt1, opt2);调用时使用。看起来有点奇怪,但为我工作:)所有你要做的就是在样本中添加一行,即调用CopyToClipboard方法的行。

答案 2 :(得分:0)

我能提供的唯一建议是,我总是发现设计科学的支持非常好。您可能想询问他们的OLE接口是否提供MathML支持。

我还没有调查过Word 2007方程式编辑器。如果它有不同的自动化界面,也许它可以更容易地导入其他格式。