hilfdirselbst.ch
Facebook Twitter gamper-media
cwenet S
Beiträge: 855
12. Aug 2013, 21:28
Beitrag #1 von 11
Bewertung:
(3483 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Marginalie (CS6, WIN)


Guten Abend,

hiermit möchte ich im Dokumet "marginalie_vorher.idml" den Zähler einer Überschrift
im Fliesstext ausschneiden und als verankerte Fläche vor die Überschrift einfügen:

Code
  
//clear the find/change text preferences
app.findGrepPreferences = NothingEnum.nothing;
app.changeGrepPreferences = NothingEnum.nothing;

//Set the find options.
app.findTextPreferences.appliedParagraphStyle = 'Überschrift 2';
app.findGrepPreferences.findWhat = '^\\d+?\\.\\d+? ';

var myFound = app.activeDocument.findGrep(true);

var myBounds = [ "0p", "0p", "13pt", "36mm"]; // Koordinaten des Marginalientextrahmens [y1, x1, y2, x2]
var myOStyle = app.activeDocument.objectStyles.item('Marginalie');

for( var n = myFound.length-1; n >= 0; n-- )
{
mySchleife();
}


function mySchleife()
{
var myIndex = myFound[n].insertionPoints[0].index; // der wievielte IP in der Story?
var myStory = myFound[n].parentStory; // in welcher Story?
app.select(myFound[n]);
app.cut();

var myFrame = myStory.insertionPoints[myIndex].textFrames.add(); // Einfügen eines Textrahmen am Einfügepunkt (Cursor)
myFrame.parent.parentTextFrames[0].characters.length;
myFrame.geometricBounds = myBounds; // Zuweisung der Koordinaten (Höhe und Breite)
myFrame.applyObjectStyle(myOStyle, true); // Zuweisung des Objektstils
app.select(myFrame.insertionPoints[0]); // Zuweisung des Inhalts
app.paste();
myFrame.paragraphs[0].appliedParagraphStyle = "U2_Ziffer";
}


So wie in Dokument "marginalie_soll.idml" soll es aussehen.
Das Script scheint die Anker aber irgendwie willkürlich zu setzen.
Bei vielen Überschriften läuft das Ganze dann komplett aus dem Ruder und die verankerte Fläche entfernt sich
immer weiter weg von der ursprünglichen Überschrift.

Hat jemand eine Idee?

Danke und Gruss
Christoph
(Dieser Beitrag wurde von cwenet am 12. Aug 2013, 21:30 geändert)
Top

Anhang:
 
X
Hans Haesler  M  p
Beiträge: 5557
12. Aug 2013, 22:28
Beitrag #2 von 11
Beitrag ID: #516220
Bewertung:
(3454 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Marginalie (CS6, WIN)


Guten Abend Christoph,

die Schleife vorwärts laufen lassen. Dann sollte es funktionieren wie gewünscht:

Code
// clear the find/change preferences 
app.findTextPreferences = app.changeTextPreferences = null;
app.findGrepPreferences = app.changeGrepPreferences = null;

// set the find options
app.findTextPreferences.appliedParagraphStyle = 'Überschrift 2';
app.findGrepPreferences.findWhat = '^\\d+?\\.\\d+? ';

var myFound = app.activeDocument.findGrep(true);

var myBounds = [ "0p", "0p", "13pt", "36mm"]; // Koordinaten des Marginalientextrahmens [y1, x1, y2, x2]
var myOStyle = app.activeDocument.objectStyles.item('Marginalie');

for (var n=0; n<myFound.length; n++) {
var myIndex = myFound[n].insertionPoints[0].index; // der wievielte IP in der Story?
var myStory = myFound[n].parentStory; // in welcher Story?
app.select(myFound[n]);
app.cut();

var myFrame = myStory.insertionPoints[myIndex].textFrames.add(); // Einfügen eines Textrahmens am Einfügepunkt (Cursor)
myFrame.parent.parentTextFrames[0].characters.length;
myFrame.geometricBounds = myBounds; // Zuweisung der Koordinaten (Höhe und Breite)
myFrame.applyObjectStyle(myOStyle, true); // Zuweisung des Objektstils
app.select(myFrame.insertionPoints[0]); // Zuweisung des Inhalts
app.paste();
myFrame.paragraphs[0].appliedParagraphStyle = "U2_Ziffer";
}

// clear the find/change preferences
app.findTextPreferences = app.changeTextPreferences = null;
app.findGrepPreferences = app.changeGrepPreferences = null;

Und auch die 'TextPreferences' löschen. Sowohl zu Beginn, als auch am Schluss.

Gruss, Hans
als Antwort auf: [#516217] Top
 
cwenet S
Beiträge: 855
13. Aug 2013, 06:19
Beitrag #3 von 11
Beitrag ID: #516221
Bewertung:
(3409 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Marginalie (CS6, WIN)


Lieber Hans,

besten Dank. So funktioniert es prima.

Ich glaube, das habe ich immer noch nicht verstanden, wann man rückwärts und wann man vorwärts durch das Dokument marschieren muss.

Schönen Tag
Gruss
Christoph
als Antwort auf: [#516220] Top
 
Hans Haesler  M  p
Beiträge: 5557
13. Aug 2013, 08:12
Beitrag #4 von 11
Beitrag ID: #516222
Bewertung:
(3389 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Marginalie (CS6, WIN)


Hallo Christoph,

bitte sehr.

Dieser Alert eingefügt, zeigt den Inhalt der ersten Fundstelle:

Code
alert (myFound[0].contents); 

Und das ist nicht 1.1, sondern 1.9. Das heisst: Die Werte im Array sind in umgekehrter Reihenfolge.

Deshalb muss die Schleife vorwärts laufen. Die Fundstellen werden von unten nach oben besucht und es gibt keine Verschiebung.

Gruss, Hans
als Antwort auf: [#516221] Top
 
WernerPerplies
Beiträge: 2177
13. Aug 2013, 08:30
Beitrag #5 von 11
Beitrag ID: #516223
Bewertung:
(3382 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Marginalie (CS6, WIN)


Hallo Hans, hallo Christoph,

wäre es nicht einfacher, die Reihenfolge im Array umzudrehen?
-> array.reverse();

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler jetzt mit Vollwaschgang
Aktuelles
XING
als Antwort auf: [#516222] Top
 
Hans Haesler  M  p
Beiträge: 5557
13. Aug 2013, 08:38
Beitrag #6 von 11
Beitrag ID: #516226
Bewertung:
(3369 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Marginalie (CS6, WIN)


Hallo Werner,

der Array wird von InDesign in umgekehrter Reihenfolge geliefert.
Deshalb kann man ihn – so wie er ist – von vorne nach hinten abarbeiten lassen.

Eine Umkehrung ist nicht notwendig.

Gruss, Hans
als Antwort auf: [#516223] Top
 
Hans Haesler  M  p
Beiträge: 5557
13. Aug 2013, 08:42
Beitrag #7 von 11
Beitrag ID: #516229
Bewertung:
(3365 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Marginalie (CS6, WIN)


Hallo Christoph,

noch etwas: Das Setzen des 'appliedParagraphStyle' muss auch mit 'findGrepPreferences' gemacht werden.
Sonst könnte es sein, dass eine Fundstelle im Text behandelt wird. Da habe ich gestern zu wenig genau hingeschaut.

Code
// clear the find/change preferences 
app.findGrepPreferences = app.changeGrepPreferences = null;

// set the find options
app.findGrepPreferences.appliedParagraphStyle = 'Überschrift 2';
app.findGrepPreferences.findWhat = '^\\d+?\\.\\d+? ';

var myFound = app.activeDocument.findGrep(true);

var myBounds = [ "0p", "0p", "13pt", "36mm"]; // Koordinaten des Marginalientextrahmens [y1, x1, y2, x2]
var myOStyle = app.activeDocument.objectStyles.item('Marginalie');

for (var n=0; n<myFound.length; n++) {
var myIndex = myFound[n].insertionPoints[0].index; // der wievielte IP in der Story?
var myStory = myFound[n].parentStory; // in welcher Story?
app.select(myFound[n]);
app.cut();

var myFrame = myStory.insertionPoints[myIndex].textFrames.add(); // Einfügen eines Textrahmens am Einfügepunkt (Cursor)
myFrame.parent.parentTextFrames[0].characters.length;
myFrame.geometricBounds = myBounds; // Zuweisung der Koordinaten (Höhe und Breite)
myFrame.applyObjectStyle(myOStyle, true); // Zuweisung des Objektstils
app.select(myFrame.insertionPoints[0]); // Zuweisung des Inhalts
app.paste();
myFrame.paragraphs[0].appliedParagraphStyle = "U2_Ziffer";
}

// clear the find/change preferences
app.findGrepPreferences = app.changeGrepPreferences = null;

Wenn man aber sicher ist, dass der Text nie mit der Kombination "Ziffer, Punkt, Ziffer" beginnt, dann muss das Absatzformat nicht gesetzt werden.

Gruss, Hans
als Antwort auf: [#516221] Top
 
WernerPerplies
Beiträge: 2177
13. Aug 2013, 08:42
Beitrag #8 von 11
Beitrag ID: #516230
Bewertung:
(3362 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Marginalie (CS6, WIN)


Hallo Hans,

entschuldige, ich habe mich unklar ausgedrückt, deshalb nochmal und hoffentlich klarer:

Ist es nicht generell sinnvoller die Reihenfolge innerhalb eines Arrays zu ändern -> array.reverse(), als jeweils die Laufrichtung der Schleife zu ändern?

Ich hatte schon verstanden, dass das Array in diesem Fall schon die richtige Reihenfolge hatte.

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler jetzt mit Vollwaschgang
Aktuelles
XING
als Antwort auf: [#516226] Top
 
Hans Haesler  M  p
Beiträge: 5557
13. Aug 2013, 09:11
Beitrag #9 von 11
Beitrag ID: #516232
Bewertung:
(3320 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Marginalie (CS6, WIN)


Mein lieber Werner,

Du hattest Dich klar ausgedrückt. Aber es macht es keinen Sinn, eine generelle Regel zu deklarieren.

Der Beweis: In diesem Fall ist es wirklich überflüssig, die Reihenfolge zu ändern.

Zudem ist es einfacher, diese Zeile zu tippen (und zu verstehen) ...

Code
for (var n=0; n<myFound.length; n++) { 

... als diese:

Code
for (var n=myFound.length-1; n>=0; n--) { 


Gruss, Hans
als Antwort auf: [#516230] Top
 
WernerPerplies
Beiträge: 2177
13. Aug 2013, 09:19
Beitrag #10 von 11
Beitrag ID: #516235
Bewertung:
(3317 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Marginalie (CS6, WIN)


Hallo Hans,

wir reden wirklich aneinander vorbei:

Zitat Aber es macht es keinen Sinn, eine generelle Regel zu deklarieren.

Ich finde das schon, aber das ist meine Meinung.
Zitat Der Beweis: In diesem Fall ist es wirklich überflüssig, die Reihenfolge zu ändern.

Richtig, dehalb war mein Vorschlag mehr genereller Art.
Zitat Zudem ist es einfacher, diese Zeile zu tippen (und zu verstehen) ...
for (var n=0; n<myFound.length; n++) {

Genau meine Meinung!

Und deshalb finde ich:

Sollte es notwendig sein, ein Array rückwärts zu durchlaufen, ist m. E. sinnvoller, den Arryinhalt umzudrehen und dann Schleifen immer vorwärts zu durchlaufen.

Aber wie schon gesagt, das ist meine Meinung.

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler jetzt mit Vollwaschgang
Aktuelles
XING
als Antwort auf: [#516232]
(Dieser Beitrag wurde von WernerPerplies am 13. Aug 2013, 09:24 geändert)
Top
 
cwenet S
Beiträge: 855
13. Aug 2013, 13:34
Beitrag #11 von 11
Beitrag ID: #516264
Bewertung:
(3257 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Marginalie (CS6, WIN)


Vielen Dank für Eure weiteren Beiträge und Ideen, Hans und Werner.

Danke auch an Hans für den Tipp: findGrepPreferences

Es gab tatsächlich ein Vorkommen ausserhalb der Überschrift 2 und ich hatte mich schon gewundert.

Schönen Tag
Christoph
als Antwort auf: [#516229] Top
 
X