Zu diesem irritierenden Verhalten kann ich aus gegebenem Anlass auch noch ein Beispiel beitragen.
Mit folgendem Skript wird – für's Experiment(!) – ein neues Dokument mit drei versetzten Textrahmen mit jeweils demselben Inhalt angelegt.
Code var _doc = app.documents.add(); // drei versetzte Textrahmen mit demselben Inhlat var tf_1 = _doc.textFrames.add({geometricBounds : [10,10,100,40], contents:'Absatz 0\rAbsatz 1\rAbsatz 2\rAbsatz 3\rAbsatz 4\rAbsatz 5\rAbsatz 6\rAbsatz 7\rAbsatz 8\rAbsatz 9\r'}); var tf_2 = _doc.textFrames.add({geometricBounds : [10,40,100,80], contents:'Absatz 0\rAbsatz 1\rAbsatz 2\rAbsatz 3\rAbsatz 4\rAbsatz 5\rAbsatz 6\rAbsatz 7\rAbsatz 8\rAbsatz 9\r'}); var tf_3 = _doc.textFrames.add({geometricBounds : [10,80,100,120], contents:'Absatz 0\rAbsatz 1\rAbsatz 2\rAbsatz 3\rAbsatz 4\rAbsatz 5\rAbsatz 6\rAbsatz 7\rAbsatz 8\rAbsatz 9\r'}); // Referenzierung von je drei bestimmten Absätzen var pa_1 = [tf_1.paragraphs.item(2),tf_1.paragraphs.item(5),tf_1.paragraphs.item(7)]; var pa_2 = [tf_2.paragraphs.item(2),tf_2.paragraphs.item(5),tf_2.paragraphs.item(7)]; var pa_3 = [tf_3.paragraphs.item(2),tf_3.paragraphs.item(5),tf_3.paragraphs.item(7)]; // ======================================================= // Versuchsoperationen // ======================================================= // Textrahmen 1 – nur ! voranstellen for (var i = pa_1.length - 1; i >= 0 ; i--) { pa_1[i].insertionPoints.firstItem().contents = '!'; } // Textrahmen 2 – nur Absatz löschen for (var i = pa_2.length - 1; i >= 0 ; i--) { pa_2[i].remove(); } // Textrahmen 3 – ! voranstellen und danach Absatz löschen – Schleife rückwärts for (var i = pa_3.length - 1; i >= 0 ; i--) { pa_3[i].insertionPoints.firstItem().contents = '!'; pa_3[i].remove(); } Die Textrahmen beinhalten direkt nach dem Anlegen jeweils die folgende Liste
Code Absatz 0 Absatz 1 Absatz 2 Absatz 3 Absatz 4 Absatz 5 Absatz 6 Absatz 7 Absatz 8 Absatz 9 Die Absätze in den einzelnen Textrahmen werden in analoger Weise in den Arrays pa_1, pa_2 und pa_3 referenziert.
Nun werden auf die Absätze in den drei Textrahmen der Reihe nach unterschiedliche Operationen angewandt.
Den Absätzen 3, 6, 8 ('Absatz 2', 'Absatz 5' und 'Absatz 7') des ersten Textrahmens wird in einer Schleife rückwärts ein Ausrufezeichen ! vorangestellt.
Das Ergebnis entspricht der Erwartung.
Code Absatz 0 Absatz 1 !Absatz 2 Absatz 3 Absatz 4 !Absatz 5 Absatz 6 !Absatz 7 Absatz 8 Absatz 9 Die entsprechenden Absätze des zweiten Textrahmens werden in einer Schleife rückwärts gelöscht.
Auch hier entspricht das Ergebnis der Erwartung.
Code Absatz 0 Absatz 1 Absatz 3 Absatz 4 Absatz 6 Absatz 8 Absatz 9 Auf die entsprechenden Absätze des dritten Textrahmens werden in einer Schleife rückwärts beide Operationen direkt hintereinander angewandt.
Naiverweise würde man eigentlich dasselbe Ergebnis wie in Textrahmen 2 erwarten. Die Absätze, welchen zunächst ein Ausrufezeichen vorangestellt bekommen, werden im nächsten Schritt sofort gelöscht. Es sollten also keine Ausrufezeichen sichtbar sein.
Sind sie doch.
Aber nicht bei den Absätzen, wie im ersten Textrahmen, sondern – auf den ersten Blick – um einen Absatz weiter nach unten versetzt.
Code Absatz 0 Absatz 1 !Absatz 3 Absatz 4 !Absatz 6 !Absatz 8 Absatz 9 Wie ist das möglich?
Das Löschen, das nach der Zuweisung des Ausrufezeichens erfolgt, soll korrekt ausgeführt sein (das Ergebnis in Textrahmen 3 entpricht in dieser Hinsicht dem Ergebnis in Textrahmen 2) und beim Einfügen des Ausrufezeichens soll ein Fehler unterlaufen sein?
Wenn man in Zeitlupe (d.h. mit einer Unterbrechung während des zweiten Schleifendurchgangs direkt nach Einfügen des Ausrufezeichens) zuschaut, dann erkennt man, dass das Ausrufezeichen durchaus an der richtigen Stelle eingefügt wird.
Der Fehler kommt aber nun dadurch zustande, dass nicht der gesamte Absatz, in welchen das Ausrufezeichen eingefügt worden ist, gelöscht wird, sondern nur der Teil des Absatzes, der vor dem Einfügen des Ausrufezeichens existierte, also ab 'Absatz' unter Ignorieren des frisch hinzugekommenen Ausrufezeichens.
Zu diesem wird dann der Anfang des nächsten Absatzes 'hochgezogen', so dass es am Ende so wirkt, als ob es dem falschen Absatz zugewiesen worden sei.
Die Absätze, wären sie abwechselnd rot und blau eingefärbt, sähen also am Ende so aus:
Code Absatz 0 Absatz 1 ! Absatz 3 Absatz 4 ! Absatz 6 ! Absatz 8 Absatz 9 Für meinen konkreten Fall (wo es um Verschiebungen von verankerten Objekten, die durch die Verschiebung die interne Ordnung der Absätze durcheinanderbringen) habe ich zwar einen spezifischen Workaround entwickeln können.
Eine allgemeine Lösung wäre aber angenehmer. ;-)
Ich würde das Verhalten, das nicht der Erwartung entspricht, auch als Bug bezeichnen.
Es sieht so aus, als ob ein referenzierter Absatz, dessen Inhalt sich während der Skriptausführung verändert, über seine Bestandteile den Überblick verliert und vergisst, wo seine Grenzen sind.
Ist es so, dass das Problem in erster Linie am Anfang eines Absatzes zu finden ist oder ist jemandem in ähnlichen Situationen auch schon untergekommen, dass am Ende etwas fehlt (aus der Referenzierung rausfällt) – je nachdem, ob im 'realen' Absatz etwas hingekommen oder weggenommen wurde?