2009-06-09 3 views
4

Я пишу конвертер из XML & MathML в документ MS Word.
Я использую MFC и Word, автоматизацию, так что нет никаких проблем в написании текста, как это:Преобразование MathML в MathType в 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!")); 

Теперь проблема заключается в преобразовании уравнений MathML в внедренные объекты MathType. Один из возможных способов, который я нашел, - написать уравнения в TeX, а затем программно вызвать макрос MTCommand_TeXToggle (найденный в MathType 6.5 library for Word), который заменяет TeX объектами OLE MathType. Но потом мне нужно каким-то образом преобразовать 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 в OLE-объект MathType?

Спасибо заранее, Ник основательный

ответ

2

Трещины!

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

+0

Не могли бы вы отправить полные макросы 'vba'. Я новичок в VBA, и мне бы хотелось преобразовать формат MATML2MathType' OLE. – Balaji

0

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

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

3

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

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

Боб Мэтьюз Design Science

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

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

+0

Спасибо за ваш ответ. На самом деле, у меня был SDK в тот момент, но я писал на C++, а не C#, поэтому мне не удалось выяснить, как реализовать объект IDataObject. Поэтому вместо этого я использовал ваш образец MFC. Это происходит следующим образом: я получаю COleClientItem из clsid, передаю его с помощью mathml и затем вызываю CopyToClipboard, просто вставляя его где-нибудь в документе. Похоже, немного странно, я знаю. Тем не менее, он работал идеально для меня. И я получаю бесплатный конвертер mathml-> TeX! Спасибо за отличные продукты! – stanch

+0

Ну, теперь я помню, что OLECont - это именно то, о чем я вам говорил. Кажется, я ожидал вашего совета два дня позавчера :) – stanch

+0

Рад, что он работает на вас. Спасибо за обновление. - Bob – 2009-06-13 02:07:07

 Смежные вопросы

  • Нет связанных вопросов^_^