2009-06-09 10 views
4

Ich schreibe einen Konverter von XML & MathML zu MS Word Dokument.
Ich bin mit MFC und Word-Automatisierung, so dass es kein Problem schriftlich Text wie folgt aus:Konvertieren von MathML zu MathType in MS 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!")); 

Das Problem ist jetzt MathML-Gleichungen in eingebettete MathType Objekte umzuwandeln. Eine der Möglichkeiten, die ich gefunden habe, besteht darin, Gleichungen in TeX zu schreiben und dann programmgesteuert das Makro MTCommand_TeXToggle (gefunden in MathType 6.5 für Word) aufzurufen, das TeX durch MathType OLE-Objekte ersetzt. Aber dann muss ich MathML irgendwie in TeX umwandeln, was nicht so einfach ist.

Ich weiß, dass MathType OLE-Objekt Roh MathML Daten akzeptieren soll, aber wenn ich versuche, Objekt zu erstellen und den Zugriff OLE programmatisch:

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(); 

ich ohne vernünftige Schnittstelle am Ende mit dem einzuspeisen MathML-Daten. So ist die Frage: 1) Gibt es eine Möglichkeit, die Kontrolle über das OLE-Objekt zu bekommen und es einige MathML-Daten zu senden? Oder 2) Gibt es eine Möglichkeit, ein MS Word VB-Makro zu erhalten, das die Auswahl von MathML in MathType OLE-Objekt konvertiert?

Vielen Dank im Voraus, Nick Stanch

Antwort

2

Gebrochen es!

Man kann COleClientItem Objekt verwenden, um eine Instanz von MathType OLE Control in seinem Code zu erhalten. Dies wird im MathType SDK MFC-Beispiel gezeigt. Manipulieren Sie dann das , geben Sie das Steuerelement mit MathML-Daten ein, und rufen Sie COleClientItem::CopyToClipboard(); Jetzt sind die Daten, die das Steuerelement als ein Ole-Objekt darstellen, auf Range::Paste(opt1, opt2); Aufruf von Word-Automatisierungsklassen verfügbar.Sieht ein bisschen komisch aus, aber funktioniert für mich :) Und alles, was Sie tun müssen, ist eine weitere Zeile zum Beispiel hinzufügen, nämlich die, die CopyToClipboard Methode ruft.

+0

Könnten Sie bitte komplette 'vba' Makros posten? Ich bin neu in VBA und ich möchte 'MathML2MathType' OLE Format konvertieren. – Balaji

0

Der einzige Rat, den ich anbieten kann, ist, dass ich immer das Design Science gefunden habe unterstützen recht gut zu sein. Vielleicht möchten Sie sie fragen, ob ihre OLE-Schnittstelle MathML-Unterstützung bietet.

Ich habe den Gleichungseditor von Word 2007 noch nicht untersucht. Vielleicht kann es andere Formate leichter importieren, wenn es eine andere Automatisierungsschnittstelle hat.

3

Nick, sollten Sie unser MathType SDK ausprobieren. Es ist "wie es ist" angeboten, aber es ist kostenlos: http://www.dessci.com/en/reference/sdk/

Roel, danke für die freundlichen Worte. Ich werde dies an unser Support-Team weiterleiten.

Bob Mathews Design Science

Update: Hier ist eine Klarstellung und weitere Informationen über meine Empfehlung, die MathType SDK zu versuchen. Beginnend mit MathType 6.5 kann die IDataObject-Schnittstelle für ein MathType-Objekt verwendet werden, um MathML zu übergeben. Der Ausdruck, den die MathML-Codierung enthält, wird an der aktuellen Cursorposition eingefügt. Im Allgemeinen besteht die Strategie darin, eine leere MathType-Gleichung einzufügen, sie zu aktivieren, die IDataObject-Schnittstelle abzurufen, die Gleichung über MathML festzulegen und dann die Gleichung erneut zu schließen.

Das MathType SDK enthält Dokumentation mit weiteren Details und eine Beispielanwendung "OLEcont", die die Technik demonstriert. Basierend auf dem, was Sie hier gepostet haben, sollten Sie kein Problem haben, Ihren Code zum Laufen zu bringen.

+0

Danke für Ihre Antwort. Eigentlich hatte ich das SDK in diesem Moment, aber ich schrieb in C++, nicht C#, so dass ich nicht herausfinden konnte, wie man das IDataObject-Ding implementiert. Stattdessen habe ich Ihr MFC-Beispiel verwendet. Es geht so: Ich bekomme COleClientItem von clsid, füttere es mit mathml und dann CopyToClipboard, einfach einfügen Sie es irgendwo im Dokument. Sieht aus wie ein bisschen komisch, ich weiß. Trotzdem hat es perfekt für mich funktioniert. Und ich bekomme einen kostenlosen mathml-> TeX-Konverter! Danke für deine tollen Produkte! – stanch

+0

Nun, ich erinnere mich, dass OLECont genau das ist, wovon ich dir erzählt habe. So scheint es, als hätte ich deinen Rat zwei Tage vorgestern vorweggenommen :) – stanch

+0

Froh, dass es für dich funktioniert. Danke für das Update. - Bob –