Mathematische und angepasste Eingabe |
Das TeXmacs Meta-Format ermöglicht, dass Anwendungen strukturierten Text wie z.B. mathematische Formeln an TeXmacs übergeben können. Ganz entsprechend können Sie allgemeine TeXmacs-Inhalte als Eingabe an Anwendungen schicken. Vorgabemäßig wird nur der Textinhalt an die Anwendung in Form einer Zeichenkette geschickt. Dabei werden alle ASCII-Zeichen im Bereich 0 - 31 ignoriert, außer '\t' und '\n', die als Leerstellen interpretiert werden. Es gibt zwei Methoden, um die Art und Weise, wie die Eingabe an die Anwendung geschickt wird, zu beeinflussen. Die Konfigurations-Option
(:serializer ,routine)
spezifiziert eine
Die :serialize Option ist sehr mächtig. Sie ist aber auch eine sehr abstrakte Weise der Anpassung von Eingaben in eine Anwendung. Man ist gezwungen, eine komplette Eingabe-Transformations-Funktion zu schreiben. Häufig will der Anwender aber nur kleinere Anpassungen durchführen, z.B. zwei-dimensionale mathematische Eingabe etwa der Form I
a |
b |
(plugin-input-converters myplugin
rules)
Dieser Befehl legt Eingabe–Konvertierungsregeln in Bezug auf myplugin für „mathematische Eingabe” fest. Dafür hat TeXmacs bereits vernünftig erscheinende Vorgaben. Die Regeln haben ein von zwei möglichen Formen:
Mit den beiden Zeichenketten symbol und conversion besagt die Regel
(symbol conversion)
dass das TeXmacs Symbol symbol durch die Zeichenkette conversion ersetzt werden soll.
Mit einen Symbol tag und einer
(tag routine)
dass routine anstelle von tag
zu benutzen ist. Diese
Das Beispiel input demonstriert, wie man mathematische Eingabe anpasst und verwendet. Es besteht aus den folgenden Dateien:
input/Makefile input/packages/session/input.ts input/progs/init-input.scm input/progs/input-input.scm input/src/input.cpp
Der
(plugin-configure input
(:require (url-exists-in-path?
"input.bin"))
(:initialize (input-initialize))
(:launch "input.bin")
(:session "Input"))
Hier ist input-initialize eine Initialisierungs-Routine, die auf einfache Weise neue Konversions-Routinen einführt.
(define (input-initialize)
(import-from (texmacs plugin plugin-convert))
(lazy-input-converter (input-input) input))
Mit anderen Worten, das Modul input-input.scm wird nur dann geladen, wenn wir explizit verlangen, dass eine Konversion durchgeführt werden soll. Die Konversionsregeln in input-input.scm lauten so
(plugin-input-converters input
(frac input-input-frac)
(special input-input-special)
("<vee>" "||")
("<wedge>" "&&"))
Das führt dazu, dass ∨ und ∧ zu || und && umgeschrieben werden. Brüche
a |
b |
(define (input-input-frac t)
(display "((")
(plugin-input (car t))
(display "):(")
(plugin-input (cadr t))
(display "))"))
In den zusätzlichen Stil input.ts definieren wir
ein zusätzliches Makro
<assign|special|>
Dieser Tag wird mit der speziellen Konversionsregel umgeschrieben
(define (input-input-special t)
(display "[[[SPECIAL:")
(plugin-input (car t))
(display "]]]"))
Der folgende
cout << DATA_BEGIN << "verbatim:";
cout << DATA_BEGIN << "command:(session-use-math-input #t)"
<< DATA_END;
cout << "Convert mathematical input into plain text";
cout << DATA_END;
fflush (stdout);
versetzt die Sitzung automatisch in den mathematischen Eingabe-Modus und gibt den Begrüßungstext aus. In der Hauptschleife begnügen wir uns damit, die Eingabe als Ausgabe zurückzuschicken:
char buffer[100];
cin.getline (buffer, 100, '\n');
cout << DATA_BEGIN << "verbatim:";
cout << buffer;
cout << DATA_END;
fflush (stdout);