LINUX.ORG.RU

LaTex + Maxima

 ,


0

2

Добрый день.

Прошу прощения за оффтопик. Но больше задавать такой вопрос негде.

Мне нужно реализовать связку LaTeX + Maxima (компьютерная алгебра). Нашел статью на испанском языке: http://webs.um.es/mira/tex/maxima_latex.php И комментарии на форуме: http://www.linux.org.ru/forum/development/5453311

Я пытаюсь использовать бесплатное ПО, но мне необходим виндоуз на моем компьютере.
Пробую скомпилировать пример из первой ссылки test.tex.
1. Установил по Windows XP Maxima 5.31.2. Добавил путь (PATH), чтобы maxima запускалась из командной строки.
2. Записал файлы max-tex-init.mac и max-tex-tools.lisp в папку C:\Program Files\Maxima-5.31.2\share\maxima\5.31.2\src\
3. Файл-пакет maxiplot.sty сохранил в одну папку с test.tex.
4. Откомпилировал PDFLatex’ом (MikTex 2.9 Portable) файл test.tex. Получил файл test.mac:

load("max-tex-init.mac")$
:lisp(defprop $matrix amsmath-matrix tex)
write_stdout("test.mxx")$
append_stdout("test.mxx", print("\\newcommand{\\maximai}",lbracep),
f:x/(x^3 - 3*x +2),
 tex('integrate(f,x)),
 print("="),
 tex(integrate(f,x)),
 print("+K")
 
,print(rbrace))$
5. Компилирую файл test.mac командой: maxima -b test.mac и получаю файл test.mxx следующего содержания:
\newcommand{\maximai} {% 
Maxima encountered a Lisp error:

 Error in AND [or a callee]: The variable CCOL is unbound.

Automatically continuing.
To enable the Lisp debugger set *debugger-hook* to nil. 

Почему не компилируется? Что сделать, чтобы заработало?

Выбрал Maxim’у так как она есть и под Windows и под Linux.

Изначально хотел использовать SageTeX, но в Windows он работает только из под виртуальной машины.
Возможно есть более современные и описанные решения для LaTex в Windows\Linux?

Заранее спасибо. Ответы можно на почту Youra_Polishuk@bk.ru


tex('integrate(f,x)),

Вот прямо так: без закрывающей кавычки?

А что, надо именно в момент компиляции все вычисления делать?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Одна кавычка - так было в примере. Завтра попробую откорректировать.

Мне подойдет вариант компиляции в несколько проходов. Хочется современный подход с примерами и документацией. Чтобы под виндоуз и линукс работало.

Youra_P
() автор топика
Ответ на: комментарий от Youra_P

Если там дофига расчетов, я бы сделал Makefile. При первом запуске все компиляется, в латеховском файле нужны только \input'ы. Далее компиляться будут только те файлы, которые изменяются.

Вот если результаты ты будешь еще где-то в тексте использовать, тогда сложней. У меня в ЖЖшке можешь посмотреть примеры внутритекстовых вычислений в латехе. Но это тоже сильно тормозит процесс компиляции документа. Можно по-другому сделать: генерировать файл вида \def\var1{значение}\def\var2{значение} и т.д., а в документе надо будет лишь прочитать это сначала (как и читается файл с перекрестными ссылками), а в самом тексте писать \var1, \var2 и т.д. make "автоматически" проследит за компиляцией нужных файлов (надо только про зависимости не забыть), так что при изменении одного файлика с вычислениями "автоматом" будут изменены все результаты этого вычисления, встречаемые в тексте.

Eddy_Em ☆☆☆☆☆
()

У меня ваш код (скопировал с вашего сообщения) из test.mac откомпилировался. У меня стоит maxima-5.18.1 (linux) Оба файла max-tex-tools и max-tex-init лежат в папке с test.mac. Попробуйте установить версию по старее.

zhekas
()
Ответ на: комментарий от zhekas

Установил себе версию maxima-5.18.1 - ЗАРАБОТАЛО!
Но у меня возникла куча вопросов.

Вы делали что-нибудь серьезное с помощью данной связки?

Если не работает на новой версии значит никто это не поддерживает!
Этот фрагмент работает:

\[
 \begin{maxima}
 f1:sin(x),
 tex('diff(f1,x)),
 print("="),
 tex(diff(f1,x))
 \end{maxima}
\]

Этот не работает:

\[
 \begin{maxima}
 f1:=sin(x),
 tex('diff(f1(x),x)),
 print("="),
 tex(diff(f1(x),x))
 \end{maxima}
\]

Оба варианта работают непосредственно в графической среде Maxima!!!
Т.е. получается, что поддержка неполноценная? Подскажите как обстоят дела с SageTeX?

Заранее спасибо.

Youra_P
() автор топика
Ответ на: комментарий от Youra_P

Я делал связку axiom + latex. Костыльненько, но работает. Правда, только linux. Недавно аноним навел на такую штуку skribilo. Расчеты можно делать прямо внутри файлов на scheme, выходных форматов несколько, в том числе tex, pdf и html.

Кроме того видел связку latex + python.

feofan ★★★★★
()

Проверь еще ключик -shell-escape латеха. В некоторых сборках по умолчанию запрещено \write18, т.е. внешние команды вызываться не будут → не будет работать максима.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Вот прямо так: без закрывающей кавычки?

Эдди, скажи, нафига ты лезешь советовать, если нихера не знаешь про максиму?

unanimous ★★★★★
()

ТС, посмотри, как все сделано в emaxima — расширении emacs для работы с максимой. Еще можно посмотреть на maxima-mode и imaxima

unanimous ★★★★★
()
Ответ на: комментарий от unanimous

Нужно же везде свой нос сунуть!

ТС, смотри, вот проверочный код:

cat a.tex 
\documentclass[a4paper,12pt]{extarticle}
\usepackage{/home/eddy/ed}
\def\W#1{\immediate\write18{#1}}
\begin{document}
\def\Xangle{10}
\W{echo 'scale=3; s(\Xangle*45/a(1))' | bc -l > sin.value}
\def\SX{\input{sin.value}}
$\sin \Xangle\degr = \SX$
\end{document}

Запускаем без -shell-escape, получаем фикус:

...
! LaTeX Error: File `sin.value' not found
...

Запускаем с ним, все ОК, в файле видим: [latex]\sin 10^\circ = .996[/latex].

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Youra_P

Второй пример у меня и в maxima не работает. Есть у вас консольная maxima? Вот там и проверяйте. Зато работает, если исправить третью строку

f1(x):=sin(x),

Серьёзного ничего с ним не делал. Что-то на уровне численных методов вычисления интеграла.

zhekas
()
Ответ на: комментарий от Youra_P

Ну так то же самое и будет. Только компиляция будет намного быстрей, т.к. при каждом последующем запуске будут компиляться лишь изменившиеся части.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Спасибо за совет.
Если Вам не сложно киньте ссылку на Ваш пример.
Я что-то не нашел. Может не там искал.
Пример который Вы привели ранее это оно?
Чем будут компилироваться изменившиеся части?
Например, если нужно получить:

f(x)=sin(x)
f'(x)=???

Я тут посмотрел Maple в нем также есть вывод результата в формате LaTeX.

Заранее спасибо.

Youra_P
() автор топика
Ответ на: комментарий от Youra_P

Поясню: в латеховский файл мы только вставляем \input{файл1}\input{файл2} и т.д., а сами вычисления сктиптуем в файлики и складываем их в отдельную директорию.

В Makefile прописываем цели: основной документ с зависимостями от вспомогательных документов + для каждого документа с инпутами — зависимости от этих решений. Компилятором назначаем pdflatex, latex, xetex и т.п., что там у тебя. Для файлов "решений" компилятором назначаем максиму, октаву и т.п.

Если документ большой, то лучше куски включать командами \include, в этом случае при изменении одного куска не нужно будет перекомпилировать остальные.

Вот простейший пример: пусть у нас текст находится в файле main.tex, а то, что нужно посчитать, — в файле calc/eq001.max. Делаем Makefile вроде такого (не проверял, так что проверь сам):

RESULT = main.pdf
LATEX  = pdflatex
CALC   = maxima

CALCDIR= calc
OBJDIR = calc_res

L_DEFS = -shell-escape
C_DEFS = # здесь напиши флаги для максимы

L_SRC  = main.tex  # когда файлов много, проще так: $(wildcard *.tex)

C_SRC  = $(CALCDIR)/eq001.max  # --//--: $(wildcard $(CALCDIR)/*.max)

OBJS   = $(addprefix $(OBJDIR)/, $(C_SRC:$(CALCDIR)/%.max=%.tex))

all : $(RESULT)
$(RESULT) : $(L_SRC) $(OBJS)
	$(LATEX) $(L_DEFS) $(L_SRC) 

$(OBJDIR)/%.tex: $(CALCDIR)/%.max
        $(CALC) $(C_DEFS) $< -o $@
Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Kostafey

Хочу задать несколько глупых вопросов.

1. Зачем нужно устанавливать в LaTeX Ghostscript?
2. Получается, что Emac вызывает Maxim'у получает результат (формулы, число и т.д.), которое вставляется в исходный код документа LaTeX? Очень здорово, так как его можно скорректировать!
3. Получится ли настроить описываемую Вами связку для портативных версий MikTeX 2.9 Portable + X-Maxima Portable? Т.е. Emac Portable+AUCTeX существует?

Заранее спасибо за ответы и Вашу статью.

Youra_P
() автор топика
Ответ на: комментарий от Youra_P

1. Оно и так установится, т.к. в зависимостях. А без него ты ничего не сделаешь.

(2., 3. не скажу: без понятия)

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Youra_P

1. Ghostscript устанавливается не в LaTeX, а в систему. Для «ос» типа Windows механизм разрешения зависимостей находится вне компьютера. LaTeX может и имеет какую-то встроенную версию Ghostscript-а (не в курсе что сейчас идет в составе дистрибутива под Win), для нормальной работы в Windows, Ghostscript необходимо установить вручную.

2. Да, конечно. Самое главное формула по которой производится расчет находится она тут же, рядом, в LaTeX-коде, но в виде Maxima-кода и при этом не попадает в результирующий документ (это как бы исходный код). Можно скорректировать ее и перегенерить LaTeX, вместо того, чтобы переписывать LaTeX всякий раз вручную.

3. Я думаю да. Принципиальных ограничений для работы этой связки нет, т.к. все программы взаимодействуют через консольный/бинарный выхлоп. Единственное исключение составляет Ghostscript. С ним есть одна тонкость, я ее описывал.

Kostafey
()
Ответ на: комментарий от Eddy_Em

Пробую сделать пример, как у Вас.

Мне нужно из строки «$${{15}\over{4}}$$» сделать строку «${{15}\over{4}}$», т.е. нужно удалить первый и последний символ строки.

Пытаюсь это сделать с помощью пакета xstring.

Сделал процедуры cutchar, но как в нее передать строку из \SX?

\documentclass[14pt]{extarticle}
\usepackage{xstring}
\usepackage{amsmath}

\def\f(#1){(#1)^2-5*(#1)+6}

\newcommand\cutchar[2]{%
\StrGobbleLeft{#1}{1}[#2]
\StrGobbleRight{#2}{1}[#2]
} 

\begin{document} 

\section{Problem}
Evaluate $f(x)=\f(x)$ for $x=\frac 1 2$.

\section{Solution}
\immediate\write18{cas "x: 1/2\string$ tex(\f(x))\string$"}
\def\SX{\input{solution}}%This file has a string "$${{15}\over{4}}$$"

%\cutchar{1234}{\SX}%<----Работает
\cutchar{\SX}{\SX}%<----Не работает
$f(x)=$\SX
\end{document}

Youra_P
() автор топика
Ответ на: комментарий от Eddy_Em

Согласен. Разобрался:

\usepackage{catchfile}
...
\CatchFileDef\SX{solution}{\catcode`\$=9}

Youra_P
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.