emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
* [babel] Variable support for ob-maxima
@ 2011-03-23 15:04 Thomas Holst
  0 siblings, 0 replies; 3+ messages in thread
From: Thomas Holst @ 2011-03-23 15:04 UTC (permalink / raw)
  To: emacs-orgmode@gnu.org

[-- Attachment #1: Type: text/plain, Size: 1881 bytes --]

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

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Variable support for ob-maxima --]
[-- Type: text/x-patch, Size: 2654 bytes --]

--- 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"))
 

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [babel] Variable support for ob-maxima
       [not found] <.ywodd3lh3mjt@de.bosch.com>
@ 2011-03-23 17:44 ` Eric Schulte
  2011-03-24  7:25   ` Thomas Holst
  0 siblings, 1 reply; 3+ messages in thread
From: Eric Schulte @ 2011-03-23 17:44 UTC (permalink / raw)
  To: Thomas Holst; +Cc: emacs-orgmode@gnu.org

Thomas Holst <thomas.holst@de.bosch.com> writes:

> 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.
>

Great, thanks for sharing this patch, I'd very much like to apply this.
Have you seen the instructions for contributing to Org-mode [1]?  Any
patch over 10 lines long requires signed FSF copyright attribution
papers.  Please let me know if you are able to complete the copyright
assignment, once that is done I will apply this patch.

>
> 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:
>

The example below like a nice application, you may also want to use
"begin_src latex" blocks to display equations resulting from maxima code
blocks.

Cheers -- Eric

>
> * 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.

Footnotes: 
[1]  http://orgmode.org/worg/org-contribute.php

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [babel] Variable support for ob-maxima
  2011-03-23 17:44 ` Eric Schulte
@ 2011-03-24  7:25   ` Thomas Holst
  0 siblings, 0 replies; 3+ messages in thread
From: Thomas Holst @ 2011-03-24  7:25 UTC (permalink / raw)
  To: Eric Schulte; +Cc: Holst Thomas (DGS-EC/EHM2), emacs-orgmode@gnu.org

Hi Eric,

· Eric Schulte <schulte.eric@gmail.com> wrote:
> Thomas Holst <thomas.holst@de.bosch.com> writes:

[... snip ...]

> Great, thanks for sharing this patch, I'd very much like to apply this.
> Have you seen the instructions for contributing to Org-mode [1]?  Any
> patch over 10 lines long requires signed FSF copyright attribution
> papers.  Please let me know if you are able to complete the copyright
> assignment, once that is done I will apply this patch.

I will look at the FSF papers this evening. I would be really happy to
contribute to org-mode and babel.

I will send a notice once the papers are signed.

>>
>> 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:
>>
>
> The example below like a nice application, you may also want to use
> "begin_src latex" blocks to display equations resulting from maxima code
> blocks.

I will look into this. The example shows my first attempt to accomplish
my goal of using maxima as math tool and pretty print the equations with
LaTeX code. All within org mode - of course!

Best regards ...
  Thomas

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2011-03-24  7:25 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-03-23 15:04 [babel] Variable support for ob-maxima Thomas Holst
     [not found] <.ywodd3lh3mjt@de.bosch.com>
2011-03-23 17:44 ` Eric Schulte
2011-03-24  7:25   ` Thomas Holst

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).