Skript zum anlegen und zuweisen von Absatzformaten - Fragen

Hier werden Fragen und Probleme zur Anwendungsentwicklung mit InDesign diskutiert.
Antworten
Soul71
Beiträge: 4
Registriert: 22. Mär 2013, 09:43

Skript zum anlegen und zuweisen von Absatzformaten - Fragen

Beitrag von Soul71 » 22. Mär 2013, 11:13

Hallo Werner,

zu meinem Skript, welches einen ausgewählten Text (der eine Tabelle werden soll und Tabulatoren enthält) mit 3 Absatzformaten versieht, die durch das Skript erzeugt werden:
Die erste Zeile kleiner und mit Linie darunter, dann abwechselnd ohne Balken (weiß) hinterlegt, und dann mit Balken (weiß) hinterlegt.
In den Absatzformaten werden dann auch die Tabulatoren des ausgewählten Textes übernommen.

Leider konnte ich die Testdatei nicht hochladen, da beim Versuch hier im Forum folgende Fehlermeldung kommt:
Die Dateierweiterung indd ist nicht erlaubt.
Und egal, welche Dateierweiterung ich hinten anhänge, kommt diese Fehlermeldung.


Unten ist die aktuelle Version des Skriptes.
(Leider konnte ich keinen Text innerhalb dieses Codes farblich anders markieren, wie es im HilfDirSelbst-Forum geht. Sonst hätte ich die beiden veränderten Bereiche für die Tabulatoren farblich markiert.)
Der erste Bereich ist unter dem Kommentar

Code: Alles auswählen

//   Schleife (Tabulatoren des markierten Text speichern (Position und Ausrichtung))
und der zweite Bereich (Das Zuweisen der Tabulatoren steht unter dem Kommentar

Code: Alles auswählen

//   Schleife: In das Absatzformat gespeicherte Tabulatoren speichern
Ich habe hier auch probiert, die Tabulatoren zuzuweisen, aber ich habe den gleichen Fehler, daß zwar die Positionen korrekt in das Absatzformat kommen, aber die Ausrichtung, Füllzeichen und Zeichen zur Ausrichtung nicht.

Ich muß zugeben, daß ich zwar den Unterschied zwischen Referenz und Wert verstehe, aber leider noch nicht vollständig verstanden habe, WIE man einen Wert erzwingen kann.
Zuerst dachte ich, daß es damit geht, daß man die Variable nochmal einer anderen Variable zuweist und es dadurch aufgebrochen wird, das scheint aber nicht der Fall zu sein.

Ich habe auch nach "JavaScript Reference Value" über Google gesucht und dabei viele Einträge zu dem Problem gefunden, die aber leider auch nicht zu meinem Verständnist beigetragen haben. Ich bin in dem Grundverständnis offensichtlich noch seeeehr am Anfang.

Code: Alles auswählen

#target InDesign
//  Skript zum automatischen Umformatieren einer Tabelle mit Kopfzeile und abwechselnden hinterlegten Balken
//  von Matthias Bracke - V7 -21.3.2013, Nürnberg
//  Vielen Dank an die Mitglieder des Forums "Adobe InDesign Skriptwerkstatt" bei https://www.hilfdirselbst.ch/


//  ======================================================

//  Prüfen: Ist ein Dokument offen und Text ausgewählt
var _Fehler1 = "Es ist kein Dokument geöffnet";
var _Fehler2 = "Es ist kein Text ausgewählt";
var _Fehler3 = "Es ist ein Fehler aufgetreten!\r\rDie Fehlermeldung lautet:\r";

try{
       if (app.documents.length == 0){
           alert(_Fehler1);
       	exit();
	}
	   if (app.selection.length == 0) {
           alert(_Fehler2);
       	exit();
	}
	   if (app.selection[0].hasOwnProperty("baseline") == false 
            || app.selection[0].length == 0) {
           alert(_Fehler2);
       	exit();
	}
}
catch(_Fehler){
        alert(_Fehler3 + _Fehler.message);
        exit();
}

//  ======================================================

//  Variablen definieren
var _MeinDokument = app.activeDocument;
var _AusgewaehlterText = app.selection[0];
var _AbsatzformatZahlAnhang = 0; // Zahl im Absatzformatnamen, falls Name besetzt
var _Testzahl = 0;
var _AbsatzformatID = 0;   // Später ID des Mutter-Absatzformates
var _TabsAnzahl = _AusgewaehlterText.paragraphs[0].tabStops.length;
var _TabsAlle = _AusgewaehlterText.paragraphs[0].tabStops.everyItem;
_TabsAllePositionRef = new Array();
_TabsAlleAusrichtungRef = new Array();
_TabsAlleZeichenAusrichtungRef = new Array();
_TabsAlleFuellzeichenRef = new Array();
_TabsAllePosition = new Array();
_TabsAlleAusrichtung = new Array();
_TabsAlleZeichenAusrichtung = new Array();
_TabsAlleFuellzeichen = new Array();

//  ======================================================

//   Schleife (Tabulatoren des markierten Text speichern (Position und Ausrichtung))
for (var i = 0; i < _TabsAnzahl; i ++) {
    var _TabPosition = _AusgewaehlterText.paragraphs[0].tabStops[i];
    _TabsAllePositionRef.push(_TabPosition.position);
    _TabsAllePosition.push (_TabsAllePositionRef[i]);
    _TabsAlleAusrichtungRef.push(_TabPosition.alignment);
    _TabsAlleAusrichtung.push (_TabsAlleAusrichtungRef[i]);
    _TabsAlleZeichenAusrichtungRef.push(_TabPosition.alignmentCharacter);
    _TabsAlleZeichenAusrichtung.push (_TabsAlleZeichenAusrichtungRef[i]);
    _TabsAlleFuellzeichenRef.push(_TabPosition.leader);
    _TabsAlleFuellzeichen.push (_TabsAlleFuellzeichenRef[i]);
/*    alert("_TabsAllePosition = " + _TabsAllePosition[i] + "\r" +
            "_TabsAllePositionRef = " + _TabsAllePositionRef[i] + "\r" +
            "_TabsAlleAusrichtung = " + _TabsAlleAusrichtung[i] + "\r" +
            "_TabsAlleAusrichtungRef = " + _TabsAlleAusrichtungRef[i] + "\r" +
            "_TabsAlleZeichenAusrichtung = " + _TabsAlleZeichenAusrichtung[i] + "\r" +
            "_TabsAlleZeichenAusrichtungRef = " + _TabsAlleZeichenAusrichtungRef[i] + "\r" +
            "_TabsAlleFuellzeichen = " + _TabsAlleFuellzeichen[i] + "\r" +
            "_TabsAlleFuellzeichenRef = " + _TabsAlleFuellzeichenRef[i] + "\r"); */
    }

//  Schleife (Absatzformatnamen: Mutterformat definieren und prüfen, ob schon vorhanden)  ==NEU2==   
var _AbsatzformatZahlAnhang = 0;     // erzeugt Formatnamen mit Zähler,  Schleife wird abgebrochen, wenn noch nicht vorhanden
while (true)     {
    var _Absatzformat_Text = "KA-Tab!_Text (Mutterformat)".replace("!",++_AbsatzformatZahlAnhang);         
    if (_MeinDokument.paragraphStyles.itemByName(_Absatzformat_Text)== null) {
    break; // Format nicht vorhanden
    }
}

//  Übrige Absatzformatnamen definieren
var _Absatzformat_TextBalken = "KA-Tab"+_AbsatzformatZahlAnhang +"_Text_Balken";
var _Absatzformat_Kopf = "KA-Tab"+_AbsatzformatZahlAnhang +"_Kopf";

//  ======================================================

//Neues Absatzformat _Absatzformat_Text anlegen mit den entsprechenden Einstellungen (Außerhalb der Absatzformatgruppe)
_AbsatzformatAnlegenText = _MeinDokument.paragraphStyles.add();  
with ( _AbsatzformatAnlegenText  ) { name          = _Absatzformat_Text; 
    appliedFont   = app.fonts.item("ITC Franklin Gothic Std");  
    fontStyle     = "Book Condensed"; 
    pointSize     = 9.4; 
    leading       = "3.75 mm"; 
    fillColor     = "Black"; 
    tracking      = -10; 
    horizontalScale = 94;
    ruleBelow = false;
    ruleBelowLineWeight = leading; //*3,5277778 ;
    ruleBelowOffset = -0.8 * leading / 3,5277778;
    ruleBelowColor = "Paper";
    justification = Justification.LEFT_ALIGN;
 };

//   Schleife: In das Absatzformat gespeicherte Tabulatoren speichern
for (var i = 0; i < _TabsAnzahl; i ++) {
_TabsZuweisen = _MeinDokument.paragraphStyles.itemByName(_Absatzformat_Text).tabStops.add()
with (_TabsZuweisen)    {
    position = _TabsAllePosition[i];
    alignment = _TabsAlleAusrichtung[i];
    alignmentCharacter = _TabsAlleZeichenAusrichtung[i];
    leader = _TabsAlleFuellzeichen[i];
    /*alert(i + " = i"  + "\r" +
            _TabsAllePosition[i] + " = _TabsAllePosition = "  + "\r" +
            _MeinDokument.paragraphStyles.itemByName(_Absatzformat_Text).tabStops[i].position + " = position" + "\r" +
            _TabsAlleAusrichtung[i] + " = _TabsAlleAusrichtung" + "\r" +
            _MeinDokument.paragraphStyles.itemByName(_Absatzformat_Text).tabStops[i].alignment + " = alignment" + "\r" +
            _TabsAlleZeichenAusrichtung[i] + " = _TabsAlleZeichenAusrichtung" + "\r" +
            _MeinDokument.paragraphStyles.itemByName(_Absatzformat_Text).tabStops[i].alignmentCharacter + " = alignmentCharacter" + "\r" +
            _TabsAlleFuellzeichen[i] + " = _TabsAlleFuellzeichen" + "\r" +
            _MeinDokument.paragraphStyles.itemByName(_Absatzformat_Text).tabStops[i].leader + " = leader" + "\r"); */
    };
};

//  ======================================================

//  Schleife (ID des Mutter-Absatzformates herausfinden)
for (var _AbsatzformatID = 0; _AbsatzformatID < _MeinDokument.allParagraphStyles.length; _AbsatzformatID++) {
    if (_MeinDokument.paragraphStyles.itemByName(_Absatzformat_Text) == _MeinDokument.paragraphStyles[_AbsatzformatID])
    {
        var _AbsatzformatIDgefunden = _AbsatzformatID
       break; }
}

//  Absatzformat duplizieren (für TextBalken) und Einstellungen ändern
_AbsatzformatDuplizieren1 = _MeinDokument.paragraphStyles[_AbsatzformatIDgefunden].duplicate();
with (_AbsatzformatDuplizieren1) { name = _Absatzformat_TextBalken;
    ruleBelow = true;
    basedOn = _MeinDokument.paragraphStyles.itemByName(_Absatzformat_Text);
    nextStyle = _MeinDokument.paragraphStyles.itemByName(_Absatzformat_Text);
}

//  ======================================================

//  Schleife (ID des Mutter-Absatzformates herausfinden)
for (var _AbsatzformatID = 0; _AbsatzformatID < _MeinDokument.allParagraphStyles.length; _AbsatzformatID++) {
    if (_MeinDokument.paragraphStyles.itemByName(_Absatzformat_Text) == _MeinDokument.paragraphStyles[_AbsatzformatID])
    {
         var _AbsatzformatIDgefunden = _AbsatzformatID;
      break; }
}

//  Absatzformat duplizieren (für Kopfzeile) und Einstellungen ändern
_AbsatzformatDuplizieren2 = _MeinDokument.paragraphStyles[_AbsatzformatIDgefunden].duplicate();
with (_AbsatzformatDuplizieren2) { name = _Absatzformat_Kopf;
    pointSize     = 7.5; 
    leading       = "2.75 mm"; 
    fillColor     = "Black"; 
    tracking      = 0; 
    horizontalScale = 100;
    ruleBelow = true;
    ruleBelowLineWeight = "0.11 mm"; 
    ruleBelowOffset = "0.50 mm";
    ruleBelowColor = "Black";
    basedOn = _MeinDokument.paragraphStyles.itemByName(_Absatzformat_Text);
    nextStyle = _MeinDokument.paragraphStyles.itemByName(_Absatzformat_Text);
}

//  ======================================================

//  Absatzformate auf den ausgewählten Text zuweisen
var _AnzahlAbsaetze = _AusgewaehlterText.paragraphs.length;
_AusgewaehlterText.paragraphs[0].appliedParagraphStyle = _Absatzformat_Kopf;

for (var i = 1; i < _AusgewaehlterText.paragraphs.length; i++){
    _AusgewaehlterText.paragraphs[i].appliedParagraphStyle = _Absatzformat_Text;
    if (i+1 == _AusgewaehlterText.paragraphs.length){
        break;
        }
    i++;
    _AusgewaehlterText.paragraphs[i].appliedParagraphStyle = _Absatzformat_TextBalken;
 };


//  ======================================================

//  Absatzformate sortieren: Kopf vor Text
var _AbsatzformatVerschieben = _MeinDokument.paragraphStyles.itemByName(_Absatzformat_Kopf).move(LocationOptions.BEFORE, _MeinDokument.paragraphStyles.itemByName(_Absatzformat_Text));
_AbsatzformatVerschieben;
Gruß,
Soul71 / Matthias

wernerperplies
Beiträge: 185
Registriert: 6. Aug 2011, 17:48
Wohnort: 18374 Zingst
Kontaktdaten:

Re: Skript zum anlegen und zuweisen von Absatzformaten - Fra

Beitrag von wernerperplies » 22. Mär 2013, 11:44

Guten Tag Matthias,
Leider konnte ich die Testdatei nicht hochladen, da beim Versuch hier im Forum folgende Fehlermeldung kommt:
Bei Problemen solltest Du nicht lange kämpfen, sondern direkt fragen. ;-)

Die Idee, ein Indd-Datei hochzuladen ist nicht gut, weil da viel Luft drin ist. Außerdem ist sie versionsabhängig.

Also bitte zuerst eine IDML-Datei erzeugen.

Danach hängst Du an das .idml noch ein .zip dran, dann sollte es klappen.

Ich habe Dir zum Test mal eine PNG. und eine IDML-Datei angehängt.
MainFunctionTabs.png
Dateianhänge
tabs.idml.zip
(29.34 KiB) 204-mal heruntergeladen
einen schönen Tag wünscht

Werner Perplies
https://www.weepee.de

Soul71
Beiträge: 4
Registriert: 22. Mär 2013, 09:43

Re: Skript zum anlegen und zuweisen von Absatzformaten - Fra

Beitrag von Soul71 » 22. Mär 2013, 12:14

Hallo Werner,
Bei Problemen solltest Du nicht lange kämpfen, sondern direkt fragen.
:) Ist ja innerhalb des Forumeintrags passiert ... ein bißchen selbst probieren Probleme zu lösen möchte ich aber nicht abstellen, sonst würden meine Fragen das Forum hier und bei HilfDirSelbst sprengen ... ;)

ich habe das Testdokument im IDML-Format gespeichert und gezipt. Jetzt hats auch mit dem Hochladen geklappt! :-)

Dein PNG konnte ich in Deinem Beitrag lesen,
und Deine ZIP-Datei habe ich auch heruntergeladen, allerdings war kein Indesign-Dokument, sondern eine Ordnerstruktur mit XML-Dateien. (Snapshot als Anhang beigefügt)

Gruß,
Soul71 / Matthias
Dateianhänge
ZIP-Inhalt_tabs.idml.JPG
Testdokument_Skript_Absatzformate-anlegen-und-zuweisen_V6.zip
(43.81 KiB) 215-mal heruntergeladen

wernerperplies
Beiträge: 185
Registriert: 6. Aug 2011, 17:48
Wohnort: 18374 Zingst
Kontaktdaten:

Re: Skript zum anlegen und zuweisen von Absatzformaten - Fra

Beitrag von wernerperplies » 22. Mär 2013, 13:01

Hallo Matthias,

so was lange währt, wird jetzt hoffentlich gut. ;-)

Doch vorweg:
Deine ZIP-Datei habe ich auch heruntergeladen, allerdings war kein Indesign-Dokument, sondern eine Ordnerstruktur mit XML-Dateien.
Doch, das ist eine IDML-Datei.
Oder anders ausgedrückt:
Eine IDML-Datei ist eine Zip-Datei, die Du in InDesign laden kannst.

Jetzt zum Skript:

Wie ich Dir schon bei HilfDirSelbst geschrieben habe, bin ich nach ausgiebiger Analyse der Meinung, dass Dein Skrip in Ordnung ist und Du schließlich nichts dafür kannst, wenn InDesign nicht tut, was man sagt. ;-)

Um aber Dein Skript verstehen zu können, habe ich es komplett umgeschrieben.

Die Idee war dabei, einzelne Aufgaben des Skriptes in eigenständige Funktionen zu packen, das erleichtert eine eventuelle Fehlersuche ungemein.

Das komplette Skript findest Du im Anhang.

Es gibt eine Hauptfunktion, die die Aufrufe der einzelnen Aufgaben enthält, nämlich:

Ist eine Datei offen?
Wenn ja, ist ein Text ausgewählt?
Wenn ja:
Speichere die Vorlage des Mutterformatnamens
in eine Variable
Erzeuge den Namen des Mutterformates
Erzeuge alle Formate
Weise die Formate zu.

Diese Routine sieht so aus:
Bild

Die Routine
/*object*/function createParaFormats(...)
ruft
/*paraStyle*/function createAbsatzformatText()
und ruft
/*void*/function addTabsOfSelectedText2Format(...)
(Das ist Dein Sorgenkind ;-))

Das Problem besteht für mich darin, das die Erzeugung einens TabStops nur dann richtig funktioniert, wenn dem ersten TabStop ein Wert zugewiesen wird.
Das war bei Dir die Position.

Für die Folgezuweisungen erwartet InDesign jetzt aber keine Zuweisung auf einen einzelnen TabStop, sondern auf das zugehörige Element der Collection.
Das ist m. E. ein Bug.

Meine Routine berücksichtigt dieses Verhalten, und ich hoffe, dass sie bei Dir genauso gut funktioniert, wie bei mir:

Bild
Dateianhänge
Tabs.zip
(2.11 KiB) 204-mal heruntergeladen
einen schönen Tag wünscht

Werner Perplies
https://www.weepee.de

Soul71
Beiträge: 4
Registriert: 22. Mär 2013, 09:43

Re: Skript zum anlegen und zuweisen von Absatzformaten - Fra

Beitrag von Soul71 » 22. Mär 2013, 14:40

Hallo Werner,

vielen lieben Dank für die ausführliche Hilfe.
Du hast mir sehr geholfen! :)

Ich hoffe ich komme am Wochenende dazu, das ganze nochmal durchzuarbeiten.

Ich wünsche Dir ein schönes Wochenende!

Gruß,
Soul71 / Matthias

wernerperplies
Beiträge: 185
Registriert: 6. Aug 2011, 17:48
Wohnort: 18374 Zingst
Kontaktdaten:

Re: Skript zum anlegen und zuweisen von Absatzformaten - Fra

Beitrag von wernerperplies » 22. Mär 2013, 14:46

Hallo Matthias,
Du hast mir sehr geholfen!
Funktioniert es denn?
Ich wünsche Dir ein schönes Wochenende!
Danke, gleichfalls.
einen schönen Tag wünscht

Werner Perplies
https://www.weepee.de

Soul71
Beiträge: 4
Registriert: 22. Mär 2013, 09:43

Re: Skript zum anlegen und zuweisen von Absatzformaten - Fra

Beitrag von Soul71 » 22. Mär 2013, 15:45

Hallo Werner!

Nach einem ersten kurzen Test hat es wunderbar hingehaut.

Ich werde mich aber noch am Wochenende genauer damit auseinandersetzen.

Gruß,
Soul71 / Matthias

wernerperplies
Beiträge: 185
Registriert: 6. Aug 2011, 17:48
Wohnort: 18374 Zingst
Kontaktdaten:

Re: Skript zum anlegen und zuweisen von Absatzformaten - Fra

Beitrag von wernerperplies » 23. Mär 2013, 08:19

Soul71 hat geschrieben:Hallo Werner!

Nach einem ersten kurzen Test hat es wunderbar hingehaut.

Ich werde mich aber noch am Wochenende genauer damit auseinandersetzen.

Gruß,
Soul71 / Matthias
Hallo Matthias,

klingt gut.

Wenn auch weiterin alles klappt, solltest Du Im HilfDirSelbst-Forum Bescheid geben, dass das Problem gelöst ist.
einen schönen Tag wünscht

Werner Perplies
https://www.weepee.de

wernerperplies
Beiträge: 185
Registriert: 6. Aug 2011, 17:48
Wohnort: 18374 Zingst
Kontaktdaten:

Re: Skript zum anlegen und zuweisen von Absatzformaten - Fra

Beitrag von wernerperplies » 23. Mär 2013, 09:38

Hallo Matthias,
Ich muß zugeben, daß ich zwar den Unterschied zwischen Referenz und Wert verstehe, aber leider noch nicht vollständig verstanden habe, WIE man einen Wert erzwingen kann.
In dem Du ein neues Objekt erzeugst.

Das geht hier bei InDesign oft mit den Methoden add() von einer Collection (komplett neues Objekt) oder duplicate() (neues Object mit den Werten eines alten Objektes).

Wenn keine der beiden Methoden zur Verfügung stehen, musst Du Dir Dein eigenes duplicate() schreiben, was nicht ganz einfach ist, weil jedes Object ja wieder Objekte enthalten kann.

Das erledigt man in der Regel durch Rekursion.
Zuerst dachte ich, daß es damit geht, daß man die Variable nochmal einer anderen Variable zuweist und es dadurch aufgebrochen wird, das scheint aber nicht der Fall zu sein.
Nein, das funktioniert nicht, da speicherst Du nur den Zeiger.
einen schönen Tag wünscht

Werner Perplies
https://www.weepee.de

Antworten

Zurück zu „Fragen zur Programmierung“