2 июня 2010 в 17:41

Математические вычисления и графики в LyX с использованием Sage

LyX — это WYSIWYM процессор документов, который прозрачным образом работает с LaTeX. То есть пользователь создаёт в этом процессоре файлы *.lyx, из которых потом создаются и компилируются *.tex.
Sage — это система компьютерной алгебры, работающая прозрачным образом с другими математическими пакетами. Основной интерфейс — командная строка, при этом используется всё многообразие возможностей python. Также доступен web-интерфейс, который можно опробовать на сайте разработчиков.
Совместное использование этих двух разработок открывает интересные возможности. Например, можно создавать отчёты, в которых вычисления, графики и аналитические выкладки будут выполняться автоматически, почти как в маткаде каком-нибудь, но с наглядной структурой LyX, гибкостью python и возможностями вёрстки LaTeX.



Установка


LyX есть почти в любом современном дистрибутиве, так что устанавливается обычным образом. Он написан на Qt, есть порт под Windows. LyX потянет за собой LaTeX.
С Sage всё не так просто. Он сейчас есть только под linux, в дистрибутивах, если и представлен, то в не особо работоспособном виде. Запускать под виндой разработчики советуют при помощи виртуальной машины.
Разработчики Sage предлагают загрузить сборку под вашу архитектуру (386 или amd64) и дистрибутив (Ubuntu и Fedora, но, думаю, будет работать и в остальных). Сборка содержит в себе, кроме sage-модулей, python, maxima, gap и много чего ещё. Скачиваете архив, распаковываете в какую-нибудь папку и сразу можно запускать из неё sage или sage-notebook — сервер для веб-интерфейса. Также в неё входит стиль для LaTeX, который всегда можно скачать отдельно.
Пусть всё это не особо совместимо с менеджерами пакетов, но достаточно удобно.
Буду предполагать, что вы распаковали архив в каталог /usr/local/sage.

Подготовка


Теперь, когда установлены LyX и Sage, можно приступить к их объединению.
Для этого потребуется:
  1. Настроить LaTeX.
  2. Написать скрипт.
  3. Настроить LyX.

1. Настройка LaTeX

Стиль sagetex, о котором упомянуто выше, должен быть виден LaTeX'у. В мануале к стилю советуют положить его в папку ~/texmf/tex/genetic. Под убунтой, видимо, нужно класть в ~/.local/share/texmf/tex/genetic
У меня заработало (пока без LyX) так:
$ sudo ln -s /usr/local/sage/local/share/texmf/tex/generic/sagetex/ /usr/local/share/texmf/tex/generic/sagetex/
и потом
$ sudo texhash /usr/local/share/texmf/tex/generic/sagetex/ # ну, или путь, куда вы только что положили стиль

Кстати, говоря, TexLive, который ставится по умолчанию в убунте, содержит стиль sagetex. Но есть проблема с версиями — sage и sagetex разных версий друг с другом не дружат, поэтому важно, чтобы LaTeX имел дело именно с новым sagetex.sty.
Узнать, какой файл возмёт LaTeX, если ему сказать \usepackage{sagetex}, можно так:
$ kpsewhich sagetex.sty

Этот стиль подразумевает следующую последовательность сборки документов, его использующих:
$ latex tex_with_sage.tex # генерируется файл с командами sage tex_with_sage.sage
$ sage tex_with_sage.sage # генерируется файл с ответами системы
# сборка индекса и прочие команды, которые вам нужны
$ latex tex_with_sage.tex # получаем результат


LyX, понятное дело, не умеет запускать sage. Но он умеет работать с noweb. Что это — сейчас даже и не важно, нам просто нужно, чтобы в системе был файл noweb.sty. Можно установить пакет noweb, а можно просто создать этот файл.
2. Скрипт

Как только LyX начинает собирать итоговый файл (например pdf), он генерирует во временном каталоге файл *.tex и запускает обычные команды (pdflatex, makeindex и т.д). Потом он запускает во вьювере итоговый файл *.pdf или *.dvi или копирует этот файл в папку с исходным документом.
Если тип документа — noweb, то будет сгененирован файл *.nv (по сути тот же *.tex), для этого файла будет запущена специальная программа, которая создаёт *.tex, после чего в ход уже идут pdflatex, makeindex и иже с ними.
В качестве этой программы, мы подсунем LyX'у такой простенький скрипт:
#!/bin/bash

name=`basename $1 .nw`

# uncomment and replace path if you have problems with
# old version of sagetex.sty in texlive
# ln -sf /usr/local/share/texmf/tex/generic/sagetex/sagetex.sty sagetex.sty

# generating *.sage file
latex $1  > $name.sage.log 2>&1
echo "" >> $name.sage.log

# generating *.sout file
/usr/local/sage/sage $name.sage >> $name.sage.log 2>&1

ln -sf $1 $2

# now LyX can run latex in usual way


Я положил его в $HOME и назвал sagelyx.sh.

3. Настройка LyX

В настройках документа должны быть доступны классы с Noweb. Если они недоступны, возможно нужно запустить Инструменты->Переконфигурировать.
Дальше, нужно сказать LyX'у, что для документов Noweb нужно запускать наш скрипт (см. рисунок).

В преамбулу всех документов добавляем:
\usepackage{sagetex}

Использование


Теперь можно в документе ввести формулу (или сделать TeX-вставку):
$26^{3}\cdot10^{3}=\sage{26**3+10**3}$


Если включён предпросмотр формул, то LyX заменит команду \sage на ??. Это потому что для предпросмотра используется только один проход LaTeX. Однако, если нажать кнопку Просмотр PDF, то откроется pdf с проставленными числами.
Простенький пример и мой скрипт: http://www.box.net/shared/air7v45yqk

Что не работает?


Не работает много чего…
Что-то плохо получается в LyX и приходится делать TeX вставки, например не особо получается использовать \sage{} внутри математического окружение, потому что LyX удаляет пробелы и вставляет фигурные скобки.
Что-то нельзя сделать в самом sagetex, например использовать строки с юникодовским текстом. Для этого нужно в начале sage-файла разместить сточку
# -*- coding: utf-8 -*-
но средств никаких для этого sagetex не предоставляет.

P.S. Надеюсь, что когда-нибудь всё это станет очень-очень просто (может даже благодаря этому посту) как в крутых коммерческих системах, но при этом останется гибкость и свобода во всех возможных смыслах.
Константин Подшумок @kpp
карма
30,0
рейтинг 0,0
Самое читаемое Разработка

Комментарии (9)

  • –3
    SAGE на моем хабре? O_o :-)
    • +2
      а должно не быть?
      • +3
        Наверное, unbeliever шутил и имел в виду lurkmore.ru/Sage
        • 0
          спасибо, что разъяснили)
  • +1
    Большое спасибо за подробное руководство, недавно как раз нужно было вставлять графики — но так как графика было всего 3, обошелся простыми картинками :-)

    Вообще Lyx — отличная штука, но танцев с бубном там требуется изрядно (для прикручивания орфографии под макос например). И к сожалению настройки надо делать и в Lyx, и в самой системе — то есть перетащить с домашнего компьютера папку с настроенным Lyx'ом на рабочий просто так нельзя — приходится извращаться.

    Очень хотелось бы увидеть продолжение статей про Lyx!
    • 0
      О каких настройках в системе вы говорите? Если не делать извращений вроде описанных в этом топике, то вроде всё должно работать без лишних настроек системы.
      • +1
        В том-то и дело что «извращения» полезные и заниматься ими приходится :-)

        Пример — установка Sage, или орфографии (http://wiki.lyx.org/Mac/MacSpelling)

        В результате артефакты Lyx, Sage (сам sage, или lyx-скрипт — спасибо за него, кстати), Aspell и Tex «размазаны» по различным папкам системы — и перетащить на другую машину это немного затруднительно. А на работе иногда приходится коллегам помогать настроить тоже самое — это вообще песня…

        Просто в сравнении с каким-нибудь Eclipse, где есть 2 папки — сам эклипс и папка с проектами-настройками — всё это синхронизируется на ура — напрягает всё настравивать по 2 раза.
        • 0
          Понятно, ещё можно таскать с собой лайв-дивиди со всем необходимым и настроенным
  • 0
    «Для этого нужно в начале sage-файла разместить сточку

    # -*- coding: utf-8 -*-

    но средств никаких для этого sagetex не предоставляет.»

    Но скрипт sagelyx.sh который генерирует sage-файл можно подправить после того как создали sage-файл:
    sed -i '1i # -*- coding: utf-8 -*-' $name.sage

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.