Конвертировать MathML в MathType в MS Word - PullRequest
4 голосов
/ 09 июня 2009

Я пишу конвертер из 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 объектами OLE MathType. Но потом мне нужно как-то преобразовать MathML в TeX, что не так просто.

Я знаю, что объект MLEType 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 в OLE-объект MathType?

Спасибо заранее, Ник Стэнч

Ответы [ 3 ]

3 голосов
/ 10 июня 2009

Ник, тебе стоит попробовать наш MathType SDK. Он предлагается "как есть", но бесплатно: http://www.dessci.com/en/reference/sdk/

Рул, спасибо за добрые слова. Я передам это нашей службе поддержки.

Боб Мэтьюз Наука дизайна

Обновление: Вот некоторые пояснения и дополнительная информация о моей рекомендации попробовать MathType SDK. Начиная с MathType 6.5, можно использовать интерфейс IDataObject объекта MathType для передачи в MathML. Выражение, которое кодирует MathML, вставляется в текущую позицию курсора. Таким образом, в целом стратегия заключается в том, чтобы вставить пустое уравнение MathType, активировать его, получить интерфейс IDataObject, установить уравнение через MathML и затем снова закрыть уравнение.

MathType SDK включает в себя документацию с более подробной информацией и пример приложения "OLECont", демонстрирующего эту технику. Исходя из того, что вы разместили здесь, у вас не должно возникнуть проблем с тем, чтобы ваш код работал.

2 голосов
/ 12 июня 2009

взломали!

Можно использовать объект COleClientItem для получения экземпляра MathType OLE Control в своем коде. Это показано в образце MathType SDK MFC. Затем, манипулируя COleDataSource, передайте элемент управления данными MathML и вызовите COleClientItem::CopyToClipboard();. Теперь данные, представляющие сам элемент управления, как объект OLE, доступны при вызове Range::Paste(opt1, opt2); из классов автоматизации Word. Выглядит немного странно, но сработало для меня :) И все, что вам нужно сделать, это добавить еще одну строку в образец, а именно ту, которая вызывает метод CopyToClipboard.

0 голосов
/ 10 июня 2009

Единственный совет, который я могу предложить, это то, что я всегда находил поддержку Design Science довольно хорошей. Вы можете спросить их, поддерживает ли их интерфейс OLE поддержку MathML.

Я еще не исследовал редактор формул Word 2007. Возможно, он может легче импортировать другие форматы, если у него другой интерфейс автоматизации.

...