Emacs
18 June 2008

Как однажды Emacs из Octave в Latex формулы таскал

Довольно часто приходится для университета проводить различные несложные расчеты лабораторных, расчетных и, в этом семестре, дипломной работы бакалавра. По каждой из них необходимо составить отчет, в котором должны быть приведены все расчеты как в символьном виде, так и в численной форме. Иногда доводилось по три раза перенабирать отчет заново, когда преподаватель обнаруживал ошибку за ошибкой в самом начале.

Отчет в двадцать страниц, из которых пятнадцать — расчетов. Никакой разумной деятельности, только тупой и кропотливый набор формул пальчиками.

Когда я начал писать бакалаврскую работу, стало ясно, что вбивать все эти десятки/сотни формул в отчет раз по десять каждую нет никакого желания, зато есть желание побольше узнать о возможностях Emacs и Emacs Lisp.Так само собой решилось, что надо этот самый набор формул спрограммировать.


Latex, Octave, Emacs



Если кто не знает — в Word отвратительный набор формул. Чуть лучше ситуация
обстоит в OpenOffice, где формулы надо набирать на специальном языке.

В обоих этих приложениях надо загружать здоровенную и, соответственно,
медленную программу, мучаться с использованием мыши; никак нельзя
автоматизировать сборку документов. Поэтому для набора отчетов я использую
Latex.

Latex, если не использовать умных слов, это такой язык разметки научных
текстов. Весь документ набирается простым текстом, который потом скармливается
парсеру и выдает какой-нибудь удобный для печати или чтения формат; в моем
случае — pdf.

Я вообще люблю все, что хранится в виде простых текстовых файлов; здесь всегда
есть простор для фантазии программиста: документ можно мучать регулярным
выражениями, автоматически создавать скриптами, легко создавать и редактировать
шаблоны без дополнительных формальностей.

Для автоматизации дипломных расчетов разумно использовать Octave — бесплатный
клон Matlab. В программе используется очень простой язык, полностью совместимый
с языком оригинальной программы; дополнительных усилий по освоению мне не
потребовалось.

Ну и объединяется все это особым клеем — универсальным супер-пупер редактором
Емаксом, в котором я пишу весь свой код и текст. В нем в качестве дочернего
процесса запускается интерпретатор кода Octave, а для набора и предпросмотра
формул — специальный режим Auctex.

Емакс представляет собой так называемую Лисп-машину. Все его возможности, даже
самые базовые, скриптуются на упрощенной версии функционального языка Лисп. В
любой момент можно написать небольшую функцию, скормить Емаксу и тут же
закрепить за какой-нибудь клавишей для использования.

Подзадачи



Итак, программа должна решать следующие задачи:
  • разбирать выбранные выражения в Octave, выделять конструкции, которые требуют замены;
  • выделять названия переменных; выделять в них часть, опускаемую в нижний индекс в символьном виде (например, в x_2 выделить x и 2, первое число должно быть названием, второе — нижним индексом);
  • определять элементарные математические функции и заменять их при необходимости на удобный для чтения вид (например, функцию abs() заменять на модуль — пару вертикальных палок);
  • после составления символьного выражения, необходимо каждую из переменных заменить в нем ее значением;
  • вычислить значение формулы и привести результат.


Решение



Первые три пункта решает простенький парсер на Elisp; последний пункт очень
легко выполняется, так как в стандартный поток любого дочернего процесса( в
данном случае — интерпретатора Octave) можно послать любую строку, и получить
стандартный выход. То есть, после того, как был выполнен в Octave мой файл с
рассчетами, можно просто послать названия переменных, и получить их численные
значения.

Вот и все. Ставишь курсор на строку с формулой в файле Octave, жмешь пару
клавиш — в файл отчета вставляется формула в виде символов, затем в виде
чисел, и, наконец, результат.

Смотрим иллюстрации!

Так было

Так стало

Предпросмотр формулы в Емаксе

Возможные улучшения



Для вставки одной формулы, таким образом, надо просто навести курсор и нажать
пару клавиш. В принципе, можно было бы пойти еще дальше и сделать сборку отчета
совсем уж независимой от меня. Скажем, отмечать специальным комментарием с
примером в отчете место, куда надо вставить формулу, а в файле расчетов тот же
пример ставить рядом с вычисляемым выражением. Тогда будет достаточно писать
команду «build-report», а после — смотреть, как заполняется документ.

Но как-то руки не дошли… :) Да и с универом я вроде пока заканчиваю, в
дальнейшем программа не пригодится. Но опыт однозначно положительный, диплом
стал продвигаться значительно быстрее. Жаль только, факультет у меня не о
программировании, за такие вещи по голове никто и не думает погладить.

В общем, за коллекцией документации по Latex, кодом на Elisp и пояснениями к
нему, можно обратиться ко мне лично по соответствующему адресу. С удовольствием
помогу с Emacs по мере возможности; хотя, конечно, до уровня гуру мне еще очень
и очень далеко; проблема — вообще первый опыт программирования на Elisp.

+4
1.8k 11
Comments 3
Top of the day