Математические вычисления и графики в 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. Надеюсь, что когда-нибудь всё это станет очень-очень просто (может даже благодаря этому посту) как в крутых коммерческих системах, но при этом останется гибкость и свобода во всех возможных смыслах.
    • +32
    • 3,8k
    • 9
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 9
    • –3
      SAGE на моем хабре? O_o :-)
    • +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

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