Nov 8

Zunächst einmal: Der Begriff Spationierung wird nicht einheitlich verwendet, laut Typolexikon und meiner Erfahrung wird damit sowohl das Verändern von Wortzwischenräumen (WZR) als auch die Schriftweitenveränderung bezeichnet.

Die Schriftweite/Tracking lässt sich mit ALT + PFEIL NACH LINKS/RECHTS verändern, allerdings ist darauf zu achten zunächst in den Voreinstellungen unter Einheiten, Kerning den Wert 1 einzutragen.

Im deutschen Schriftsatz ist das eigentlich nicht erwünscht – seit dem Einzug von DTP allerdings ziemlich weit verbreitet – dort werden stattdessen die Wortzwischenräume verändert. In InDesign auch kein Problem mit den ALT + SHIFT + STRG + J wird das Menu mit den Werten für den Blocksatz aufgerufen. Der Wert für das Optimun wird entgegen der Beschriftung auch für den Rau-/Flattersatz verwendet. Die Tastenkombination für die Veränderung ist etwas unbekannter, aber auch kein Problem: WZR vegrößern STRG + ALT + ß bzw. mit STRG + ALT + BACKSPACE wieder verringern. Allerdings ist der Wert meines Wissens nicht in der Benutzeroberfläche oder via Skripting auslesbar.

In beiden Fällen gilt: Ungeduldige drücken dazu die SHIFT Taste, das ganze kann mit STRG + ALT + Q wieder aufgelöst werden.

Soweit zu den Built-in-Features, aber hier gehts ja um praktische Verbesserungen. Das folgende Skript bringt eine Zeile unter minimaler Veränderung des Wortzwischenraums ein. Das Skript orientiert sich am Minimalwert der Blocksatzeinstellugen, die je nach typografischen Gefühl des Benutzers eingestellt sein sollten.

Das Ergebnis lässt sich über die Blocksatzeinstellungen. kontrollieren, wenn es nicht gefällt einfach einmal Rückgängig ausführen.

// Der Cursor muss in einem Absatz positioniert sein:
if (app.selection[0].constructor.name == "InsertionPoint") {
    var par = app.selection[0].paragraphs[0];
    var lines = par.lines.length;
    var oldDesiredWordSpacing = par.desiredWordSpacing;
    var cDesiredWordSpacing = par.desiredWordSpacing;

    // WordSpacing solange verringern bis eine Zeile weniger
    while (par.lines.length == lines) {
        // Das etwas unübersichtliche Konzpet erlaubt danach ein
        // einmaliges STRG + Z für das Rückgängig
        cDesiredWordSpacing--;
        par.desiredWordSpacing = cDesiredWordSpacing;
        if (par.lines.length == lines) {
            par.desiredWordSpacing = oldDesiredWordSpacing;
        }
        // Das Skript orientiert sich am minimumWordSpacing
        // Wert aus den Blocksatzeinstellungen.
        // Falls der Minimalwert unterschritten wird,
        // wird der Originalwert wieder hergestellt.
        if (par.desiredWordSpacing == par.minimumWordSpacing)  {
            par.desiredWordSpacing = oldDesiredWordSpacing;
            exit(1);
        }
    }
    exit(0);
}

Eine interessante Möglichkeit wäre es, eine Textbereich oder Textrahmen auszuwählen, und dort das Skript den Absatz finden zu lassen der den geringsten Eingriff benötigt.

Die Idee für das Skript basiert auf einer Forumsdiskussion. Das Ergebnis dort war ein Skript von Teus de Jong welches die Spationieurng verringert. Im Download habe ich ein Skript mit beiden Optionen.


Okt 4

Eine meiner Lieblingsneuerungen bei InDesign CS3 war die Möglichkeit mit Hilfe von Regulären Ausdrücken Suche/Ersetze-Vorgänge durchzuführen. Hier soll es aber nicht um die erweiterten Möglichkeiten der GREP-Funktion gehen.
Oftmals egibt sich in der Praxis die Anforderung, zunächst bestimmte Stellen in einem Dokument zu finden, diese dann allerdings nicht einfach zu ersetzen, sondern vorher nach bestimmten Regeln zu bearbeiten.
Dazu habe ich ein recht übersichtliches FindAndDo-Script geschrieben, in dem dann nur noch die Suchbedingung und die Verarbeitungsanweisung eingetragen werden muss.
Ein nicht zu vernachlässigender Punkt ist die rückwärts laufende For-Schleife: Wenn auf der Trefferliste Ersetzungen vorgenommen werden die eine veränderte Anzahl an Zeichen aufweisen, ändert sich der Index des Elternelements auf dem gesucht wurde. Die Folge ist, dass die darauf folgenden Ersetzungen an falschen Stellen ausgeführt werden (dem ursprünglichen Index).
Vielleicht mal das letzte Beispiel aus der Praxis damit es klarer wird: Alle Seitenverweise in einem Dokument waren vom Verlag per Hand aufgelöst worden, nun verschob sich der Umbruch ab Seite 106 um vier Seiten. Mit der normalen Suchfunktion hätte das bedeutet, alle Seitenverweise von Hand durchzugehen und je nach Postion zu verädern oder zu ignorieren. Bei 500 Verweisen wäre das ganze recht zeitaufwändig geworden, das Skript sieht dann so aus:

    // Zunächst alte Suchoptionen löschen, ich verwende hier die Grep Suche
    app.changeGrepPreferences = NothingEnum.nothing;
    app.findGrepPreferences = NothingEnum.nothing;
    // Nach Seitenverweisen des Typs (S. 99) suchen
    app.findGrepPreferences.findWhat = "\\(S..([0-9]+?)\\)";
    var erg = app.activeDocument.findGrep ();	

    for (var i = erg.length - 1; i >= 0; i--) {
        // Die Seitenzahl extrahieren
        var string = erg[i].contents.match (/[0-9]+/) ;
        // Wenn die Seitenzahl größer 106 ist wird sie erhöht
        if (parseInt(string) >= 106 ) {
            string = (parseInt(string) + 4);
        }
        erg[i].contents = "(S. " +  string + ")";
    }

PS: Die Seitenauflösung von Hand wäre auch überflüssig gewesen, wenn der Workflow von Anfang an sinnvoll geplant gewesen wäre …
PPS: Bei der Übergabe von Grep Suchanfragen müssen die Javascript String Konventionen beachtet werden, d.h. im besonderen die Forward-Slashes und Quotes müssen mit dem Forward-Slashe escaped werden (z.B. //). Ich empfehle im DEBUG Modus die Übergabe an das Suchfeld zu testen.