[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Skript zum anlegen und zuweisen von Absatzformaten - Ein paar Fragen

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Print/Bildbearbeitung - Photos, Layout, Design
Themen
Beiträge
Moderatoren
Letzter Beitrag

Skript zum anlegen und zuweisen von Absatzformaten - Ein paar Fragen

Soul71
Beiträge gesamt: 36

18. Mär 2013, 10:30
Beitrag # 1 von 21
Bewertung:
(6939 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Zusammen,

das ist mein erster eigener Skript-Versuch für InDesign.
Ich hatte bisher noch keine Erfahrungen mit Java-Script
und als Programmiererfahrung nur rudimentäre Kenntnisse in Basic,
die schon Jahrzehnte (oh weh ... :-) zurückliegen.

Für den Einstieg habe ich mir das Buch "InDesign automatisieren" von Gregor Fellenz gekauft, welches eine große Hilfe für den Einstieg ist.

Ich verwende InDesign CS 5.5 an einem Intel-Mac und an einem Windows-PC.

---

Ich habe ein Skript geschrieben bzw. zusammengebastelt (siehe unten),
welches folgendes erledigt bzw. erledigen soll:


Einen markierten Text (der normalerweise Tabulatoren enthält)
mit 3 Absatzformaten versehen:

1. Zeile: Kopf (kleinere Schrift und Absatzlinie darunter),
dann im Wechsel ein Absatzformat Text
und eines mit hinterlegtem weißen Balken (der Textrahmen ist eingefärbt).

Diese Absatzformate übernehmen die Tabulatoren des markierten Textes (der ersten Zeile davon).

Diese Absatzformate lege ich im Skript an und weise sie danach dem Text zu.

---

Natürlich sind jetzt ein paar Fragen dazu aufgetaucht,
vielleicht kann mir hier der eine oder andere ein paar Tipps zu folgenden Fragen geben:

1. Habe ich irgend einen Fehler eingebaut? :-)

2. Wie kann ich (sauber) überprüfen, ob ein Text markiert ist, nicht nur z. B. ein Textrahmen?

3. Kann ich zum überprüfen, ob ein Absatzformat mit einem bestimmten Namen schon existiert, ohne eine Schleife durchführen zu müssen, welche alle Absatzformatnamen durchgeht und mit meinem Wunsch-Absatzformat-Namen vergleicht?

4. Wie muß ich mit Tabulatoren umgehen, die ein (oder mehrere) Füllzeichen und/oder an einem Zeichen ausgerichtet sind? (Ich habe es im Skript schon eingefügt, aber das scheint nicht zuverlässig zu funktionieren).

5. Was kann ich noch optimieren? Kann ich irgendwo auf eine der vielen Schleifen verzichten? Das Skript braucht recht lange zur Ausführung.


Hier noch ein paar nicht so wichtige Fragen:

6. Wie kann ich einem Absatzformat nachträglich eine Einstellung zuweisen? (Ich möchte noch dem ersten Absatzformat das nachfolgende ("nextStyle") zuweisen, aber das kann ich nur nachträglich machen)

7. Wie kann ich die drei von mir angelegten Absatzformate umsortieren? (Die ID der Formate kann ich rausfinden, aber wie sortiere ich sie (sauber) um)

---

Für jeden noch so kleinen Hinweise und Tipp wäre ich äußerst dankbar!
:-)


Gruß,
Soul71 / Matthias

---

Hier das Skript:
Code
#target InDesign 
// Skript zum automatischen Umformatieren einer Tabelle mit Kopfzeile und abwechselnden hinterlegten Balken

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

// 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;
var _TabsAllePosition = [""];
var _TabsAlleAusrichtung = [""];
var _TabsAlleZeichenAusrichtung = [""];
var _TabsAlleFuellzeichen = [""];
_TabsAllePosition.pop();
_TabsAlleAusrichtung.pop();
_TabsAlleZeichenAusrichtung.pop();
_TabsAlleFuellzeichen.pop();

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

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

// Schleife (Absatzformatnamen: Mutterformat definieren und prüfen, ob schon vorhanden)
do {
var _AbsatzformatZahlAnhang = _AbsatzformatZahlAnhang + 1
var _Absatzformat_Text = "KA-Tab"+_AbsatzformatZahlAnhang +"_Text (Mutterformat)"
if (_MeinDokument.paragraphStyles.itemByName(_Absatzformat_Text) == null) {
var _Testzahl = 1
}
} while (_Testzahl == 0)

// Ü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];
};
};

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

// 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
exit; }
}

// 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;
exit; }
}

// 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;
};

X

Skript zum anlegen und zuweisen von Absatzformaten - Ein paar Fragen

Hans Haesler
  
Beiträge gesamt: 5826

18. Mär 2013, 14:34
Beitrag # 2 von 21
Beitrag ID: #510008
Bewertung:
(6893 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Matthias,

willkommen an Bord! :-) Meine Basic-Kenntnisse hatte ich auch im letzten Jahrtausend erarbeitet. Aber es war eine gute Schule.

1. Fehler: Die beiden exit; bewirken nichts. Da muss je ein Klammerpaar dran: exit(); So ist es eine Funktion.

2. Du könntest mit constructor.name prüfen, welches Objekt ausgewählt ist.
Nur als Demo gedacht:

Code
alert (_AusgewaehlterText.constructor.name); 

Wenn ein Textrahmen ausgewählt ist, dann wird TextFrame gezeigt. Mit einem Bildrahmen kommt Rectangle.

Aber wenn wirklich Text ausgewählt ist, dann gibt es viele Möglichkeiten, welche alle erfasst werden müssen: Character oder Word oder Line oder Paragraph usw.

Deshalb wählt man besser eine kürzere Variante und prüft, ob die Auswahl eine Grundlinie hat:

Code
alert (_AusgewaehlterText.hasOwnProperty("baseline")); 

Wenn Text ausgewählt ist, wird das Ergebnis true (= wahr) sein.

Aber auch wenn nur der Cursor blinkt. Darum: Um zu prüfen, ob Text ausgewählt ist, muss ein zweiter Test eingefügt werden, welcher die Anzahl Zeichen prüft:

Code
if (_AusgewaehlterText.hasOwnProperty("baseline")) { 
if (_AusgewaehlterText.length > 0) {
alert ("Es ist Text ausgewählt.", "Okay");
}
else {
alert ("Nur der Cursor blinkt.", "Achtung");
}
}
else {
alert ("Bitte Text auswählen.", "Stop");
}

3. In diesem Fall prüfe ich eine Eigenschaft des Objekts. Oder den Namen:

Code
var _MeinDokument = app.activeDocument; 
var _Absatzformat = "Test";
try {
_Absatzformat == _MeinDokument.paragraphStyles.itemByName(_Absatzformat).name;
alert ("Das Absatzformat \"" + _Absatzformat + "\" existiert schon.", "Okay");
}
catch (e) {
alert ("Das Absatzformat \"" + _Absatzformat + "\" existiert nicht.", "Achtung");
}

Den ersten Alert kannst Du entfernen. Und den zweiten Alert durch den Befehl zum Erzeugen des Absatzformats ersetzen.

Soviel für den Moment. Jetzt muss ich mich anderen Dingen widmen. Auf die weiteren Punkte und auf das Script werde ich vielleicht später eingehen. In der Hoffnung, dass mir jemand zuvorkommt :-))

Gruss, Hans



als Antwort auf: [#509989]

Skript zum anlegen und zuweisen von Absatzformaten - Ein paar Fragen

Uwe Laubender
Beiträge gesamt: 5316

18. Mär 2013, 15:10
Beitrag # 3 von 21
Beitrag ID: #510014
Bewertung:
(6880 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, Hans!

Zitat von Hans Mit einem Bildrahmen kommt Rectangle.


Nun ja, es könnte ebensogut "Oval" oder "Polygon" kommen. In ziemlich abartigen Ausnahmefällen sogar "GraphicLine" ;-)

Uwe


als Antwort auf: [#510008]

Skript zum anlegen und zuweisen von Absatzformaten - Ein paar Fragen

Soul71
Beiträge gesamt: 36

19. Mär 2013, 13:07
Beitrag # 4 von 21
Beitrag ID: #510052
Bewertung:
(6809 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans (und Uwe)!

Vielen Dank für die prompte und ausführliche Hilfe! :-)

Nach dem ich Deine Skript-Schnipsel durchgeschaut habe,
sind mir einige Dinge aufgefallen:


1. Ich habe einen Fehler von mir noch entdeckt: Ich will an den Stellen kein exit(); sondern ein break; , denn ich will ja nur die Schleife verlassen und nicht das Skript ... :-)


2. Nachdem ich Deinen Vorschlag und auch andere Skripts studiert habe (und Teile davon genommen) und dann noch eigene Feinheiten (hoffentlich korrekte :-) eingefügt habe, bin ich zu folgender Lösung gekommen:

Code
//  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();
}


Obwohl ich mir bei der dritten If-Anweisung (im Code blau markiert) nicht ganz sicher bin, ob das alles richtig abfängt:
Wenn die Auswahl keine baseline besitzt oder die length 0 ist, wird eine Fehlermeldung ausgegeben und das Skript abgebrochen.

Mmmh. Bei meinem bisherigen Tests hat das ganz gut hingehauen, aber ich bin mir nicht ganz sicher, ob es alles abfängt. Habe ich etwas übersehen?


3. Für diese Abfrage brauche ich eine Schleife, denn es soll in einem Dokument das Skript auch mehrere Male anwendbar sein, mit jeweils eigenen Absatzformaten. Deswegen auch die Nummer in den Absatzformaten.

Nachdem das Try-Catch eine Fehlerbehandlung darstellt, und ich im Buch "InDesign automatisieren" von Gregor Fellenz (auf S. 135, Kapitel 6.11) gelesen habe, daß man diese nur sparsam einsetzen soll, frage ich mich, ob man auch ohne Fehler-Abfang das abfragen kann.

Gibt es eine Möglichkeit, das ganze abzufragen, ohne eine Fehlermeldung riskieren zu müssen, die man dann mit Try-Catch abfangen muß?

Kann man Try-Catch ohne Bedenken in einer Schleife immer wieder aufrufen?


Fragen über Fragen ... :-)

Gruß,
Soul71 / Matthias


als Antwort auf: [#510008]

Skript zum anlegen und zuweisen von Absatzformaten - Ein paar Fragen

WernerPerplies
Beiträge gesamt: 2762

19. Mär 2013, 14:02
Beitrag # 5 von 21
Beitrag ID: #510054
Bewertung:
(6781 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Matthias

Zitat Nachdem das Try-Catch eine Fehlerbehandlung darstellt, und ich im Buch "InDesign automatisieren" von Gregor Fellenz (auf S. 135, Kapitel 6.11) gelesen habe, daß man diese nur sparsam einsetzen soll, frage ich mich, ob man auch ohne Fehler-Abfang das abfragen kann



Lass Dir mal erklären, warum Du try{} catch {} vermeiden sollst, m. E. spricht absolut nichts gegen den Einsatz.

Das einzige, akzeptable Argument wäre vielleicht eine gewisse Geschwindigkeitseinbuße, aber die tritt m. E. nur auf, wenn wirklich ein Fehler auftritt.

Viel wichtiger ist die Wartungsfreundlichkeit und die Lesbarkeit eines Programmes.

Dazu vielleicht auch dieser Link:

Javascript Try-Catch Performance Vs. Error Checking Code

Und deshalb würde Dein Skript bei mir so aussehen:
Code
main(); 

/*void*/function main()
{
var noTextSelected = "Es ist kein Text ausgewählt";
try
{
if (app.selection.length == 0) throw new Error(noTextSelected);
if (app.selection[0].hasOwnProperty("baseline"))
alert(app.selection[0].contents);
else
throw new Error(noTextSelected);
}
catch (error)
{
alert(error.message);
}
return;
}



als Antwort auf: [#510052]

Skript zum anlegen und zuweisen von Absatzformaten - Ein paar Fragen

Soul71
Beiträge gesamt: 36

19. Mär 2013, 14:58
Beitrag # 6 von 21
Beitrag ID: #510058
Bewertung:
(6755 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Werner!

Vielen Dank für die Antwort!

Zitat Lass Dir mal erklären, warum Du try{} catch {} vermeiden sollst, m. E. spricht absolut nichts gegen den Einsatz.


Gut das zu hören. :-)

Wie schon bei meiner Anfrage geschrieben, bin ich ein Skript-Anfänger. Und nachdem mir das Buch schon sehr geholfen hatte, und ich mich (zumindest :-) bemühe, innerhalb der (dünnen) Kenntnisse die ich mir nach und nach aneigne von Anfang an (einigermaßen) sauberen Code zu schreiben. Und nachdem das in dem Buch stand, daß man damit sparsam umgehen sollte, war ich etwas vorsichtig mit der Verwendung dieser Funktion (Ist wahrscheinlich das falsche Wort dafür? Wie sagt man zu Try-Catch?).

Am Anfang, um festzustellen, ob überhaupt ein Text markiert ist (siehe: Beitrag #4 (http://www.hilfdirselbst.ch/...i?post=510052#510052)) habe ich diese Funktion verwendet.

Wenn man diese Funktion aber im Skript verteilt ab und zu verwenden kann, und es keine Nachteile hat, soll es mir recht sein! :-)


Hier das Vorher / Nachher dieses Skript-Abschnittes:


Vorher

Code
//  Schleife (Absatzformatnamen: Mutterformat definieren und prüfen, ob schon vorhanden)  ==ALT== 
do {
for (var _AbsatzformatID = 0; _AbsatzformatID < _MeinDokument.allParagraphStyles.length; _AbsatzformatID++) {
var _AbsatzformatZahlAnhang = _AbsatzformatZahlAnhang + 1;
var _Absatzformat_Text = "KA-Tab"+_AbsatzformatZahlAnhang +"_Text (Mutterformat)";
if (_MeinDokument.paragraphStyles.itemByName(_Absatzformat_Text) == null) {
var _Testzahl = 1;
break;
}
};
} while (_Testzahl == 0)



Nachher

Code
//  Schleife (Absatzformatnamen: Mutterformat definieren und prüfen, ob schon vorhanden)  ==NEU== 
do {
_AbsatzformatZahlAnhang++;
var _Absatzformat_Text = "KA-Tab"+_AbsatzformatZahlAnhang +"_Text (Mutterformat)";
try { _Absatzformat_Text == _MeinDokument.paragraphStyles.itemByName(_Absatzformat_Text).name;
}
catch (e) {
var _Testzahl = 1;
}
} while (_Testzahl == 0);


Ich hoffe, ich habe das so richtig umgesetzt.

Es scheint aber (nach meinen kurzen Tests) so zu funktionieren.


Gruß,
Soul71 / Matthias


als Antwort auf: [#510054]

Skript zum anlegen und zuweisen von Absatzformaten - Ein paar Fragen

Hans Haesler
  
Beiträge gesamt: 5826

19. Mär 2013, 15:22
Beitrag # 7 von 21
Beitrag ID: #510060
Bewertung:
(6731 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Matthias,

nur kurz zur try/catch-Frage (und dann überlasse ich Dich sehr gerne der Obhut von Werner ;-):

Das einzige Problem, welchem ich schon begegnet bin: Ein try-Wickel – welcher nur dazu dient, eine Fehlermeldung zu unterdrücken – wurde in einer frühen Entwicklungsphase des Scripts eingesetzt.

Dadurch kann beim Testen das Ergebnis verfälscht werden. Und man muss try/catch wieder auskommentieren, um zu erfahren, weshalb es nicht will.

Gruss, Hans


als Antwort auf: [#510058]

Skript zum anlegen und zuweisen von Absatzformaten - Ein paar Fragen

WernerPerplies
Beiträge gesamt: 2762

19. Mär 2013, 15:43
Beitrag # 8 von 21
Beitrag ID: #510064
Bewertung:
(6720 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Matthias,

vielleicht habe ich mich unklar ausgedrückt, aber schrieb:

Zitat Das einzige, akzeptable Argument wäre vielleicht eine gewisse Geschwindigkeitseinbuße, aber die tritt m. E. nur auf, wenn wirklich ein Fehler auftritt.


Wenn ich Deine Schleife richtig verstehe, erzwingst Du einen Fehler (undefined) um die Schleife abzubrechen.

Da ist aber keine gute Vorgehensweise.

Deine Schleife würde ich tatsächlich anders aufbauen, wenn ich dann die Aufgabe richtig verstanden habe:
Code
//  Schleife (Absatzformatnamen: Mutterformat definieren und prüfen, ob schon vorhanden)  ==NEU==  

main();
function main()
{
var absatzformatZahlAnhang = 0;
// erzeugt Formatnamen mit Zähler, Schleife wird abgebrochen, wenn noch nicht vorhanden
while (true)
{
var newName = "KA-Tab!_Text (Mutterformat)".replace("!",++absatzformatZahlAnhang)
if (app.activeDocument.paragraphStyles.itemByName(newName)== null)
break; // Format nicht vorhanden
}
alert(newName);
return;
}



als Antwort auf: [#510058]

Skript zum anlegen und zuweisen von Absatzformaten - Ein paar Fragen

WernerPerplies
Beiträge gesamt: 2762

19. Mär 2013, 15:49
Beitrag # 9 von 21
Beitrag ID: #510065
Bewertung:
(6718 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

Zitat Ein try-Wickel – welcher nur dazu dient, eine Fehlermeldung zu unterdrücken


Richtig, try{} catch{} ohne Fehlerbehandlung ist ein ÜBEL, das man sogar in vielen Beispielskripten von Adobe findet, aber niemals angewendet werden sollte.

Ein unterdrückter Fehler führt oft zu Folgefehlern, die dann kaum noch zu finden sind.


als Antwort auf: [#510060]

Skript zum anlegen und zuweisen von Absatzformaten - Ein paar Fragen

Soul71
Beiträge gesamt: 36

19. Mär 2013, 16:09
Beitrag # 10 von 21
Beitrag ID: #510067
Bewertung:
(6696 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Werner!

Ich habe diese Version in mein Script eingefügt und sie funktioniert tadellos!

Vielen Dank dafür! :-)

Gruß,
Soul71 / Matthias


als Antwort auf: [#510064]

Skript zum anlegen und zuweisen von Absatzformaten - Ein paar Fragen

Soul71
Beiträge gesamt: 36

19. Mär 2013, 16:27
Beitrag # 11 von 21
Beitrag ID: #510069
Bewertung:
(6673 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Zusammen!

Ich hätte nicht gedacht, daß ich so fix so viele hilfreiche Tipps bekomme!
Klasse! Danke!


Jetzt sind nur noch folgende Fragen dazu offen:


Zitat 4. Wie muß ich mit Tabulatoren umgehen, die ein (oder mehrere) Füllzeichen und/oder an einem Zeichen ausgerichtet sind? (Ich habe es im Skript schon eingefügt, aber das scheint nicht zuverlässig zu funktionieren).

Nachtrag: Bei der Tabulatoren-Auslesung bzw. -Zuweisung scheint grundsätzlich noch etwas falsch zu laufen. Die Positionen werden richtig übernommen, nur komischerweise die Ausrichtung (alignment) nicht und (falls vorhanden) Ausrichtungs-Zeichen (alignmentCharacter) und/oder Füll-Zeichen (leader) auch nicht.

Da scheint er nicht alles korrekt im Array an der gleichen Stelle zu speichern und/oder in das Absatzformat zu überführen.

Sollte/kann ich sicherheitshalber alle Tabstops im Absatzformat vorher löschen? Wobei ich das Absatzformat ja selbst anlege ...
Bzw. darf ich alignmentCharacter und leader nicht zuweisen, wenn sie bei dem entsprechenden Tabstop nicht existieren bzw. aktiv sind?



Zitat Hier noch ein paar nicht so wichtige Fragen:

6. Wie kann ich einem Absatzformat nachträglich eine Einstellung zuweisen? (Ich möchte noch dem ersten Absatzformat das nachfolgende ("nextStyle") zuweisen, aber das kann ich nur nachträglich machen)

7. Wie kann ich die drei von mir angelegten Absatzformate umsortieren? (Die ID der Formate kann ich rausfinden, aber wie sortiere ich sie (sauber) um)



Gruß,
Soul71 / Matthias


als Antwort auf: [#509989]

Skript zum anlegen und zuweisen von Absatzformaten - Ein paar Fragen

WernerPerplies
Beiträge gesamt: 2762

19. Mär 2013, 17:09
Beitrag # 12 von 21
Beitrag ID: #510075
Bewertung:
(6632 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Matthias,

ohne eine Beispieldatei mit genauer Erklärung, was Du machen willst, wird es schwierig sein, Dir zu helfen.

Zitat Nachtrag: Bei der Tabulatoren-Auslesung bzw. -Zuweisung scheint grundsätzlich noch etwas falsch zu laufen. Die Positionen werden richtig übernommen, nur komischerweise die Ausrichtung (alignment) nicht und (falls vorhanden) Ausrichtungs-Zeichen (alignmentCharacter) und/oder Füll-Zeichen (leader) auch nicht.


Nur ein Verdacht:
Könnte es sein, dass Du manchmal Referenzen statt Werte speicherst?

Zitat 7. Wie kann ich die drei von mir angelegten Absatzformate umsortieren? (Die ID der Formate kann ich rausfinden, aber wie sortiere ich sie (sauber) um)


Vermutlich mit der Move-Methode

ParagraphStyle move (to: LocationOptions[, reference: varies])


als Antwort auf: [#510069]

Skript zum anlegen und zuweisen von Absatzformaten - Ein paar Fragen

Soul71
Beiträge gesamt: 36

20. Mär 2013, 15:21
Beitrag # 13 von 21
Beitrag ID: #510137
Bewertung:
(6567 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Werner!

Zitat ohne eine Beispieldatei mit genauer Erklärung, was Du machen willst, wird es schwierig sein, Dir zu helfen.

Man hat in einem Dokument einen einfachen Textrahmen mit Text (der Tabulatoren enthält) und einem Absatzreturn am Ende einer jeden Zeile.

Diesen markiert man und führt das Skript aus.


Zitat Nur ein Verdacht:
Könnte es sein, dass Du manchmal Referenzen statt Werte speicherst?


Kann sein? Woran erkenne ich das bzw. wie finde ich das heraus?

Hier die aktuelle Version des Skriptes:
(Die Stellen, bei denen es um die Tabulatoren geht, habe ich farblich markiert)

Code
#target InDesign 
// Skript zum automatischen Umformatieren einer Tabelle mit Kopfzeile und abwechselnden hinterlegten Balken
// Vielen Dank an die Mitglieder des Forums "Adobe InDesign Skriptwerkstatt" bei http://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;
var _TabsAllePosition = [""];
var _TabsAlleAusrichtung = [""];
var _TabsAlleZeichenAusrichtung = [""];
var _TabsAlleFuellzeichen = [""];
_TabsAllePosition.pop();
_TabsAlleAusrichtung.pop();
_TabsAlleZeichenAusrichtung.pop();
_TabsAlleFuellzeichen.pop();

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

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


// 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];
};
};


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

// 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;
};



Zitat
Zitat Zitat 7. Wie kann ich die drei von mir angelegten Absatzformate umsortieren? (Die ID der Formate kann ich rausfinden, aber wie sortiere ich sie (sauber) um)

Vermutlich mit der Move-Methode

ParagraphStyle move (to: LocationOptions[, reference: varies])

Das werde ich heute abend mal ausprobieren! Vielen Dank für den Tipp!


Gruß,
Soul71 / Matthias


als Antwort auf: [#510075]

Skript zum anlegen und zuweisen von Absatzformaten - Ein paar Fragen

WernerPerplies
Beiträge gesamt: 2762

20. Mär 2013, 16:05
Beitrag # 14 von 21
Beitrag ID: #510145
Bewertung:
(6550 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Matthias,

Zitat Man hat in einem Dokument einen einfachen Textrahmen mit Text (der Tabulatoren enthält) und einem Absatzreturn am Ende einer jeden Zeile.

Diesen markiert man und führt das Skript aus.


Eine Anleitung ist keine Beispieldatei.

Die Datei sollte als Arbeitsbasis dienen, und zusätzlich solltest Du Dateien mit dem Soll- und dem Istergebnis zur Verfügung stellen.

Zitat Kann sein? Woran erkenne ich das bzw. wie finde ich das heraus?



Vielleicht solltest Du mal ein wenig Lesen:

Bücher und weitere Infos

Kurz:

Eine Referenz ist ein Zeiger auf eine Speicherstelle, ein Wert ist der Inhalt.

Wenn Du einen Zeiger zuweist, kann der Inhalt an jeder beliebigen Stelle, an der die Referenz verwendet wird, geändert werden.

Du musst also immer darauf achten, dass Du ein neu erzeugtes Object verwendest, und nicht nur einzelne Werte änderst.

Schau dieses Beispiel an:
Code
main() 

function main()
{
var object1 = {wert1: 1, wert2: 2}
// Zuweisung als Referenz
var object2 = object1;
// Zuweisung als Referenz
alert(object1.wert1);
// 999 ist ein Wert
object2.wert1 = 999;
// aber alle Objekte werden verändert.
alert("object1.wert1: " + object1.wert1);
alert("object2.wert1: " + object2.wert1);
// Duplikat des Objektes
var duplicateOfObject = {wert1: object1.wert1, wert2: object1.wert2};
alert("duplicateOfObject: " + duplicateOfObject.wert1);
duplicateOfObject.wert1 = 97;
alert("duplicateOfObject: " + duplicateOfObject.wert1);
// in object 1 gibt es jetzt keine Veränderung:
alert("object1.wert1: " + object1.wert1);
}


Ich habe Dein Skript aber nicht auf diese Fehlermöglichkeit hin überprüft.

Zitat wie finde ich das heraus?


Am besten durch Einzelschrittausführung Deines Skriptes und Prüfung der Werte.


als Antwort auf: [#510137]

Skript zum anlegen und zuweisen von Absatzformaten - Ein paar Fragen

Soul71
Beiträge gesamt: 36

20. Mär 2013, 17:26
Beitrag # 15 von 21
Beitrag ID: #510154
Bewertung:
(6535 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Werner,

ich entschuldige mich, daß ich nicht gleich eine Testdatei beigefügt habe,
ich habe etwas zu schnell "geschossen" ...

Ich wollte sie beifügen, aber diese Funktion scheint nur "Member" zur Verfügung zu stehen. Ich werde heute abend nochmal schauen, wie ich "Member" werden kann und mich dann nochmal mit einem Testdokument melden.

Zitat Vielleicht solltest Du mal ein wenig Lesen:

Bücher und weitere Infos

Die beiden Bücher, die ich noch nicht habe, sind bestellt. :-)

Vielen Dank für den Tipp!

Zitat Kurz:

...

Das werde ich heute abend auch mal überprüfen! Danke!


Gruß,
Soul71 / Matthias


als Antwort auf: [#510145]
X

Aktuell