Sage, LaTeX und ihre Freunde

Sage und der TeX-Dialekt LaTeX haben eine sehr synergetische Beziehung. Dieses Kapitel hat das Ziel die Vielfalt an Interaktionen, von den einfachsten bis hin zu den ungewöhnlichen und fast schon magischen, vorzustellen. (Sie sollten also nicht gleich das ganze Kapitel im ersten Durchgang durch das Tutorial lesen.)

Überblick

Es ist wahrscheinlich am einfachsten die verschiedenen Einsatzmöglichkeiten von LaTeX zu verstehen, wenn man sich die drei grundsätzlichen Methoden in Sage ansieht.

  1. Jedes Objekt in Sage muss eine LaTeX Darstellung haben. Sie können diese Darstellung erreichen, indem Sie im Notebook oder der Kommandozeile latex(foo) ausführen, wobei foo ein Objekt in Sage ist. Die Ausgabe ist eine Zeichenkette, die eine recht genaue Darstellung im mathematischen Modus von TeX bietet (z.B. zwischen jeweils zwei Dollarzeichen). Einige Beispiele hierfür folgen unten.

    So kann Sage effektiv genutzt werden um Teile eines LaTeX-Dokuments zu erstellen: Erstellen oder berechnen Sie ein Objekt in Sage, drucken Sie es mit dem latex()-Befehl aus und fügen Sie es in Ihr Dokument ein.

  2. Die Notebook Schnittstelle ist konfiguriert MathJax zu nutzen um mathematische Ausdrücke im Browser darzustellen. MathJax ist eine Kollektion aus JavaScript-Routinen und zugehörigen Schriftarten. Es ist also nichts zusätzlich einzustellen um mathematische Ausdrücke in Ihrem Browser anzuzeigen, wenn Sie das Sage-Notebook nutzen.

    MathJax wurde entwickelt um einen großen, aber nicht vollständigen Teil von TeX darstellen zu können. Es gibt keine Unterstützung für Dinge, wie komplizierte Tabellen, Kapiteleinteilung oder Dokument Management, da es für genaues Darstellen von TeX Ausdrücken konzipiert wurde. Die nahtlose Darstellung von mathematischen Ausdrücken im Sage Notebook wird durch Konvertierung der latex()-Darstellung in MathJax gewährleistet.

    Da MathJax seine eigenen skalierbaren Schriftarten nutzt, ist es anderen Methoden überlegen, die auf Konvertierung in kleine Bilder beruhen.

  3. Sollte in der Sage Kommandozeile oder im Notebook mehr LaTeX-Code vorkommen als MathJax verarbeiten kann, kann eine systemweite Installation von LaTeX aushelfen. Sage beinhaltet fast alles, das Sie brauchen um Sage weiter zu entwickeln und zu nutzen. Eine Ausnahme hierzu ist TeX selbst. In diesen Situationen müssen also TeX und verschiedene Konverter installiert sein, um alle Möglichkeiten nutzen zu können.

Hier führen wir einige grundlegenden Funktionen von latex() vor.

sage: var('z')
z
sage: latex(z^12)
z^{12}
sage: latex(integrate(z^4, z))
\frac{1}{5} \, z^{5}
sage: latex('a string')
\text{\texttt{a{ }string}}
sage: latex(QQ)
\Bold{Q}
sage: latex(matrix(QQ, 2, 3, [[2,4,6],[-1,-1,-1]]))
\left(\begin{array}{rrr}
2 & 4 & 6 \\
-1 & -1 & -1
\end{array}\right)

Grundlegende MathJax Funktionen gibt es im Notebook weitgehend automatisch, aber wir können es teilweise mit Hilfe der MathJax Klasse demonstrieren. Die eval Funktion dieser Klasse konvertiert ein Sage-Objekt in seine LaTeX-Darstellung und dann in HTML mit der CSS math Klasse, die dann MathJax verwendet.

sage: from sage.misc.html import MathJax
sage: mj = MathJax()
sage: var('z')
z
sage: mj(z^12)
<html>\[\newcommand{\Bold}[1]{\mathbf{#1}}z^{12}\]</html>
sage: mj(QQ)
<html>\[\newcommand{\Bold}[1]{\mathbf{#1}}\Bold{Q}\]</html>
sage: mj(ZZ['x'])
<html>\[\newcommand{\Bold}[1]{\mathbf{#1}}\Bold{Z}[x]\]</html>
sage: mj(integrate(z^4, z))
<html>\[\newcommand{\Bold}[1]{\mathbf{#1}}\frac{1}{5} \, z^{5}\]</html>

Grundlegende Nutzung

Wie schon im Überblick angekündigt, ist der einfachste Weg Sage’s LaTeX-Unterstützung zu nutzen die latex() Funktion um eine legitime LaTeX-Darstellung eines mathematischen Objekts zu erhalten. Diese Zeichenketten können dann in unabhängigen LaTeX-Dokumenten genutzt werden. Das funktioniert im Notebook genauso wie in der Sage-Kommandozeile.

Das andere Extrem ist der view()-Befehl. In der Sage-Kommandozeile wird der Befehl view() die LaTeX-Darstellung von foo in ein einfaches LaTeX Dokument packen, und dann dieses mit der systemweiten TeX-Installation aufrufen. Zuletzt wird das passende Programm zum Anzeigen der Ausgabe von TeX aufgerufen. Welche Version von TeX genutzt wird, und damit auch wie die Ausgabe aussieht und welches Anzeigeprogramm aufgerufen wird, kann angepasst werden (siehe Anpassen der LaTeX-Verarbeitung).

Im Notebook schafft der view(foo) Befehl die nötige Kombination von HTML und CSS sodass MathJax die LaTeX Darstellung im Arbeitsblatt anzeigt. Für den Anwender erstellt er einfach eine schön formatierte Ausgabe, die sich von der normalen ASCII Ausgabe aus Sage unterscheidet. Nicht jedes mathematische Objekt in Sage hat eine LaTeX-Darstellung, die die eingeschränkten Möglichkeiten von MathJax unterstützt. In diesen Fällen kann die MathJax Darstellung umgangen werden, und stattdessen die systemweite TeX-Installation aufgerufen werden. Dessen Ausgabe kann dann als Bild im Arbeitsblatt angezeigt werden. Die Einstellungen und Auswirkungen dieses Prozesses wird im Kapitel Anpassen der LaTeX-Generierung dargestellt.

Der interne pretty_print() Befehl zeigt die Konvertierung von Sage Objekten in HTML Code der MathJax nutzt im Notebook.

sage: pretty_print(x^12)
x^12
sage: pretty_print(integrate(sin(x), x))
-cos(x)

Das Notebook hat zwei weitere Möglichkeiten TeX zu nutzen. Die erste ist der „Typeset“-Knopf über der ersten Zelle eines Arbeitsblatts, rechts von den vier Drop-Down-Boxen. Ist er ausgewählt werden die Ausgaben aller folgenden Berechnungen von MathJax interpretiert. Beachten Sie, dass dieser Befehl nicht rückwirkend ist – alle vorher berechneten Zellen werden nicht neu berechnet. Im Grunde ist der „Typeset“-Knopf gleichzusetzen mit dem Aufruf des view()-Befehls in allen Zellen.

Die zweite Möglichkeit im Notebook ist das Eingeben von TeX Kommentaren in einem Arbeitsblatt. Wenn der Cursor zwischen zwei Zellen steht, und der erscheinende blaue Balken mit gedrückter Shift Taste geklickt wird, wird ein kleiner Texteditor TinyMCE geöffnet. Dieser erlaubt die Eingabe von HTML und CSS formatiertem Text mit einem WYSIWYG-Editor. Es ist also möglich den so formatierten Text als Kommentar in einem Arbeitsblatt unterzubringen. Text den Sie hier zwischen $...$ oder $$...$$ eingeben wird ebenfalls von MathJax in einer „inline“ bzw. „display math“ Umgebung gesetzt.

Anpassen der LaTeX-Generierung

Es gibt verschiedene Arten den vom latex()-Befehl generierten LaTeX-Code anzupassen. Im Notebook und der Sage Kommandozeile gibt es ein vordefiniertes Objekt Namens latex, das verschiedene Methoden hat, die Sie sich auflisten lassen können indem Sie latex. eingeben und die Tab Taste drücken (beachten Sie den Punkt).

Ein gutes Beispiel ist die latex.matrix_delimiters Methode. Es kann benutzt werden um die Darstellung der Matrizen zu beeinflussen – runde Klammern, eckige Klammern, geschwungene Klammern oder senkrechte Striche. Sie müssen sich nicht für eine Darstellung entscheiden, Sie können verschiedene miteinander kombinieren, wie Sie es wünschen. Beachten Sie dass die in LaTeX benötigten Backslashes einen zusätzlichen Slash benötigen damit sie in Python korrekt erkannt werden.

sage: A = matrix(ZZ, 2, 2, range(4))
sage: latex(A)
\left(\begin{array}{rr}
0 & 1 \\
2 & 3
\end{array}\right)
sage: latex.matrix_delimiters(left='[', right=']')
sage: latex(A)
\left[\begin{array}{rr}
0 & 1 \\
2 & 3
\end{array}\right]
sage: latex.matrix_delimiters(left='\\{', right='\\}')
sage: latex(A)
\left\{\begin{array}{rr}
0 & 1 \\
2 & 3
\end{array}\right\}

Die latex.vector_delimiters Methode funktioniert ähnlich.

Die Darstellung von Ringen und Körpern (ganze, rationale, reelle Zahlen, etc.) kann mit der latex.blackboard_bold Methode verändert werden. Diese Mengen werden in standardmäßig in fett gedruckt, alternativ können sie auch mit Doppelstrichen geschrieben werden. Hierfür wird das \Bold{}-Makro genutzt, das in Sage integriert ist.

sage: latex(QQ)
\Bold{Q}
sage: from sage.misc.html import MathJax
sage: mj=MathJax()
sage: mj(QQ)
<html>\[\newcommand{\Bold}[1]{\mathbf{#1}}\Bold{Q}\]</html>
sage: latex.blackboard_bold(True)
sage: mj(QQ)
<html>\[\newcommand{\Bold}[1]{\mathbb{#1}}\Bold{Q}\]</html>
sage: latex.blackboard_bold(False)

Dank der Erweiterbarkeit von TeX können Sie selbst Makros und Pakete einbinden. Individuelle Makros können hinzugefügt werden, die dann von MathJax als TeX-Schnipsel interpretiert werden.

sage: latex.extra_macros()
''
sage: latex.add_macro("\\newcommand{\\foo}{bar}")
sage: latex.extra_macros()
'\\newcommand{\\foo}{bar}'
sage: var('x y')
(x, y)
sage: latex(x+y)
x + y
sage: from sage.misc.html import MathJax
sage: mj=MathJax()
sage: mj(x+y)
<html>\[\newcommand{\Bold}[1]{\mathbf{#1}}\newcommand{\foo}{bar}x + y\]</html>

Zusätzliche Makros, die so hinzugefügt wurden, werden auch vom systemweiten TeX genutzt, wenn MathJax an seine Grenzen gestoßen ist. Der Befehl latex_extra_preamble kann genutzt werden um eine Präambel eines kompletten LaTeX Dokuments zu erzeugen, das folgende Beispiel zeigt wie. Beachten Sie wiederrum die doppelten Backslashes in den Python Zeichenketten.

sage: latex.extra_macros('')
sage: latex.extra_preamble('')
sage: from sage.misc.latex import latex_extra_preamble
sage: print(latex_extra_preamble())
\newcommand{\ZZ}{\Bold{Z}}
...
\newcommand{\Bold}[1]{\mathbf{#1}}
sage: latex.add_macro("\\newcommand{\\foo}{bar}")
sage: print(latex_extra_preamble())
\newcommand{\ZZ}{\Bold{Z}}
...
\newcommand{\Bold}[1]{\mathbf{#1}}
\newcommand{\foo}{bar}

Für größere oder kompliziertere LaTeX-Ausdrücke können mit latex.add_to_preamble Pakete (oder ähnliches) zur LaTeX-Präambel hinzugefügt werden. Der zweite Befehl latex.add_package_to_preamble_if_available prüft hingegen erst ob das Paket vorhanden ist, bevor es eingebunden wird.

Hier fügen wir das geometry-Paket zur Präambel hinzu, um die Seitenränder einzustellen. Achten Sie wieder auf die doppelten Backslashes in Python.

sage: from sage.misc.latex import latex_extra_preamble
sage: latex.extra_macros('')
sage: latex.extra_preamble('')
sage: latex.add_to_preamble('\\usepackage{geometry}')
sage: latex.add_to_preamble('\\geometry{letterpaper,total={8in,10in}}')
sage: latex.extra_preamble()
'\\usepackage{geometry}\\geometry{letterpaper,total={8in,10in}}'
sage: print(latex_extra_preamble())
\usepackage{geometry}\geometry{letterpaper,total={8in,10in}}
\newcommand{\ZZ}{\Bold{Z}}
...
\newcommand{\Bold}[1]{\mathbf{#1}}

Ein bestimmtes Paket, dessen Existenz nicht sicher ist, wird wie folgt eingebunden.

sage: latex.extra_preamble('')
sage: latex.extra_preamble()
''
sage: latex.add_to_preamble('\\usepackage{foo-bar-unchecked}')
sage: latex.extra_preamble()
'\\usepackage{foo-bar-unchecked}'
sage: latex.add_package_to_preamble_if_available('foo-bar-checked')
sage: latex.extra_preamble()
'\\usepackage{foo-bar-unchecked}'

Anpassen der LaTeX-Verarbeitung

Es ist möglich zu entscheiden welche Variante von TeX für einen systemweiten Aufruf genutzt werden soll, und somit auch wie die Ausgabe aussehen soll. Ebenso ist es möglich zu beeinflussen, ob das Notebook MathJax oder die systemweite LaTeX Installation nutzt.

Der Befehl latex.engine() entscheidet, ob die systemweiten Anwendungen latex, pdflatex oder xelatex genutzt werden für kompliziertere LaTeX-Ausdrücke. Wenn view() in der Sage Kommandozeile aufgerufen wird, und latex als Prozessor eingestellt ist, wird eine .dvi Datei erzeugt, die dann mit einem dvi Anzeigeprogramm (wie xdvi) angezeigt wird. Im Gegensatz hierzu wird bei Aufruf von view() mit dem Prozessor pdflatex eine .PDF Datei erzeugt, die mit dem Standard-PDF-Programm angezeigt wird. (acrobat, okular, evince, etc.).

Im Notebook kann es nötig sein, dem System die Entscheidung abzunehmen, ob MathJax für einige TeX-Schnipsel, oder das systemweite LaTeX für kompliziertere Ausdrücke genutzt werden soll. Es gibt eine Liste von Befehlen, die wenn einer von ihnen in einem Stück LaTeX-Code erkannt wird, die Ausgabe von LaTeX (oder welcher Prozessor auch immer durch latex.engine() gesetzt ist) statt von MathJax erstellen lässt. Diese Liste wird verwaltet durch die Befehle latex.add_to_mathjax_avoid_list und latex.mathjax_avoid_list.

sage: latex.mathjax_avoid_list([])  # not tested
sage: latex.mathjax_avoid_list()    # not tested
[]
sage: latex.mathjax_avoid_list(['foo', 'bar'])  # not tested
sage: latex.mathjax_avoid_list()                # not tested
['foo', 'bar']
sage: latex.add_to_mathjax_avoid_list('tikzpicture')  # not tested
sage: latex.mathjax_avoid_list()                      # not tested
['foo', 'bar', 'tikzpicture']
sage: latex.mathjax_avoid_list([])  # not tested
sage: latex.mathjax_avoid_list()    # not tested
[]

Nehmen wir an ein LaTeX-Ausdruck wurde im Notebook durch view() oder während aktiviertem „Typeset“ Knopf erzeugt. Und dann wird festgestellt, dass er die externe LaTeX-Installation benötigt, weil er in der mathjax_avoid_list steht. Der Ausdruck wird nun vom ausgewählten (durch latex.engine()) Prozessor erzeugt, und statt der Anzeige in einem externen Programm (was in der Kommandozeile passieren würde) wird Sage versuchen das Ergebnis in einem einzigen, leicht beschnittenen Bild in der Ausgabezelle darzustellen.

Wie diese Umwandlung abläuft hängt von einigen Faktoren ab, hauptsächlich vom verwendeten LaTeX-Prozessor und davon welche Konvertierungswerkzeuge auf dem System vorhanden sind. Vier nützliche Konverter, die alle Eventualitäten abdecken sind dvips, ps2pdf, dvipng und aus dem ImageMagick Paket, convert. Das Ziel ist die Erzeugung einer .png Datei, die später wieder im Arbeitsblatt eingebunden werden kann. Wenn ein LaTeX-Ausdruck erfolgreich von latex in eine .dvi Datei verwandelt wird, dann sollte dvipng die Umwandlung vornehmen. Wenn der LaTeX Ausdruck und der gewählte LaTeX-Prozessor eine .dvi Datei mit Erweiterungen erstellt, die dvipng nicht unterstützt, so wird dvips eine PostScript-Datei erzeugen. So eine PostScript-Datei, oder eine .pdf Datei aus dem Prozessor pdflatex, wird dann von convert in eine .png Datei gewandelt. Das Vorhandensein von zweier solcher Konverter kann mit Hilfe der have_dvipng() und have_convert() Routinen überprüft werden.

Diese Umwandlungen werden automatisch ausgeführt, wenn Sie die nötigen Konverter installiert haben; falls nicht wird Ihnen eine Fehlermeldung angezeigt, die Ihnen sagt was fehlt und wo Sie es herunterladen können.

Für ein konkretes Beispiel wie komplizierte LaTeX-Ausdrücke verarbeitet werden können, sehen Sie sich das Beispiel des tkz-graph Pakets zum Erstellen von hochwertigen kombinatorischen Graphen im nächsten Abschnitt (Ein Beispiel: Kombinatorische Graphen mit tkz-graph) an. Für weitere Beispiele gibt es einige vorgepackte Testfälle. Um diese zu nutzen, müssen Sie das sage.misc.latex.latex_examples Objekt importieren. Dieses ist eine Instanz der sage.misc.latex.LatexExamples Klasse, wie unten beschrieben. Diese Klasse enthält momentan Beispiele von kommutativen Diagrammen, kombinatorischen Graphen, Knotentheorie und Beispiele für Graphen mit pstricks. Es werden damit die folgenden Pakete getestet: xy, tkz-graph, xypic, pstricks. Nach dem Import können Sie mittels Tab-Vervollständigung von latex_examples die vorgepackten Beispiele sehen. Bei Aufruf vom jedem Beispiel erhalten Sie eine Erklärung was nötig ist, damit das Beispiel korrekt dargestellt wird. Um die Darstellung tatsächlich zu sehen müssen Sie view() benutzen (sofern die Präambel, der LaTeX-Prozessor, etc richtig eingestellt sind).

sage: from sage.misc.latex import latex_examples
sage: latex_examples.diagram()
LaTeX example for testing display of a commutative diagram produced
by xypic.

To use, try to view this object -- it will not work.  Now try
'latex.add_to_preamble("\\usepackage[matrix,arrow,curve,cmtip]{xy}")',
and try viewing again. You should get a picture (a part of the diagram arising
from a filtered chain complex).

Ein Beispiel: Kombinatorische Graphen mit tkz-graph

Hochwertige Darstellungen von kombinatorischen Graphen (fortan nur noch „Graphen“) sind mit Hilfe des tkz-graph Pakets möglich. Dieses Paket wurde ausbauend auf das tikz front-end der pgf Bibliothek entwickelt. Es müssen also all diese Komponenten Teil der systemweiten TeX-Installation sein, und es ist möglich, dass sie nicht in ihrer neusten Version in der TeX-Implementation vorliegen. Es ist also unter Umständen nötig oder ratsam diese Teile separat in Ihrem persönlichen texmf Baum zu installieren. Das Erstellen, Anpassen und Warten einer systemweiten oder persönlichen TeX-Installation würde allerdings den Rahmen dieses Dokuments sprengen. Es sollte aber einfach sein Anleitungen hierzu zu finden. Die nötigen Dateien sind unter Eine vollfunktionsfähige TeX-Installation aufgeführt.

Um also zu beginnen, müssen wir sicher sein, dass die relevanten Pakete eingefügt werden, indem wir sie in die Präambel des LaTeX-Dokuments hinzufügen. Die Bilder der Graphen werden nicht korrekt formatiert sein, wenn eine .dvi Datei als Zwischenergebnis erzeugt wird. Es ist also ratsam, den LaTeX-Prozessor auf pdflatex zu stellen. Nun sollte ein Befehl wie view(graphs.CompleteGraph(4)) in der Sage-Kommandozeile erfolgreich eine .pdf Datei mit einem Bild vom kompletten \(K_4\) Graphen erzeugen.

Um das Gleiche im Notebook zu erstellen, müssen Sie MathJax für die Verarbeitung von LaTeX-Code ausschalten, indem Sie die „mathjax avoid list“ benutzen. Graphen werden in einer tikzpicture Umgebung eingebunden, das ist also eine gute Wahl für die Zeichenkette für die Ausschlussliste. Jetzt sollte view(graphs.CompleteGraph(4)) in einem Arbeitsblatt eine .pdf Datei mit pdflatex erstellen, mit dem convert Werkzeug eine .png Grafik erstellen und in die Ausgabezelle des Arbeitsblatts einfügen. Die folgenden Befehle veranschaulichen die Schritte einen Graphen mittels LaTeX in einem Notebook darzustellen.

sage: from sage.graphs.graph_latex import setup_latex_preamble
sage: setup_latex_preamble()
sage: latex.extra_preamble() # random - depends on system's TeX installation
'\\usepackage{tikz}\n\\usepackage{tkz-graph}\n\\usepackage{tkz-berge}\n'
sage: latex.engine('pdflatex')
sage: latex.add_to_mathjax_avoid_list('tikzpicture')  # not tested
sage: latex.mathjax_avoid_list()                      # not tested
['tikz', 'tikzpicture']

Beachten Sie, dass es eine Vielzahl von Optionen gibt, die die Darstellung des Graphen in LaTeX mit tkz-graph beeinflussen. Auch das wiederrum ist nicht Ziel dieses Abschnitts. Sehen Sie sich hierfür den Abschnitt „LaTeX-Optionen für Graphen“ aus dem Handbuch für weitere Anleitungen und Details an.

Eine vollfunktionsfähige TeX-Installation

Viele der erweiterten Integrationsmöglichkeiten von TeX in Sage benötigen eine systemweite Installation von TeX. Viele Linuxdistributionen bieten bereits TeX-Pakete basierend auf TeX-live, für OSX gibt es TeXshop und für Windows MikTeX. Das convert Werkzeug ist Teil der ImageMagick Suite (welche ein Paket oder zumindest ein simpler Download sein sollte). Die drei Programme dvipng, ps2pdf, und dvips sind wahrscheinlich bereits Teil Ihrer TeX Distribution. Die ersten beiden sollten auch von http://sourceforge.net/projects/dvipng/ als Teil von Ghostscript bezogen werden können.

Um kombinatorische Graphen darstellen zu können, benötigt man eine aktuelle Version der PGF-Bibliothek, die Datei tkz-graph.sty (verfügbar unter https://www.ctan.org/pkg/tkz-graph), die Datei tkz-arith.sty und vielleicht auch tkz-berge.sty, beide verfügbar auf der Seite https://www.ctan.org/pkg/tkz-berge.

Externe Programme

Es sind drei Programme verfügbar um TeX weiter in Sage zu integrieren. Das erste ist sagetex. Eine kurze Beschreibung von sagetex wäre: Es ist eine Sammlung von TeX-Makros, die es einem LaTeX-Dokument erlauben Anweisungen einzubinden, mit denen Sage genutzt wird um verschiedene Objekte zu berechnen und/oder mittels eingebauter latex()-Funktion darzustellen. Als Zwischenschritt zum Kompilieren eines LaTeX-Dokuments werden also alle Berechnungs- oder LaTeX-Formatierungseigenschaften von Sage automatisch genutzt. Als Beispiel hierfür kann in einer mathematischen Betrachtung die korrekte Reihenfolge von Fragen und Antworten beibehalten werden, indem sagetex dazu genutzt wird Sage die einen aus den anderen berechnen zu lassen. Siehe hierfür auch SageTeX nutzen