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 Scheme-Funktion um TeXmacs-Bäume in eine Zeichenkette als Eingabe für die Anwendung umzuformen. Eine solche Umformung hat Vorrang vor der voreingestellten Methode. Auf diese Weise können zum Beispiel mehrzeilige Eingaben in besonderer Weise behandelt werden oder TeXmacs-Bäume transformiert werden.

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
umformen in die gebräuchlichere Form ((a)/(b)) . Deshalb gibt es noch einen zweiten Weg. Man benutzt den Befehl

(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:

Transformationsregel für Blätter

Mit den beiden Zeichenketten symbol und conversion besagt die Regel

(symbol conversion)

dass das TeXmacs Symbol symbol durch die Zeichenkette conversion ersetzt werden soll.

Transformationsregeln für Tags

Mit einen Symbol tag und einer Scheme-Funktion routine, besagt die Regel

(tag routine)

dass routine anstelle von tag zu benutzen ist. Diese Scheme-Funktion sollte eine Zeichenkette an die Standard-Ausgabe schicken. Die Scheme-Funktion plugin-input kann zur rekursiven Transformation der Argumente des Tag benutzt werden.

Das input plugin

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 Scheme-Code zur Konfiguration in der Datei init-input.scm ist der folgende

(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
werden zu ((a):(b)) mit

(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 special:

<assign|special|>

Dieser Tag wird mit der speziellen Konversionsregel umgeschrieben

(define (input-input-special t)

(display "[[[SPECIAL:")

(plugin-input (car t))

(display "]]]"))

Der folgende C++ Code in input.cpp

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);

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".