Text einfügen und formatieren

(Übersetzung von »Inserting and Formatting Text« von Rick Quatro)

Über dieses Tutorial

Dieses Tutorial ist für Mark, der einmal gesagt hat: »Ich möchte ganz einfach einen Textabschnitt in das Dokument einfügen und den Text formatieren – Fettschrift, Unterstreichungen oder ein Absatz- oder Zeichen-Tag zuweisen!« Im Verlauf der folgenden Beschreibung dieses Vorgangs werden Sie einige einfache Strategien beim Schreiben von Skripts kennen lernen.

Analysieren der Aufgaben

Zunächst müssen Sie herausfinden, welche Aufgaben das Skript durchführen soll. Erstellen Sie gegebenenfalls eine Liste. In diesem Fall möchten Sie zwei Dinge tun: Text einfügen und Formatierungen zuweisen. Beginnen wir mit dem Einfügen des Texts. Der Befehl zum Einfügen von Text lautet New Text. Wenn Sie nicht sicher sind, welchen Befehl Sie benötigen, lesen Sie zunächst in der FrameScript Quick Reference nach. Sobald Sie den Befehl gefunden haben, können Sie in der Script Writer’s Reference weitere Einzelheiten nachlesen.

Wenn Sie den Befehl ermittelt haben, sehen Sie auch, welche Parameter zur Ausführung des Befehls nötig sind. An diesem Punkt ist es hilfreich, ein neues, leeres Dokument und das Skriptfenster zu öffnen, sodass Sie mit dem Befehl experimentieren können.

Einfügen von Text

Setzen Sie den Mauszeiger in das leere Dokument, geben Sie die folgende Zeile im Skriptfenster ein, und klicken Sie auf die Schaltfläche Run:

New Text 'Hallo Welt';

Sie sehen, dass für den Befehl New Text keine Parameter erforderlich sind. Wenn keine Parameter angegeben werden, fügt der Befehl den Text einfach an der Einfügemarke des aktuellen Dokuments ein (falls ein Dokument vorhanden ist). In Ihrem Skript werden Sie aber bestimmt einige Parameter verwenden müssen, besonders dann, wenn Sie den eingefügten Text formatieren möchten.

Sehen Sie sich die Parameter des Befehls New Text in der Scriptwriter’s Reference an. Sie können einen der drei Parameter verwenden (DocObject, TextLoc oder Object) um festzulegen, wo der Text eingefügt werden soll. TextLoc (Textposition) entspricht einer Einfügemarke im Dokument. Es ist eine Position in einem Absatz oder einer Textzeile. Wenn Sie eine andere Textposition als die aktuelle Einfügemarke erreichen möchten, müssen Sie wissen, wie Sie eine TextLoc-Variable zuweisen.

Sehen Sie sich den Object-Parameter des Befehls New Text an. Wenn Sie diese Option wählen, erstellt FrameScript eine Textposition mit diesem Objekt und einem Versatz von Null. Mit anderen Worten: Wenn Ihr neuer Text am Beginn eines Textobjekts eingefügt werden soll, z.B. einem Absatz (Pgf), müssen Sie nichts weiter tun, als dieses Objekt anzugeben. Im Folgenden werden beide Parameter veranschaulicht. Es liegt ganz bei Ihnen zu entscheiden, welcher der beiden Parameter für Ihr Skript besser geeignet ist.

Ihr Übungsdokument sollte mindestens drei vollständige Textabsätze enthalten. Setzen Sie den Mauszeiger in den zweiten Absatz.

Im ersten Beispiel gehen wir davon aus, dass Sie den neuen Text am Anfang des ersten Absatzes einfügen möchten. Die Position des neuen Texts bestimmen Sie mit dem Object-Parameter.

// Ermitteln des Absatzobjekts, in dem sich 
// die Einfügemarke momentan befindet: 
Set vPgf = TextSelection.Begin.Object; 
// Setzen einer Variablen für den vorherigen Absatz: 
Set vPgf = vPgf.PrevPgfInFlow; 
// Einfügen des Texts: 
New Text Object(vPgf) 'Einleitung: ';

Setzen Sie den Mauszeiger wieder in den zweiten Absatz. Nun soll das Skript etwas Text nach dem fünften Zeichen des dritten Absatzes einfügen. Da Sie nun den Parameter TextLoc verwenden, lesen Sie in der Scriptwriter’s Reference über den Befehl New TextLoc nach. Hier ist die Syntax:

New TextLoc NewVar(VarName) 
    Object(ObjectVar) Offset(Integer);

Das Skript ist dem ersten Beispiel sehr ähnlich. Es wird aber etwas zusätzlicher Code benötigt, um die TextLoc-Variable zu setzen.

// Ermitteln des Absatzobjekts, in dem sich 
// die Einfügemarke momentan befindet: 
Set vPgf = TextSelection.Begin.Object; 
// Setzen einer Variablen für den nächsten Absatz: 
Set vPgf = vPgf.NextPgfInFlow; 
// Festlegen der Textposition: 
New TextLoc NewVar(vTextLoc) 
    Object(vPgf) Offset(6); 
// Einfügen des Texts: 
New Text TextLoc(vTextLoc) ' (neuer Text) ';

Sie sehen, wie einfach das Einfügen von Text ist. Die eigentliche Schwierigkeit besteht im Setzen der korrekten Object– oder TextLoc-Variablen, damit der Text auch dort eingefügt wird, wo Sie ihn haben möchten!

Vergessen Sie nicht den dritten Parameter: DocObject. Diesen Parameter benötigen Sie, wenn Sie Text in ein Dokument einfügen möchten, das nicht das aktive Dokument ist.

Formatieren des Texts

Die nächste Aufgabe ist das Formatieren des eingefügten Texts. Um Text über FrameScript zu formatieren, müssen Sie ihm bestimmte Texteigenschaften zuweisen. Wie Sie vielleicht schon vermuten, gibt es einen Befehl Apply TextProperties (Texteigenschaften zuweisen). Lesen Sie die Beschreibung dieses Befehls in der Scriptwriter’s Reference nach. Dieser Befehl erfordert im Wesentlichen zwei Dinge: Einen Satz von Texteigenschaften, die zugewiesen werden, und einen Textbereich, dem diese Eigenschaften zugewiesen werden sollen. Wir beginnen zunächst mit dem Textbereich, denn dieser steht in engem Zusammenhang mit dem Befehl New Text, der ja noch frisch in Ihrem Gedächtnis ist.

Wenn Sie die Beschreibung zum Befehl New TextRange lesen, dann stellen Sie fest, dass ein Textbereich aus zwei TextLoc-Objekten besteht. Zur Veranschaulichung markieren Sie etwas Text in Ihrem Dokument, geben Sie Folgendes im Skriptfenster ein, und klicken Sie auf die Schaltfläche Run:

Set vTextRange = TextSelection; 
Display vTextRange;

Eine Textbereich-Variable wird angezeigt. Fügen Sie folgende Zeilen am Ende des Skripts ein und klicken Sie auf Run:

// Anzeigen der ersten TextLoc-Variablen: 
Display vTextRange.Begin; 
// Anzeigen der zweiten TextLoc-Variablen: 
Display vTextRange.End; 
// Anzeigen des Texts innerhalb des Textbereichs: 
Display vTextRange.Text;

Wenn im Dokument nur eine Einfügemarke aber keine Markierung vorhanden ist, sind die beiden TextLoc-Objekte Begin und End identisch, sodass keine Text-Eigenschaft angezeigt wird.

Kehren Sie nun zum vorherigen Beispiel zum Einfügen von Text an einer neuen Textposition zurück. Klicken Sie in Ihrem Beispieldokument in den zweiten Absatz.

Die letzte Zeile des unten stehenden Codes enthält jetzt den NewVar-Parameter, der die Endposition des neuen Texts zurückgibt.

// Ermitteln des Absatzobjekts, in dem sich 
// die Einfügemarke momentan befindet: 
Set vPgf = TextSelection.Begin.Object; 
// Setzen einer Variablen für den nächsten Absatz: 
Set vPgf = vPgf.NextPgfInFlow; 
// Festlegen der Textposition: 
New TextLoc NewVar(vTextLoc) 
    Object(vPgf) Offset(6); 
// Einfügen des Texts: 
New Text TextLoc(vTextLoc) NewVar(vEndTextLoc) 
    ' (neuer Text) ';

Das Ergebnis sind die beiden TextLoc-Variablen für den Textbereich, die Sie für das Zuweisen von Formaten benötigen. Fügen Sie folgende Zeilen am Ende des vorherigen Codes ein und führen Sie das Skript aus:

New TextRange NewVar(vTextRange) 
    Object(vPgf) Offset(vTextLoc) Offset(vEndTextLoc); 
Display vTextRange.Text;

Sie sehen nun, dass der neue Text in der vTextRange-Variablen enthalten ist. Jetzt müssen Sie lediglich noch die Formatierung zuweisen. Der Einfachheit halber weisen Sie dem Text das Zeichenformat Betonung zu. Sie benötigen den Befehl Get Object, um auf die Eigenschaften des Zeichenformats zugreifen zu können.

Ersetzen Sie die letzte Zeile aus dem oben stehenden Code wie in folgendem Code angegeben:

// Ermitteln des Absatzobjekts, in dem sich 
// die Einfügemarke momentan befindet: 
Set vPgf = TextSelection.Begin.Object; 
// Setzen einer Variablen für den nächsten Absatz: 
Set vPgf = vPgf.NextPgfInFlow; 
// Festlegen der Textposition: 
New TextLoc NewVar(vTextLoc) Object(vPgf) Offset(6); 
// Einfügen des Texts: 
New Text TextLoc(vTextLoc) NewVar(vEndTextLoc) 
    ' (neuer Text) '; 
New TextRange NewVar(vTextRange) 
    Object(vPgf) Offset(vTextLoc) Offset(vEndTextLoc);
Get Object Type(CharFmt) Name('Betonung') 
    NewVar(vCharFmt);
Apply TextProperties TextRange(vTextRange) 
    Properties(vCharFmt.Properties);

Führen Sie das Skript aus und sehen Sie sich das Ergebnis an.

Das war für den Moment alles. Fragen und Kommentare sind immer herzlich willkommen.

Februar 2008, Michael Müller-Hillebrand