Freie Software in der Schule: LaTeX und Xournal++ im Mathe-Unterricht, Teil 2

  Roland Lötscher   Lesezeit: 12 Minuten  🗪 2 Kommentare Auf Mastodon ansehen

In diesem zweiten Teil zu LaTeX und Xournal++ wird aufgezeigt, wie mit Hilfe des integrierten LaTeX-Tools und dem Plugin-System die Grundfunktionalität von Xournal++ erweitert werden kann.

freie software in der schule: latex und xournal++ im mathe-unterricht, teil 2

Im ersten Teil dieser zweiteiligen Serie wurde die freie Software Xournal++ für den Einsatz im Mathe-Unterricht sowie LaTeX für das Verfassen von Unterrichtsmaterialien in der Vorbereitung präsentiert. In diesem Teil soll es um fortgeschrittenere Funktionalität von Xournal++ gehen, im Speziellen um Plugins und das eingebaute LaTeX-Tool.

LaTeX-Tool

In Xournal++ lassen sich nicht nur (mit LaTeX oder andersweitig verfasste) PDFs handschriftlich annotieren. LaTeX Formeln lassen sich auch direkt mit dem integrierten LaTeX-Tool erzeugen und ins Dokument einfügen. Im folgenden Bild wird etwa ein bestimmtes Integral als LaTeX-Formel erstellt.

Bei Bestätigung mittels des "Ok"-Knopfs wird die Formel ins Xournal++ Dokument (in der Mitte des aktuell angezeigten Seitenabschnitts) eingefügt, was dann z.B. so aussieht:

Soll die LaTeX-Formel später angepasst werden, so genügt ein Doppelklick auf die ausgewählte Formel, um den Editor erneut zu öffnen.

Der dargestellte Editor des LaTeX-Tools besitzt eine Live-Vorschau, ein Textfeld zur Eingabe der LaTeX-Formel, sowie eine Befehlsausgabe, welche darstellt, was der LaTeX-Erzeuger (standardmässig pdflatex) bei der Erzeugung des Bildes ausgegeben hat. Gibt es also irgendwelche syntaktischen Fehler in der Formel, so lassen sich diese oftmals an der Befehlsausgabe erkennen. In der Beispielausgabe unten habe ich z.B. eine extra geschweifte Klammer bei der oberen Integrationsgrenze eingefügt, welche nicht durch eine entsprechende schliessende Klammer komplettiert wurde:

Das Textfeld zur Eingabe der LaTeX-Formel verfügt über optionale Syntax-Hervorhebung, Zeilennummern, automatische Einrückung, Textumbruch bei langen Zeilen, sowie wählbare Schriftart und Schriftgrösse und Farbthema. Ausserdem lässt sich die Grösse des Editor-Fensters sowie die Grössen-Aufteilung zwischen Live-Vorschau und Textfeld durch Ziehen mit der Maus anpassen.

Nun mag der Lesende einwenden, dass sich LaTeX-Formeln ja genauso gut per Hand schreiben lassen. Das stimmt natürlich für einfache Formeln wie die obige. Jedoch ist LaTeX sehr mächtig und kann auch benutzt werden, um komplexere Objekte zu erstellen wie etwa ein Diagramm irgendwelcher Art. Ich verwende das LaTeX-Tool gelegentlich um Funktionsgraphen einzufügen:

Wer sich nun wundert, wie LaTeX aus dem Befehl \graph{x^2} den Graphen der Funktion x^2 darstellen soll, der sei an die Möglichkeit erinnert, in LaTeX Befehle (wie eben \graph) zu definieren:

\newcommandx{\graph}[3][1=,2=]{
    \begin{tikzpicture}
    \begin{axis}[xlabel=$x$,ylabel=$y$, axis lines=center,samples=100, #2]
    \addplot[#1]{ #3 };
    \end{axis}
    \end{tikzpicture}
}

Diese Formel erlaubt auch die Anpassung des Koordinatensystems und des Plots. So würde z.B.

\graph[domain=-2:2][x=1cm,y=1cm]{x^2}

den Graphen im Intervall [-2, 2] und mit Achsenskalarierung 1 Einheit = 1cm darstellen. In einem LaTeX-Dokument werden Befehle in die Preambel des Dokuments geschrieben. Das vollständige LaTeX-Dokument wird in Xournal++ aus der eingegebenen Formel sowie einer konfigurierbaren LaTeX-Vorlage zusammengestellt. In dieser LaTeX-Vorlage lassen sich nicht nur Befehle wie den obigen \graph Befehl definieren, es lassen sich auch Pakete einbinden, welche für die eigenen Zwecke benötigt werden. Im Beispiel der Funktionsgraphen braucht es z.B. die Pakete tikz, pgfplots und xargs. Wer Genaueres darüber lesen will oder andere nette Anwendungsbeispiele sehen möchte, möge dies im Guide auf der offiziellen Xournal++ Webseite nachlesen.

Xournal++ ist im Übrigen in der Lage, eine auf dem System vorhandene LaTeX-Installation zu verwenden. Das funktioniert für native Paket-Formate, jedoch nicht für die in Sandboxen laufenden Flatpak oder Snap Pakete. Wer das Flatpak oder Snap Paket von Xournal++ einsetzt, erhält eine minimale (auf TinyTeX basierende) LaTeX-Installation mit Xournal++ mitgeliefert, welches die meisten Anwendungszwecke abdeckt. Der Benutzer muss sich dann nicht um die Installation eines LaTeX-Systems kümmern und braucht auch nicht sehr viel Speicherplatz nur um ein paar LaTeX-Formeln in Xournal++ generieren zu können.

Ein kurzer Blick zur proprietären Welt: Auch Microsoft OneNote erlaubt, wie ich erst in der Recherche rausgefunden habe, das Einfügen von LaTeX-Formeln und zwar mit Hilfe eines OneNoteGem Add-Ins. Dabei wird die LaTeX-Formel als Bild eingefügt. Die Formel lässt sich aber scheinbar nicht im Nachhinein modifizieren. Auch ist unklar, welche LaTeX-Pakete zur Verfügung stehen und ob das Einfügen auch offline funktioniert. Es gibt keine konfigurierbare Vorlage und so können auch keine Befehle definiert werden. Dafür bietet OneNote Dinge wie das automatische Lösen einer Gleichung inkl. Angabe von Lösungsschritten oder die Erzeugung von Beispielaufgaben aus einer Gleichung.

Plugins

Wer lange genug eine Software-Anwendung benutzt, wird früher oder später Funktionalität finden, die für die eigenen Zwecke nützlich erscheinen würde, aber in der Anwendung fehlt. Handelt es sich dabei um etwas eher Exotisches, ist es definitiv schwierig, die Entwickler:innen davon zu überzeugen, diese Funktionalität einzubauen. Dies trifft sowohl auf die freie wie auch auf die proprietäre Software-Welt zu. Für diesen Fall ist Erweiterbarkeit der Software durch Plugins eine gute Lösung. Xournal++ hat ein auf der Programmiersprache Lua basierendes Plugin-System, um diese Erweiterbarkeit sicherzustellen. Lua ist eine relativ einfach zu erlernende Sprache, die sehr schlank und performant ist und auch in der Gaming-Welt häufig für Skripting eingesetzt wird. Ein Plugin in Xournal++ besteht aus einer ini-Datei (namens plugin.ini), in welchem Autor, Beschreibung, Versionsnummer und der Dateiname des auszuführenden Lua-Skript aufgeführt sind und dem eigentlichen Lua-Skript, eventuell ergänzt durch zusätzliche Lua-Skripts und Ressourcen.

Die ini-Datei sieht z.B. wie folgt aus und ist einfach anzupassen:

[about]
## Author / Copyright notice
author=NAME OF THE AUTHOR

description=DESCRIPTION OF THE PLUGIN

## If the plugin is packed with Xournal++, use
## <xournalpp> then it gets the same version number
version=<xournalpp>

[default]
enabled=false

[plugin]
mainfile=main.lua

Im obigen Beispiel wird auf das Skript mit Dateinamen main.lua verwiesen. Die Hauptarbeit besteht dann im Verfassen dieses Lua-Skripts. Das Lua-Skript muss zuerst mal festlegen, was bei Anwendungsstart passiert, sofern das Plugin (im Plugin Manager) aktiviert wurde. Es können Menu-Einträge im Plugin-Menu erstellt werden und/oder Knöpfe für die Toolbar verfügbar gemacht werden. All dies muss in einer Funktion namens initUi passieren. Ein Beispiel dafür sieht etwa wie folgt aus:

function initUi()
  app.registerUi({ menu = "Setze Zoom auf 200%", callback = "zoom" })
  app.registerUi({ menu = "Fineliner", callback = "fine", toolbarId = "FINELINER", iconName = "document-edit" })
end

Hier werden im Plugin-Menu zwei Einträge "Setze Zoom auf 200%" und "Fineliner" hinzugefügt, welche bei Aktivierung die (noch zu verfassenden) Callback Funktionen namens "zoom" bzw "fine" aufrufen. Für den "Fineliner" wird ausserdem ein Knopf mit id "FINELINER" und Icon "document-edit" für die Werkzeugleisten zur Verfügung gestellt. Xournal++ verfügt über verschiedene (konfigurierbare) Werkzeugleisten und der Knopf kann dann (über Menu Bearbeiten > Werkzeugsleisten > Anpassen) jeder Werkzeugleiste an passender Stelle hinzugefügt werden. Es können an dieser Stelle auch Tastenkombinationen für die Aktivierung definiert werden durch Hinzufügung von z.B. accelerator = "<Alt><Shift>z" in der entsprechenden Code-Zeile.

Nun müssen die Callback-Funktionen programmiert werden. In den Callback-Funktionen kann beliebiger Lua-Code mit von Xournal++ bereitgestellten Funktionen kombiniert werden. Letztere beginnen mit app. wie etwa app.uiAction oder app.setZoom

Im Beispiel können wir etwa schreiben:

function zoom()
  app.setZoom(2)
end

function fine()
  app.uiAction({ action = "ACTION_TOOL_PEN" })  
  app.uiAction({ action = "ACTION_TOOL_PEN_SIZE_FINE" 
  black = 0x000000
  app.changeToolColor({ color = black,  selection = false })  
end

Die Datei main.lua besteht nun einfach aus den beiden Codeblöcken oben.

Das Plugin bestehend aus ini-Datei plugin.ini und Lua-Skript main.lua wird nun in einen Ordner innerhalb des config-Ordners von Xournal++ abgelegt. Nennen wir diesen Ordner MyPlugin so wäre der absolute Pfad

  • unter Linux (natives Paket): /home/<user>/.config/xournalpp/MyPlugin
  • unter Windows: C:\Users\<user>\AppData\Local\xournalpp\MyPlugin
  • unter MacOS: /Users/<user>/.config/xournalpp/MyPlugin

Nun müssen wir bloss noch das Plugin im Plugin-Manager (Menu Plugin > Plugin-Manager) aktivieren und schon kann ab dem nächsten Start von Xournal++ das Plugin verwendet werden. Um auch den Knopf in der Werkzeugleiste zu erhalten, muss noch zusätzlich die Werkzeugleiste konfiguriert werden. Das geschieht in Menu Bearbeiten > Werkzeugsleisten > Anpassen durch Drag&Drop des entsprechenden Symbols im unten dargestellten Dialog.

In Xournal++ erscheinen nun sowohl der Werzeugleisten-Knopf (blaues Stift-Symbol) wie auch die Menu-Einträge:

Für diesen Artikel habe ich speziell einfache Funktionalität für das Plugin ausgewählt. Das "Fineliner" Beispiel ist aber auch von praktischer Relevanz, denn so könnte man sich eine Auswahl an Lieblingsstiften zusammenstellen, zwischen denen per Knopfdruck (oder Tastenkombination) gewechselt werden kann.

Wer selber mal ein Xournal++ Plugin programmieren möchte, findet auf der offiziellen Webseite weiterführende Informationen. Insbesondere sind da auch die von Xournal++ bereitgestellten Lua-Funktionen aufgeführt.

Quellen:

Tags

Unterricht, FediLZ, xournalpp, latex, lua, plugin

Robert
Geschrieben von Robert am 16. Oktober 2024 um 16:28

Sehr interessant! Wie schaffst du es die Formel nachträglich zu editieren oder zu löschen? Bei mir scheint sie als Bild eingefügt zu werden, sobald ich eine andere Aktion ausführe. Und ich habe keinen Weg gefunden, sie danach doppelt anzuklicken (dasselbe für Bilder).

Roland Lötscher
Geschrieben von Roland Lötscher am 16. Oktober 2024 um 18:11

Dazu wechsle ich zum Auswahl-Tool (Rechteck auswählen), bevor ich doppelt auf die LaTeX-Formel klicke. Bei Bildern gibt es keine Möglichkeit, das Bild im Nachhinein zu Editieren.