diff --git a/lisp/ob-maxima.el b/lisp/ob-maxima.el index d1d7c7424..ab166bfd4 100644 --- a/lisp/ob-maxima.el +++ b/lisp/ob-maxima.el @@ -48,29 +48,44 @@ :group 'org-babel :type 'string) +(defvar org-babel-maxima-command-arguments + "--very-quiet" + "A string containing the command-line arguments used when calling the Maxima executable. See `org-babel-maxima-command', `org-babel-maxima-batch/load' and `org-babel-execute:maxima'.") + +(defvar org-babel-maxima-graphic-package-options + '((plot . "(set_plot_option ('[gnuplot_term, %s]), set_plot_option ('[gnuplot_out_file, %S]))$") + (draw . "(load(draw), set_draw_defaults(terminal='%s,file_name=%S))$")) + "An alist, each element of the form (PACKAGE-NAME . FORMAT-STRING). The format string contains the Maxima code to set the graphic file terminal and name. It must contain `%s' to set the terminal and `%S' to set the filename. The default package is `plot'. See `org-babel-maxima-expand'.") + +(defvar org-babel-maxima-default-epilogue + "gnuplot_close ()$" + "A string with the final Maxima code executed. See `org-babel-maxima-expand'.") + (defun org-babel-maxima-expand (body params) "Expand a block of Maxima code according to its header arguments." - (let ((vars (org-babel--get-vars params)) - (epilogue (cdr (assq :epilogue params))) - (prologue (cdr (assq :prologue params)))) + (let* ((vars (org-babel--get-vars params)) + (graphic-file (ignore-errors (org-babel-graphical-output-file params))) + (epilogue (cdr (assq :epilogue params))) + (prologue (cdr (assq :prologue params)))) (mapconcat 'identity - (list - ;; Any code from the specified prologue at the start. - prologue - ;; graphic output - (let ((graphic-file (ignore-errors (org-babel-graphical-output-file params)))) - (if graphic-file - (format - "set_plot_option ([gnuplot_term, png]); set_plot_option ([gnuplot_out_file, %S]);" - graphic-file) - "")) - ;; variables - (mapconcat 'org-babel-maxima-var-to-maxima vars "\n") - ;; body - body - ;; Any code from the specified epilogue at the end. - epilogue - "gnuplot_close ()$") + (delq nil + (list + ;; Any code from the specified prologue at the start. + prologue + ;; graphic output + (if graphic-file + (let ((graphics-pkg (intern (or (cdr (assq :graphics-pkg params)) "plot"))) + (graphic-format-string (cdr (assq graphics-pkg org-babel-maxima-graphic-package-options))) + (graphic-terminal (file-name-extension graphic-file)) + (graphic-file (if (eq graphics-pkg 'plot) graphic-file (file-name-sans-extension graphic-file)))) + (format graphic-format-string graphic-terminal graphic-file))) + ;; variables + (mapconcat 'org-babel-maxima-var-to-maxima vars "\n") + ;; body + body + ;; Any code from the specified epilogue at the end. + epilogue + (if graphic-file org-babel-maxima-default-epilogue))) "\n"))) (defun org-babel-execute:maxima (body params) @@ -80,11 +95,18 @@ This function is called by `org-babel-execute-src-block'." (let ((result-params (split-string (or (cdr (assq :results params)) ""))) (result (let* ((cmdline (or (cdr (assq :cmdline params)) "")) + (batch/load (or (cdr (assq :batch params)) "batchload")) + (cmdline (if (or (equal cmdline "") (equal batch/load "batchload")) + ;; legacy behaviour: + ;; ensure that --very-quiet is on command-line by default + (concat cmdline " " org-babel-maxima-command-arguments) + ;; if using an alternate loader, :cmdline overwrites default + cmdline)) (in-file (org-babel-temp-file "maxima-" ".max")) - (cmd (format "%s --very-quiet -r %s %s" + (cmd (format "%s -r %s %s" org-babel-maxima-command (shell-quote-argument - (format "batchload(%S)$" in-file)) + (format "(linenum:0, %s(%S))$" batch/load in-file)) cmdline))) (with-temp-file in-file (insert (org-babel-maxima-expand body params))) (message cmd) @@ -97,6 +119,8 @@ This function is called by `org-babel-execute-src-block'." (unless (or (string-match "batch" line) (string-match "^rat: replaced .*$" line) (string-match "^;;; Loading #P" line) + (string-match "^read and interpret" line) + (string-match "^(%\\([io]-?[0-9]+\\))[ ]+$" line) (= 0 (length line))) line)) (split-string raw "[\r\n]"))) "\n"))))) diff --git a/testing/examples/ob-maxima-test.org b/testing/examples/ob-maxima-test.org index b83114a4f..2b88a65a5 100644 --- a/testing/examples/ob-maxima-test.org +++ b/testing/examples/ob-maxima-test.org @@ -23,6 +23,13 @@ plot2d(sin(a*x), [x, 0, 2*%pi])$ #+begin_src maxima :results graphics :file maxima-test-3d.png plot3d (2^(-u^2 + v^2), [u, -3, 3], [v, -2, 2])$ #+end_src + +** Use the ~draw~ package +This test exercises the ~:graphics-pkg~ header argument. +#+begin_src maxima :var a=0.5 :results graphics file :file maxima-test-cos.png :graphics-pkg draw +draw2d(explicit(cos(a*x), x, -%pi, %pi))$ +#+end_src + * Output to a file Output to a file #+begin_src maxima :file maxima-test-ouput.out @@ -89,3 +96,18 @@ tex(ratsimp(diff(%e^(a*x), x))); #+BEGIN_LaTeX $$a\,e^{a\,x}$$ #+END_LaTeX + +* Batch +Exercise the ~:batch~ header argument. These tests are also defined in ~testing/lisp/test-ob-maxima.el~. The test name is name of the ~ert~ test. + +#+name: ob-maxima/batch+verbatim +#+begin_src maxima :exports both :results verbatim :batch batch +(assume(z>0), +integrate(exp(-t)*t^z, t, 0, inf)); +#+end_src + +#+name: ob-maxima/batch+verbatim+quiet +#+begin_src maxima :exports both :results verbatim :batch batch :cmdline --quiet +(assume(z>0), +integrate(exp(-t)*t^z, t, 0, inf)); +#+end_src diff --git a/testing/lisp/test-ob-maxima.el b/testing/lisp/test-ob-maxima.el index e2433d232..1f6a1737a 100644 --- a/testing/lisp/test-ob-maxima.el +++ b/testing/lisp/test-ob-maxima.el @@ -69,6 +69,28 @@ (equal '((1 2 3) (2 3 4) (3 4 5)) (org-babel-execute-src-block))))) +(ert-deftest ob-maxima/batch+verbatim () + "Exercise the `:batch' header argument: use Maxima `batch' command to execute src block. Since `--very-quiet' is set on command-line, the ground input and formatted output are printed (without input/output labels)." + (unwind-protect + (org-test-with-temp-text + (format "#+begin_src maxima :results verbatim :batch batch +(assume(z>0), +integrate(exp(-t)*t^z, t, 0, inf)); +#+end_src") + (should (equal (org-babel-execute-src-block) + "(assume(z > 0),integrate(exp(-t)*t^z,t,0,inf))\n gamma(z + 1)"))))) + +(ert-deftest ob-maxima/batch+verbatim+quiet () + "Exercise the `:batch' header argument: use Maxima `batch' command to execute src block. Since `--quiet' is set by `:cmdline' header, the ground input and formatted output are printed with input/output labels." + (unwind-protect + (org-test-with-temp-text + (format "#+begin_src maxima :results verbatim :batch batch :cmdline --quiet +(assume(z>0), +integrate(exp(-t)*t^z, t, 0, inf)); +#+end_src") + (should (equal (org-babel-execute-src-block) + "(%i1) (assume(z > 0),integrate(exp(-t)*t^z,t,0,inf))\n(%o1) gamma(z + 1)"))))) + (provide 'test-ob-maxima) ;;; test-ob-maxima.el ends here