В этой статье описаны несколько способов отображения LaTeX документов в программах на .NET. Информация пригодится в первую очередь программистам, работающим в сфере образования. Все, о чем идет речь, проверено на собственном опыте разработки на кафедре высшей математики одного из ведущих московских технических ВУЗ-ов.

Задача

В вашем программном комплексе автоматически создается много научных документов на LaTeX (как наиболее подходящем для этих целей текстовом формате), каждый документ необходимо как можно быстрее показать пользователю в качестве черновика. «Автоматически» означает, что пользователь не набирает документы LaTeX вручную, он даже может не знать о том, что это такое. Подразумевается, что когда будет создан окончательный вариант документа, он будет либо экспортирован в LaTeX-е, либо преобразован в PDF средствами установленного дистрибутива TeX и распечатан. Показывать черновые варианты следует по возможности без использования сторонних программ и быстрее, при этом их корректность гарантируется. Размер документов не превышает нескольких листов A4, количество формул умеренное.

Казалось бы, если все равно в конце документ придется печатать, что невозможно без установки TeX, то к чему подчеркивать независимость от TeX-а? Дело в специфике программного комплекса, разрабатываемого автором.

Решения

  • В лоб — компилировать LaTeX в нечто PDF-подобное, используя дистрибутив TeX, и показывать во внешнем просмотрщике
  • Похитрее — показывать LaTeX сразу, в браузере (т.е. в компоненте WebBrowser), используя Integre techexplorer — ActiveX плагин к Internet Explorer
  • Еще хитрее — конвертировать LaTeX в MathML и показывать в поддерживающем этот стандарт браузере (т.е. соответствующем компоненте .NET)

Какой же способ выбрать?

Можно представить сравнение способов в виде таблицы.

Способ Преимущества Недостатки
«В лоб»
  • Реализация весьма проста — необходимо запускать а-ля pdflatex, ждать когда завершится компиляция, и открывать полученный документ.
  • Оптимальная совместимость — LaTeX точно будет показан как хотели, а не как смогли.
  • Скорость оставляет желать лучшего. Пока pdflatex подгрузит свои пакеты, пока прочитает шрифты, пока еще что-то — проходит много времени. На очень современном железе компиляция длится секунд 5-10 (MikTeX).
  • Зависимость от дистрибутива TeX — нужно его ставить на каждый компьютер, где будут пользоваться программой. Сюда же можно отнести зависимость от просмотрщика PDF и подобных. Если программой будут пользоваться профессоры на домашних компьютерах, то придется запастись огромным терпением и проявить детективные навыки.
Через Integre techexplorer
  • Высокая скорость. techexplorer первый раз при запуске забирает несколько секунд, но его инициализацию можно делать во время запуска самой программы.
  • Независимость от дистрибутива TeX.
  • Совместимость так себе. techexplorer имеет своеобразное понятие о LaTeX, например требует объявления тригонометрических функций до их использования в виде \define\sin{\operatorname{sin}. Все, что techexplorer не понимает (на самом деле многое), он выделяет красным цветом.
  • Реализация сложна. Если бы techexplorer был качественнее, то можно было сохранять LaTeX документ на диске и передавать имя файла в WebBrowser.Navigate. Однако, приходится поддерживать две версии одного и того же документа — «нормальный LaTeX» для экспорта и «понимаемый techexplorer-ом».
  • Зависимость от techexplorer. Впрочем, ставится он на порядок проще и быстре (msi можно включить в состав дистрибутива собственного софта), а ограничения безопасности ActiveX правятся одной записью в реестре.
Через MathML
  • Высокая скорость, если документ невелик. Gecko (движок Firefox, единственный из движков, сам по себе поддерживающий MathML) испытывает определенные трудности при отображении больших документов, например научных статей со множеством формул, но в нашей задаче требования к этому не выдвигались.
  • Преобразование LaTeX в MathML осуществляется самописной библиотекой с открытым исходным кодом latex2mathml, которую автор выложил на CodePlex. При возникновении ошибок совместимости ее всегда можно подогнать под себя.
  • Полная независимость от стороннего ПО. Используется GeckoFX, обертка .NET для движка Gecko. Сам Gecko (xulrunner) можно распространять в составе своей программы.
  • Совместимость. Для многих конструкций LaTeX приходится реализовывать аналоги на XHTML+MathML, что не всегда тривиально. Многого в latex2mathml нет.
  • Сложность реализации — вытекает из предыдущего.
  • MathML формально поддерживается Gecko, однако существуют очень неприятные особенности. Например, полная перерисовка и торможение при изменении размера документа.


Ниже вставлены примеры отображения LaTeX в PDF-е, в techexplorer-е и в MathML/Firefox.





По качеству отображения, очевидно, лидирует PDF, у MathML/Firefox и techexplorer свои ошибки.

Таблица сравнения скоростей отображения:

Способ Время, с (LaTeX, 8,5 кб, 130 строкб 101 формула) Время, с (LaTeX, 1 кб, 30 строк, 11 формул)
«В лоб» 14 11
techexplorer 3 3
MathML 12 3


В первом случае документ преобразовывался в PDF, а затем отображался в Adobe Reader. Во втором — показывался напрямую в Internet Explorer. В третьем — конвертировался в XHTML+MathML и показывался в Firefox. Конфигурация компьютера: Windows 7 x86, Core 2 Duo T7500, 4GB DDR2. Видно, как замедляется показ MathML в Firefox на относительно больших документах.

Субъективно — первый способ самый надежный, но медленный, второй — быстрый и некачественный, третий — использует новые технологии, которые до конца не отлажены.

Как видно, у каждого способа есть свои достоинства и недостатки. До недавнего времени автором использовался techexplorer, но он уже 4 года не развивается, и потенциально принесет проблемы в будущем. К сожалению, сырость latex2mathml не позволяет быстро добиться результатов, и не является универсальным решением для всех.

В этой статье был представлен лишь обзор путей решения проблемы быстрого отображения LaTeX в программах на .NET. Если вас заинтересуют детали, буду рад их пояснить.