![]() |
[MathType API] Word-Formelfelder zu MathML konvertieren
hi ihr,
mithilfe von MathType kann man in Word-Dokumenten ja so ganz tolle Mathematische Formeln erstellen und anzeigen (besser, als die einfachen selbstgetippten Formelfelder àlà EQ \F(2;3) oder der integrierte Formeleditor). Ich möchte nun aus einem Worddokument sämtliche Formelfelder (nicht die OLE-Objekte des Formeleditors, sondern die einfachen WordEquations, die in Textform eingegeben werden) konvertieren, um sie in MathML auszeichnen zu können. Das ganze Funktioniert auch prächtig mit dem Programm MathType von DesignScience. MathType bietet auch eine API, mit der ich das ganze über mein Programm automatisieren kann etc. Nur leider funktionieren die API-Aufrufe nicht wirklich :( Es gibt die Datei "MathPage.wll", die praktisch eine normale DLL mit Word-spezifischen Dinge ist. Ich habe die Funktion MTXFormEqn() aus dieser DLL in meinem Programm aufgerufen. Jedoch bekomme ich, anstelle des MathML-Codes, immer einen leeren String als Ergebnis. Hier mal ein wenig Code:
Delphi-Quellcode:
Die Deklaration und den Aufruf habe ich nach bestem Wissen und Gewissen dem SDK nachempfunden (welches leider nur VBA behandelt).
//Deklaration der externen Funktion
function MTXFormEqn(src: Integer; srcFmt: Integer; srcData: PChar; srcDataLen: Cardinal; dst: Integer; dstFmt: Integer; out dstData: PChar; dstDataLen: Cardinal; dstPath: PChar; out dims: MTAPI_DIMS): Cardinal; external 'MathPage.wll'; //Aufruf in meinem Programm var AWordEQ: string; pEqnOut: PChar; rDims: MTAPI_DIMS; begin pEqnOut := ''; AWordEQ := ' EQ \F(2;3) '; //entspricht dem Bruch 2/3 MTXFormEqn(mtxfmLOCAL, mtxfmTEXT, PChar(AWordEQ), Length(AWordEQ), mtxfmLOCAL, mtxfmTEXT, pEqnOut, 1, nil, rDims); //in pEqnOut sollte jetzt der MathML-Code stehen..... end; Hier mal ein Auszug: Zitat:
danke, wie immer, im voraus, aeno |
Re: [MathType API] Word-Formelfelder zu MathML konvertieren
Code:
Ein paar Anmerkungen:
Public Function MTXFormEqn (
src As Integer, srcFmt As Integer, srcData As String, srcDataLen As Long, dst As Integer, dstFmt As Integer, dstData As String, dstDataLen As Long, dstPath As String, dims As MTAPI_DIMS ) As Long 1. Die Funktion ist bestimmt stdcall. 2. VB Parameter ohne ByVal sind normalerweise var oder out. 3. Ein Integer in VB hat nur 16 Bit und ist ein damit SmallInt in Delphi. Es wäre einfacher wenn's für das SDK auch eine C-Header-Datei gäbe. |
Re: [MathType API] Word-Formelfelder zu MathML konvertieren
Zitat:
Zitat:
Edit: es hat leider nichts geholfen. Der zurückgegebene String ist noch immer leer :( aeno |
Re: [MathType API] Word-Formelfelder zu MathML konvertieren
hi nochmal,
es will einfach nicht klappen :( ich habe schon etliche dinge versucht, doch mein resultierender string bleibt immer leer. sogar den weg, die ausgangsformel in die zwischenablage zu kopieren, der DLL dies per parameter mitzuteilen und das konvertierte ergebnis wieder aus der zwischenablage zu holen, bin ich gegangen. doch der string in der zwischenablage bleibt im ausgangszustand... :( so sieht das ganze im VBA-original-source aus:
Code:
und so sieht mein delphi-code jetzt aus:
//deklaration
Public Declare Function MTXFormEqn Lib "MathPage.WLL" ( _ ByVal src As Integer, ByVal srcFmt As Integer, ByVal srcData As String, ByVal srcDataLen As Long, _ ByVal dst As Integer, ByVal dstFmt As Integer, ByVal dstData As String, ByVal dstDataLen As Long, _ ByVal dstPath As String, ByRef dims As MTAPI_DIMS) As Long //aufruf stat = MTXFormEqn(mtxfmCLIPBOARD, mtxfmTEXT, dummyStr1, 1, _ dest, destFormat, dummyStr2, 1, path, dummyDims)
Delphi-Quellcode:
ist das so wenigstens richtig übersetzt?
//deklaration
function MTXFormEqn(src: SmallInt; srcFmt: SmallInt; srcData: PChar; srcDataLen: Cardinal; dst: SmallInt; dstFmt: SmallInt; var dstData: PChar; dstDataLen: Cardinal; dstPath: PChar; var dims: MTAPI_DIMS): Cardinal; stdcall; external 'MathPage.wll'; //aufruf iFormResult := MTXFormEqn(mtxfmCLIPBOARD, mtxfmTEXT, ' ', 1, mtxfmCLIPBOARD, mtxfmTEXT, ' ', 1, ' ', rDims); aeno |
Re: [MathType API] Word-Formelfelder zu MathML konvertieren
Wieso sieht die Deklaration in VB denn auf einmal so anders aus als vorher (ByVal), hast du sie einfach umgestellt (das geht nicht) oder hast du sie vorher nicht richtig abgeschrieben? Funktioniert das Ganze denn in VBA, also z.B. in Word?
Mein Prototyp für deine ursprüngliche Funktion wäre:
Delphi-Quellcode:
Wenn jedoch deine zweite Variante richtig ist, dann musst du das "var" vor "dstData" wegmachen.
function MTXFormEqn(var src, srcFmt: SmallInt; var srcData: PChar; var srcDataLen: LongInt;
var dst, dstFmt: SmallInt; var dstData: PChar; var dstDataLen: LongInt; var dstPath: PChar; var dims: MTAPI_DIMS):LongInt; stdcall; external 'MathPage.wll'; Sofern du nicht über das Clipboard gehst, muss du den Inhalt von "dstData" natürlich vorher z.B. mit AllocMem holen und nachher mit FreeMem wieder freigeben. Wieviele Bytes du alloziiert hast, musst du in dstDataLen angeben. |
Re: [MathType API] Word-Formelfelder zu MathML konvertieren
Danke für deine Antwort!
Zitat:
Zitat:
Edit: Hm, aufgrund des ByVal wäre es doch richtiger, die ganzen var wegzulassen, oder nicht? aeno |
Re: [MathType API] Word-Formelfelder zu MathML konvertieren
Zitat:
Zitat:
|
Re: [MathType API] Word-Formelfelder zu MathML konvertieren
Leider noch keine Verbesserung :(
Die Formel bleibt unangerührt.... Ich glaube, ich schreibe ein abgewandeltes Makro dafür, dass ich dann benutzte... (Mpf, das heißt dann VBA aneignen :shock:) Aber danke für deine Hilfe! :) aeno |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz