AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi [MathType API] Word-Formelfelder zu MathML konvertieren
Thema durchsuchen
Ansicht
Themen-Optionen

[MathType API] Word-Formelfelder zu MathML konvertieren

Ein Thema von Aenogym · begonnen am 25. Jul 2006 · letzter Beitrag vom 26. Jul 2006
Antwort Antwort
Benutzerbild von Aenogym
Aenogym

Registriert seit: 7. Mär 2004
Ort: Schwerin
1.089 Beiträge
 
Delphi 7 Enterprise
 
#1

[MathType API] Word-Formelfelder zu MathML konvertieren

  Alt 25. Jul 2006, 09:17
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:
//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;
Die Deklaration und den Aufruf habe ich nach bestem Wissen und Gewissen dem SDK nachempfunden (welches leider nur VBA behandelt).
Hier mal ein Auszug:

Zitat:
MTXFormEqn

Code:
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
Transforms an equation (uses options specified via MTXFormAddVarSub, MTXFormSetTranslator, and MTXFormSetPrefs)

Note: Variations involving mtxfm_PICT or dstFmt=mtxfm_HMTEF are not callable from VBA.
Parameterssrc [in] Equation data source, either:
mtxfmPREVIOUS => data from previous result
mtxfmCLIPBOARD => data on clipboard
mtxfmLOCAL => data passed (i.e. in srcData)

Note: srcFmt, srcData, and srcDataLen are used only if src is mtfxmLOCAL
srcFmt [in] Equation source data format (mtxfmXXX, see next)
srcData [in] Depends on data source (src)
mtxfmMTEF => MTEF-binary
mtxfmPICT => PICT
mtxfmTEXT => either MTEF-text or plain text
srcDataLen [in] # of bytes in srcData
dst [in] Equation data destination, either
mtxfmCLIPBOARD => transformed data placed on clipboard
mtxfmFILE => transformed data in the file specified by dstPath
mtxfmLOCAL => transformed data in dstData

Note: dstFmt, dstData, and dstDataLen are used only if dst is mtfxmLOCAL (data placed on the clipboard is either an OLE object or translator text)
dstFmt [in] Equation data format (mtxfmXXX, see next)
dstData

[out] Depends on data destination (dstFmt)
mtxfmMTEF => MTEF-binary
mtxfmHMTEF => handle to MTEF-binary
mtxfmPICT => PICT data
mtxfmTEXT => translated text or, if no translator, MTEF-text
mtxfmHTEXT => handle to translated text or, if no translator, MTEF-text

Note: If translator specified dstFmt must be either mtxfmTEXT or mtxfmHTEXT for the translation to be performed
dstDataLen [in] # of bytes in dstData (used for mtxfmLOCAL only)
dstPath [in] destination pathname (used if dst == mtxfmFILE only, may be NULL if not used)
dims [out] pict dimensions, may be NULL (valid only for dst = mtxfmPICT). See MTAPI_DIMS definition above in Types section.
Habt ihr vielleicht schon einmal mit der MathType-API gearbeitet und könnt mir weiterhelfen? Oder habt ihr vielleicht nützliche Links, die einem da helfen können (ich hab mich schon dämlich gesucht )

danke, wie immer, im voraus,
aeno
Steffen Rieke
Was nicht buzzt, wird buzzend gemacht!
http://blog.base-records.de
http://www.base-records.de
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

Re: [MathType API] Word-Formelfelder zu MathML konvertieren

  Alt 25. Jul 2006, 09:42
Code:
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
Ein paar Anmerkungen:
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.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Benutzerbild von Aenogym
Aenogym

Registriert seit: 7. Mär 2004
Ort: Schwerin
1.089 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: [MathType API] Word-Formelfelder zu MathML konvertieren

  Alt 25. Jul 2006, 10:36
Zitat von Flocke:
Ein paar Anmerkungen:
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.
Danke für die Tipps! Ich probier's gleich mal aus.

Zitat von Flocke:
Es wäre einfacher wenn's für das SDK auch eine C-Header-Datei gäbe.
Richtig. Es gibt aber nur *.dot-Dateien (MS Word-Vorlage), in denen VBA-Code ist

Edit: es hat leider nichts geholfen. Der zurückgegebene String ist noch immer leer

aeno
Steffen Rieke
Was nicht buzzt, wird buzzend gemacht!
http://blog.base-records.de
http://www.base-records.de
  Mit Zitat antworten Zitat
Benutzerbild von Aenogym
Aenogym

Registriert seit: 7. Mär 2004
Ort: Schwerin
1.089 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: [MathType API] Word-Formelfelder zu MathML konvertieren

  Alt 26. Jul 2006, 08:54
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:
//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)
und so sieht mein delphi-code jetzt aus:
Delphi-Quellcode:
//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);
ist das so wenigstens richtig übersetzt?

aeno
Steffen Rieke
Was nicht buzzt, wird buzzend gemacht!
http://blog.base-records.de
http://www.base-records.de
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

Re: [MathType API] Word-Formelfelder zu MathML konvertieren

  Alt 26. Jul 2006, 09:09
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:
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';
Wenn jedoch deine zweite Variante richtig ist, dann musst du das "var" vor "dstData" wegmachen.

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.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Benutzerbild von Aenogym
Aenogym

Registriert seit: 7. Mär 2004
Ort: Schwerin
1.089 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: [MathType API] Word-Formelfelder zu MathML konvertieren

  Alt 26. Jul 2006, 09:14
Danke für deine Antwort!

Zitat von Flocke:
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?
Die erste Variante habe ich aus der Dokumentation des SDK. Und die zweite Variante ist direkt aus dem VBA-Code kopiert. Und diese zweite Variante funktioniert ja auch so in Word.

Zitat von Flocke:
Mein Prototyp für deine ursprüngliche Funktion wäre:
Delphi-Quellcode:
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';
Wenn jedoch deine zweite Variante richtig ist, dann musst du das "var" vor "dstData" wegmachen.

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.
Ich probiere mal deinen Prototyp (minus var vor dstData - ich nehme den Weg übers Clipboard).

Edit: Hm, aufgrund des ByVal wäre es doch richtiger, die ganzen var wegzulassen, oder nicht?

aeno
Steffen Rieke
Was nicht buzzt, wird buzzend gemacht!
http://blog.base-records.de
http://www.base-records.de
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

Re: [MathType API] Word-Formelfelder zu MathML konvertieren

  Alt 26. Jul 2006, 09:25
Zitat von Aenogym:
Hm, aufgrund des ByVal wäre es doch richtiger, die ganzen var wegzulassen, oder nicht?
Genau das habe ich ja auch geschrieben:
Zitat von Flocke:
Wenn jedoch deine zweite Variante richtig ist, dann musst du das "var" vor "dstData" wegmachen.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Benutzerbild von Aenogym
Aenogym

Registriert seit: 7. Mär 2004
Ort: Schwerin
1.089 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: [MathType API] Word-Formelfelder zu MathML konvertieren

  Alt 26. Jul 2006, 10:25
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 )

Aber danke für deine Hilfe!
aeno
Steffen Rieke
Was nicht buzzt, wird buzzend gemacht!
http://blog.base-records.de
http://www.base-records.de
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz