[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:
(5000 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: 5791

18. Mär 2013, 14:34
Beitrag # 2 von 21
Beitrag ID: #510008
Bewertung:
(4954 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: 4821

18. Mär 2013, 15:10
Beitrag # 3 von 21
Beitrag ID: #510014
Bewertung:
(4941 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
*****
Mit herzlichem Gruß,
Uwe Laubender


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

19. Mär 2013, 14:02
Beitrag # 5 von 21
Beitrag ID: #510054
Bewertung:
(4842 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;
}


Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler 15.06.2018, Version 1.75, neue Funktionen
Aktuelles
XING


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

19. Mär 2013, 15:22
Beitrag # 7 von 21
Beitrag ID: #510060
Bewertung:
(4792 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: 2542

19. Mär 2013, 15:43
Beitrag # 8 von 21
Beitrag ID: #510064
Bewertung:
(4781 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;
}


Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler 15.06.2018, Version 1.75, neue Funktionen
Aktuelles
XING


als Antwort auf: [#510058]

Skript zum anlegen und zuweisen von Absatzformaten - Ein paar Fragen

WernerPerplies
Beiträge gesamt: 2542

19. Mär 2013, 15:49
Beitrag # 9 von 21
Beitrag ID: #510065
Bewertung:
(4779 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.

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler 15.06.2018, Version 1.75, neue Funktionen
Aktuelles
XING


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:
(4757 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:
(4734 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: 2542

19. Mär 2013, 17:09
Beitrag # 12 von 21
Beitrag ID: #510075
Bewertung:
(4693 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])

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler 15.06.2018, Version 1.75, neue Funktionen
Aktuelles
XING


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

20. Mär 2013, 16:05
Beitrag # 14 von 21
Beitrag ID: #510145
Bewertung:
(4611 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.

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler 15.06.2018, Version 1.75, neue Funktionen
Aktuelles
XING


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

Veranstaltungskalender

Hier können Sie Ihre Anlässe eintragen, welche einen Zusammenhang mit den Angeboten von HilfDirSelbst.ch wie z.B. Adobe InDesign, Photoshop, Illustrator, PDF, Pitstop, Affinity, Marketing, SEO, Büro- und Rechtsthemen etc. haben. Die Einträge werden moderiert freigeschaltet. Dies wird werktags üblicherweise innert 24 Stunden erfolgen.

pdf-icon Hier eine kleine Anleitung hinsichtlich Bedeutung der auszufüllenden Formularfelder.

Veranstaltungen
30.11.2020 - 01.12.2020

Digicomp Academy AG, Limmatstrasse 50, 8005 Zürich
Montag, 30. Nov. 2020, 08.30 Uhr - Dienstag, 01. Dez. 2020, 17.00 Uhr

Kurs

Im Kurs lernen Sie die Schritte vom Import des Rohmaterials bis zum fertig exportierten Clip kennen. Dazu zählen die Materialverwaltung, das Trimmen für Roh- und Feinschnitt, Blenden, Titel und Effekte und eine Übersicht über die wichtigsten Formate.

Preis: CHF 1'700.-
Dauer: 2 Tage

Nein

Organisator: Digicomp Academy AG

Kontaktinformation: Isil Günalp, E-Mailisil.guenalp AT digicomp DOT ch

https://www.digicomp.ch/weiterbildung/software-anwendungs-trainings/adobe-trainings/video-und-audio-publishing/adobe-premiere-pro-cc/kurs-adobe-premiere-pro-cc-basic

Veranstaltungen
01.12.2020 - 03.12.2020

ortsunabhängig
Dienstag, 01. Dez. 2020, 10.00 Uhr - Donnerstag, 03. Dez. 2020, 11.30 Uhr

Online Workshop-Reihe

Sie wollen barrierefreie PDF-Dokumente mit möglichst wenig Aufwand erstellen? Mit ein wenig Grundlagenwissen können Sie dies aus InDesign mit axaio MadeToTag erreichen – ohne manuelle Nacharbeit im PDF! In diesem 3-teiligen, interaktiven Webinar, das wir vom 1. – 3. Dezember 2020 gemeinsam mit unserem Partner und InDesign-Experten Klaas Posselt von einmanncombo organisieren, lernen die Teilnehmenden, wie sie zielführend beim Erstellen von barrierefreien PDF-Dokumenten aus Adobe InDesign vorgehen. Dafür wird zu Beginn vermittelt, was ein barrierefreies PDF ist, und welche Anforderungen an solche Dokumente bestehen. Mit diesem Wissen werden, anhand von Best-Practice-Beispielen, Strategien zum effizienten Erstellen von PDF/UA-konformen Dokumenten und Formularen mit Adobe InDesign und axaio MadeToTag gezeigt. Außerdem werden Lösungen für klassische Probleme vermittelt. Die Teilnehmenden erhalten im Vorfeld eine Liste der notwendigen Software, wie auch vorbereitete Workshop-Daten, an denen alle im Webinar unter Anleitung arbeiten. Während des Webinars haben die Teilnehmenden die Möglichkeit, Fragen zu stellen. Inhalte der einzelnen Webinare: Die Webinar-Serie besteht aus vier Teilen (Inhalte folgend). Diese bauen aufeinander auf, können aber, mit den entsprechenden Vorkenntnissen, auch einzeln besucht werden. Webinar 1 – Grundlagen (1. Dezember 2020, 10.00 - 11.30 Uhr) Fundiertes Grundlagenwissen über barrierefreie PDF-Dokumente bildet die Basis einer erfolgreichen Umsetzung in InDesign, um die dafür notwenigen Werkzeuge richtig einsetzen zu können. â–ª Warum barrierefreies PDF? â–ª Gesetzliche Grundlagen und Richtlinien â–ª Anforderungen an barrierefreie PDF-Dokumente â–ª Basiswissen zur Umsetzung in InDesign â–ª Einordnung axaio MadeToTag Webinar 2 – Einstieg MadeToTag (2. Dezember 2020, 10.00 - 11.30 Uhr) Anhand eines InDesign-Beispieldokumentes wird eine Publikation Schritt für Schritt mit MadeToTag barrierefrei gemacht. â–ª Warum MadeToTag nutzen? â–ª Nützliche Funktionen/Mehrwert gegenüber InDesign â–ª Arbeitsschritte in der Übersicht â–ª Gemeinsam ein Dokument barrierefrei machen, Schritt für Schritt â–ª Ausgabe als barrierefreies PDF/UA Webinar 3 – Spezielle Aufgaben mit MadeToTag meistern (3. Dezember 2020, 10.00 - 11.30 Uhr) Bestimmte Inhalte, wie unpassend erstellte Inhalte (z.B. manuelle Trennungen), komplexe Tabellen oder Formulare, können in einer barrierefreien Umsetzung sehr störend oder gar kniffelig sein. MadeToTag kann hier Hilfestellung leisten. â–ª Probleme finden und beheben â–ª Komplexere und richtig komplexe Tabellen â–ª Formulare â–ª Schneller Arbeiten mit Shortcuts â–ª Vorlagen aufbauen Ziele der Webinar-Serie: â–ª Grundlagen barrierefreier Dokumente kennen â–ª Barrierefreie Dokumente in InDesign mit MadeToTag vorbereiten und ausgeben Teilnahmegebühr: Die Teilnahmegebühr für alle drei Webinare beträgt € 89,- (zzgl. MwSt.) Wir freuen uns auf Ihre Teilnahme! Das axaio-Team

Ja

Organisator: axaio software

Kontaktinformation: Karina Zander, E-Mailk.zander AT axaio DOT com

https://en.xing-events.com/OEBIDIR.html

Erstellung barrierfreier PDF-Dokumente mit InDesign & MadeToTag

Neuste Foreneinträge


Großformat Druckdaten anlegen

Fehlermeldung: ist in sich selbst verschachtelt

Bilder exportieren

Ausschnittswerkzeug

Interaktive PDFs - Ebenenansicht speichern

Systemschriften nicht anzeigen Fontexplorer

Acrobat Pro Farbauszüge drucken

Initial mit unterschiedlichem rechten Rand

Quellenangaben von Bildern innerhalb des Dokumentes pflegen

Vorschlag vor Überschrift
medienjobs