Pull to refresh

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

LaTeX *
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. Надеюсь, что когда-нибудь всё это станет очень-очень просто (может даже благодаря этому посту) как в крутых коммерческих системах, но при этом останется гибкость и свобода во всех возможных смыслах.
Tags:
Hubs:
Total votes 38: ↑35 and ↓3 +32
Views 5.1K
Comments Comments 9