Hello,

recent org-mode versions have support for maxima via org-babel. But
there is no support vor variables. I implemented basic support for
variables. A header =var: eq="x^2"= is translated to:

#+begin_src maxima
  eq : x^2;
#+end_src

I attached a patch to this eMail.

Now I can use the output from one maxima block and make a LaTeX equation
out of it with one maxima code block and reuse the output and make further
maipulations with it. I find it dificult to explain what I want to do,
so here is an example:

* Reuse Output of maxima code blocks

  #+source: eq1()
  #+begin_src maxima :exports none :results output verbatim
    display2d:false;
    eq1: x**2;
    print(eq1);
  #+end_src
  #+results: eq1
  : x^2 

  Pretty print equation with LaTeX:

  #+source: eq1-latex
  #+begin_src maxima :exports results :results output latex :var eq=eq1()
    print("\\begin{equation}");
    print(tex1(eq));
    print("\\end{equation}");
  #+end_src

  #+results: eq1-latex
  #+BEGIN_LaTeX
  \begin{equation} 
  x^2 
  \end{equation} 
  #+END_LaTeX

  Do some further calculation / maipulation to equation

  #+source: eq2()
  #+begin_src maxima :exports none :results output verbatim :var eq=eq1()
    display2d:false;
    eq2 : eq + sin(x);
    print(eq2);
  #+end_src
  #+results: eq5
  : sin(x)+x^2 

  Pretty print second equation:

  #+source: eq2-latex
  #+begin_src maxima :exports results :results output latex :var eq=eq2()
    print("\\begin{equation}");
    print(tex1(eq));
    print("\\end{equation}");
  #+end_src

  #+results:
  #+BEGIN_LaTeX
  \begin{equation} 
  \sin x+x^2 
  \end{equation} 
  #+END_LaTeX

With this workflow I have all org features for docmentation of math or
engineering works.

I am a lisp beginner so my lisp code may not be the best. If there are
better ways to accomplish variable support please let me know.

-- 
Best regards
  Thomas
--- a/ob-maxima.el	2011-03-17 08:37:24.977544600 +0100
+++ b/ob-maxima.el	2011-03-23 14:13:26.780223600 +0100
@@ -47,29 +47,48 @@
   "Expand a block of Maxima code according to its header arguments."
   body)
 
+;; This function expands the body of a source code block by doing
+;; things like prepending argument definitions to the body, it should
+;; be called by the `org-babel-execute:maxima' function below.
+(defun org-babel-expand-body:maxima (body params &optional processed-params)
+  "Expand BODY according to PARAMS, return the expanded body."
+  (concat
+   (mapconcat ;; define any variables
+    (lambda (pair)
+      (format "%s : %s;"
+              (car pair) (org-babel-maxima-var-to-maxima (cdr pair))))
+    (mapcar #'cdr (org-babel-get-header params :var)) "\n") "\n" body "\n"))
+
 (defun org-babel-execute:maxima (body params)
   "Execute a block of Maxima entries with org-babel.  This function is
 called by `org-babel-execute-src-block'."
   (message "executing Maxima source code block")
   (let* ((result-params (split-string (or (cdr (assoc :results params)) "")))
-	 (cmdline (cdr (assoc :cmdline params)))
-	 (in-file (org-babel-temp-file "maxima-"))
-	 (cmd (format "maxima --very-quiet -r 'batchload(%S)$' %s"
-		      in-file cmdline)))
-    (with-temp-file in-file (insert body))
+         (cmdline (cdr (assoc :cmdline params)))
+         (in-file (org-babel-temp-file "maxima-"))
+         (cmd (format "maxima --very-quiet -r 'batchload(%S)$' %s"
+                      in-file cmdline)))
+    (with-temp-file in-file
+      (insert (org-babel-expand-body:maxima body params)))
     (message cmd)
     ((lambda (raw) ;; " | grep -v batch | grep -v 'replaced' | sed '/^$/d' "
        (mapconcat
-	#'identity
-	(delq nil
-	      (mapcar (lambda (line)
-			(unless (or (string-match "batch" line)
-				    (string-match "^rat: replaced .*$" line)
-				    (= 0 (length line)))
-			  line))
-		      (split-string raw "[\r\n]"))) "\n"))
+        #'identity
+        (delq nil
+              (mapcar (lambda (line)
+                        (unless (or (string-match "batch" line)
+                                    (string-match "^rat: replaced .*$" line)
+                                    (= 0 (length line)))
+                          line))
+                      (split-string raw "[\r\n]"))) "\n"))
      (org-babel-eval cmd ""))))
 
+
+(defun org-babel-maxima-var-to-maxima (var)
+  "Convert an elisp var into a string of template source code
+specifying a var of the same value."
+  (format "%s" var))
+
 (defun org-babel-prep-session:maxima (session params)
   (error "Maxima does not support sessions"))
 

Reply via email to