Interaktive Berechnungs-Formulare mit Org-Mode und Python
Benchmark Papier und Stift
Kann man mit einem Computeralgebra-System (CAS) so übersichtlich rechnen wie mit Papier und Stift?
Ich arbeite gerne mit Jupyter Lab – das ist nahe dran, hat aber andere Stärken. Näher an der Papier-Rechnung sind
- Mathcad (proprietär und für offene Betriebssysteme nicht verfügbar)
- SMath Studio (frei aber nicht quelloffen)
- CompPad (LibreOffice Plugin, zur Zeit keine aktive Entwicklung)
Ich arbeite mit einer anderen Lösung.
Interaktiv rechnen mit Org-mode, SymPy und LaTeX
Am meisten begeistert mich Linux, weil viele verschiedene Programme perfekt zusammen arbeiten. Man kann die Open-Source Klassiker GNU Emacs, Org-mode, Sympy und LaTeX so miteinander kombinieren, als hätte man eine monolithische Anwendung vor sich.
Abbildung 1: Links die interaktive Rechnung in Emacs, rechts die LaTeX Darstellung, die auf Tastndruck aktualisiert wird.
Beispiel
Als »Hallo Welt« Beispiel berechnen wir Umfang und Fläche eines Kreises bei gegebenem Durchmesser.
Darstellung mit LaTeX
Gegeben:
\[d_{circ} = 1.250 \cdot \text{m}\]
Gleichungen:
\[C = \pi \cdot d_{circ}\]
\[A = \frac{\pi \cdot d_{circ}^{2}}{4}\]
Ergebnisse:
\[C = 3.927 \cdot \text{m}\]
\[A = 1.227 \cdot \text{m}^{2}\]
Rechnung in der Org-mode Textdatei
Gegeben:
#+BEGIN_SRC python :session :results output latex :exports results from sympy import pi from sympy.physics.units import meter d = symbols('d_{circ}') given = { d : 1.25 * meter, } prt( given ) #+END_SRC
Gleichungen:
#+BEGIN_SRC python :session :results output latex :exports results C, A = symbols('C A') expr = {} expr[C] = d * pi expr[A] = d**2 * pi / 4 prt(expr) #+END_SRC
Ergebnisse:
#+BEGIN_SRC python :session :results output latex :exports results res = {} res[C] = expr[C].subs(given).evalf() res[A] = expr[A].subs(given).evalf() prt(res) #+END_SRC
Damit der Code so funktioniert, muss im Header der Org-Mode Datei noch die oben verwendete prt
Funktion definiert werden:
#+BEGIN_SRC python :session :exports none from sympy import symbols, Symbol, latex, Float, sympify # print a dictionary that contains expressions, # floats are sympified and then formatted as defined by frmt def prt(expr_dict, frmt='{:.4G}'): for symbol in expr_dict: expr = fmt(sympify(expr_dict[symbol]), frmt) print('$$'+ \ symbol.name + ' = ' + \ latex(expr, mul_symbol ='dot', imaginary_unit='rj') + \ '$$\n' ) # apply format string to floats fmt = lambda expr, frmt: expr.xreplace( {n: Symbol(frmt.format(n)) for n in expr.atoms(Float)} ) #+END_SRC
Template und Anleitung
- ausführliche Anleitung (PDF)
- Org-Mode Template (ZIP)
Abbildung 2: Die Zip Datei enthält alle nötgen Ressourcen, um die ausführliche Anleitung zu reproduzieren oder als Basis für eigene Dokumente zu nutzen.
Flexibilität
Neben Python können auch andere Sprachen wie Octave interaktiv verwendet werden. Auch das Export Format muss nicht PDF sein.
- Liste aller unterstützten Sprachen
- Export Formate
- ASCII / Latin-1 / UTF-8
- PDF via LaTeX oder LaTeX Beamer
- HTML
- Markdown
- OpenDocument Text (ODT)