[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Text an verankertem Rahmen einfügen

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

Text an verankertem Rahmen einfügen

J.Puff
Beiträge gesamt: 238

10. Okt 2011, 14:15
Beitrag # 1 von 13
Bewertung:
(3399 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,
per Script werden im Text einige verankerte Rahmen im Textfluss eingefügt. Der verankerte Rahmen hat eine feste Höhe. Der Text neben dem verankerten Rahmen hat ein eigenes Absatzformat und eine variable Anzahl von Zeilen. Die Anzahl der Zeilen soll nun um Leerzeilen aufgefüllt werden immer die gleiche Zeilenanzahl zu haben.

Wie finde ich die Anzahl Zeilen eines bestimmten Absatzformates an einem verankerten Rahmen heraus und kann diese um Leerzeilen ergänzen?

Vielen Dank für eine Hilfe!
Johannes
X

Text an verankertem Rahmen einfügen

Martin Fischer
  
Beiträge gesamt: 12783

10. Okt 2011, 16:20
Beitrag # 2 von 13
Beitrag ID: #482034
Bewertung:
(3371 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Johannes,

Antwort auf: Wie finde ich die Anzahl Zeilen eines bestimmten Absatzformates an einem verankerten Rahmen heraus und kann diese um Leerzeilen ergänzen?


Diese Aufgabenstellung verstehe ich nicht.

Ein Absatzformat hat keine Zeilen und auch keine verankerten Rahmen.
Du meinst vermutlich einen Absatz, dem ein bestimmtes Absatzformat zugewiesen ist.
Dennoch bleibt unklar, wo die Zeilen zugewiesen werden sollen:
– am Anfang des Absatzes,
– am Ende,
– vor dem verankerten Rahmen,
– danach oder vielleicht sogar
– im Rahmen?

Welcher Setzer ist dem Absatz zugewiesen (Absatz-Setzer oder Einzeilen-Setzer)?

Muss die Aufgabe mit Hinzufügen von Leerzeilen gelöst werden oder kommt auch eine Addition von Abstand davor/danach in Frage?

Wenn es schriftlich nicht so einfach auszudrücken ist, hilft vielleicht ein Screenshot – vorher/nachher.


als Antwort auf: [#482016]

Text an verankertem Rahmen einfügen

J.Puff
Beiträge gesamt: 238

10. Okt 2011, 16:58
Beitrag # 3 von 13
Beitrag ID: #482037
Bewertung:
(3347 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,
gute Idee, dass mit einem Bild (http://www.licht-bilder.eu/Beispiel.png) zu illustrieren.
Es enthält drei "Einträge". Der erste ist richtig, so soll es sein.
Beim dritten Eintrag sieht mensch, das Ergebnis ohne die Ergänzung von Leerzeilen: da der verankerte Rahmen den Text nicht nach unten verdrängt (geht auch nicht mit Textumfluss ;-() hängt die Headline-Zeile im Bild. Dies gilt es durch die Ergänzung der Leerzeilen zu korrigieren.

Wird es so verständlicher?
Johannes


als Antwort auf: [#482034]

Text an verankertem Rahmen einfügen

Martin Fischer
  
Beiträge gesamt: 12783

10. Okt 2011, 17:13
Beitrag # 4 von 13
Beitrag ID: #482040
Bewertung:
(3339 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf: Wird es so verständlicher?


Ja, es sieht deutlich anders aus, als ich vermutet hätte.

Ich würde keine neuen Absätze einfügen, sondern dem letzten Absatz vor der Headline bei Bedarf neue Zeilen (^n) unten anhängen.

So weit ich es verstanden habe, ist die Headline immer wieder vorm Überlappen durch den Rahmen gefährdet und dies soll verhindert werden.
Deshalb soll bei Bedarf dem Absatz vor der Headline eine zu ermittelnde Zahl von Zeilen angehängt werden.

Vorschlag:
1. Suche nach dem AF der Headline und ermittle über die Fundstellen Textbereiche vom Ende der einen Headline – insertionPoints.lastItem() – bis zum Beginn der nächsten Headline – insertionPoints.firstItem().
2. Zähle in diesen Bereichen die Zahl der Zeilen – lines.count().
3. Und weise anschließend den Absätzen vor den Headlines die Differenz von der erwarteten Zahl und der jeweils tatsächlichen Zahl der Zeilen (^n) hinzu.

U.U. ist es geboten, die Schleife rückwärts vom letzten Textbereich bis zum ersten Textbereich durchzugehen.


Alternativ könntest Du die y-Position der Unterkante des Textrahmens ermitteln und mit der baseline der Headline vergleichen und aus der Distanz den Bedarf der Zahl der einzufügenden Leerzeilen vor der Headline ermitteln.

Kommt darauf an, wo die Regelmäßigkeiten in der Layoutstruktur zu finden sind.


als Antwort auf: [#482037]
(Dieser Beitrag wurde von Martin Fischer am 10. Okt 2011, 17:17 geändert)

Text an verankertem Rahmen einfügen

J.Puff
Beiträge gesamt: 238

10. Okt 2011, 17:44
Beitrag # 5 von 13
Beitrag ID: #482045
Bewertung:
(3322 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,
in diese Richtung hatte ich auch überlegt.
Die verankerten Rahmen werden auch per Script erzeugt. Dort möchte ich eingreifen! Nur bekomme ich es nicht hin, den insertionsPoint dort abzugreifen, an dem der verankerte Rahmen gesetzt wird. Von dort könnte ich dann die Zeilen zählen und hinzufügen.
Also: wie bekomme ich den insertionsPoint wenn ein Script einen verankerten Rahmen mit xml.storyOffset.textFrames.add () einfügt? Und wie kann ich ausgehend von diesem Punkt die Zeilen zählen?

Danke für die Hilfe!
Johannes


als Antwort auf: [#482040]
(Dieser Beitrag wurde von J.Puff am 10. Okt 2011, 17:45 geändert)

Text an verankertem Rahmen einfügen

Martin Fischer
  
Beiträge gesamt: 12783

10. Okt 2011, 18:39
Beitrag # 6 von 13
Beitrag ID: #482049
Bewertung:
(3307 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Zum Einfügepunkt:

parent des verankerten Textrahmens ist ein Character-Objekt.
Ein Character hat zwei insertionPoints: einen davor und einen danach.

Du kannst also wählen zwischen _textframe.parent.insertionPoints.firstItem() und _textframe.parent.insertionPoints.lastItem() (_textframe ist Dein verankerter Textrahmen).

Aber ich bin mir nicht sicher, wohin Du zählen willst.
Und ich bin mir nicht sicher, ob es eine gute Idee ist, vom verankerten Textrahmen aus zu zählen. Es kommt auf die Struktur an.

Es könnte eine Idee sein, von verankertem Textrahmen zu verankertem Textrahmen zu zählen. Das funktioniert aber nur, wenn die Abfolge immer wie folgt gegeben ist:
Code
Headline 
verankerter Textrahmen - Absatz
Absatz
Absatz
Headline
verankerter Textrahmen - Absatz
Absatz
Absatz
Absatz
Absatz
Headline
verankerter Textrahmen - Absatz
Absatz


Also: ein Bereich ist definiert als Text zwischen einer Headline bis zum letzten Einfügepunkt vor der Headline und darin befindet sich immer ein und nur ein verankerter Textrahmen. Und der sitzt am Anfang des ersten Absatzes nach der Überschrift.

Wenn die Struktur davon abweicht und es Textbereiche zwischen zwei Headlines gibt ohne einen verankerten Rahmen oder mit mehr verankerten Rahmen, dann ist es keine gute Idee, die verankerten Rahmen als Grenzpunkte für die Textbereiche zu nehmen.



Ich würde aber wie oben vorgeschlagen das Ende der einen Überschrift und den Anfang der nächsten als Grenzpunkte für die Textbereiche nehmen und innerhalb der Textbereiche prüfen, ob ein (oder eventuell auch mehrere verankerte Rahmen) enthalten sind.
(Der letzte Textbereich erstreckt sich vom letzten Einfügepunkt der letzten Überschrift bis zum Ende des Textabschnitts).

Ich weiß nicht, was sich bei Dir hinter xml verbirgt.
Ist es ein XMLElement?


Die Textbereiche ermittelst Du über die Suche nach dem Absatzformat für die Headline etwa so:
Code
var text_ranges = get_ranges(app.activeDocument.stories.firstItem(), 'Headline'); 

function get_ranges( _story , _style)
{
var _ranges = new Array;
app.findTextPreferences = null;
app.findTextPreferences.appliedParagraphStyle = _style;
var _result = _story.findText();
if ( _result.length > 0 )
{
for ( var i = 0; i < _result.length-1; i++ )
{
_ranges.push ( _story.characters.itemByRange (_result[i].insertionPoints.lastItem().index, _result[i+1].insertionPoints.firstItem().index-1 ) );
}
_ranges.push( _story.characters.itemByRange (_result[i].insertionPoints.lastItem().index, _story.characters.length-1 )); // der letzte Bereich
}
return _ranges;
}


Damit hast Du alle Textbereiche eines Textabschnitts zwischen Überschriften ermittelt und im Array text_ranges gesichert. Nun kannst Du durch die einzelnen text_ranges gehen, prüfen, ob ein verankerter Textrahmen enthalten ist und ggf. die jeweilige Zeilenzahl ermitteln und wenn nötig am Ende durch feste neue Zeilen ergänzen.

Hier muss ich abbrechen, weil ich sofort aufbrechen muss.
Verstehst Du meine Idee etwas besser als zuvor?


als Antwort auf: [#482045]
(Dieser Beitrag wurde von Martin Fischer am 10. Okt 2011, 22:45 geändert)

Text an verankertem Rahmen einfügen

J.Puff
Beiträge gesamt: 238

10. Okt 2011, 20:54
Beitrag # 7 von 13
Beitrag ID: #482056
Bewertung:
(3266 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,
danke für das Script.
Da die zu ergänzenden Absätze mit einem eigenen Format gekennzeichnet sind, suche ich jetzt nach diesem Format, bewege mich an das Ende und füge dort ein. Der Absatz soll also genau 5 Zeilen lang sein.
Das klappt mit Text, nur nicht mit Zeilenschaltungen. Dann kommen jede Menge Returns in den Text und alle an der selben Stelle. Merkwürdig, dieses unterschiedliche Verhalten.
Darf ich noch einmal um Hilfe bitten?

Die Funktion sieht jetzt so aus:

Code
function addLines() 
{
var _curSel = app.selection[0].parentStory.paragraphs;
for ( var i = 0; i < _curSel.length-1; i++ )
{
if (_curSel[i].appliedParagraphStyle.name == "Absatzformat")
{
if(_curSel[i].paragraphs[0].lines.count() < 6) // Absatz soll 5 Zeilen lang sein
{
var _myIP = _curSel[i].insertionPoints.lastItem();
var j = _curSel[i].paragraphs[0].lines.count();
for(j; j < 6; j++)
{
_myIP.contents = "\r";
_myIP = _curSel[i].insertionPoints.lastItem();
}
}
}
}

}



als Antwort auf: [#482049]
(Dieser Beitrag wurde von J.Puff am 10. Okt 2011, 20:55 geändert)

Text an verankertem Rahmen einfügen

Martin Fischer
  
Beiträge gesamt: 12783

10. Okt 2011, 21:59
Beitrag # 8 von 13
Beitrag ID: #482058
Bewertung:
(3246 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Johannes,

Du zählst nun durch ... und genau das wollte ich verhindern. ;-)

Aber egal.

Dein Problem Nr. 1: Du arbeitest dich von vorne nach hinten durch alle Absätze und unternimmst verschiedene Untersuchungen. Du findest einen Absatz mit weniger als 5 Zeilen und fügst dann einen Absatz ein. Der erste eingefügte wird als nächster adressiert und weil er nur aus einer Zeile (also aus weniger als 5 Zeilen) besteht, fügst Du wieder 4 Absätze ein. In kürzester Zeit produzierst Du damit so viele leere Absätze wie in Deinem Leben noch nicht. ;-)

Dein Problem Nr. 2: Du kannst nicht einfach von hinten nach vorne wandern, weil Du die leeren Absätze immer am Ende eines Absatzes mit weniger als 6 Zeilen einfügen willst.


Eine Lösung: Füge nicht neue Absätze ein, sondern feste neue Zeilen.

Versuch's mal damit:
Code
addLines();  

function addLines()
{
// der Textabschnitt soll mit einer leeren Absatzschaltung enden
if (app.selection[0].parentStory.characters.lastItem().contents != '\r')
app.selection[0].parentStory.insertionPoints.lastItem().contents = '\r';
var _par = app.selection[0].parentStory.paragraphs;
// Schleife durch alle Absätze eines Textabschnitts
for ( var i = 0; i < _par.length; i++ )
{
if (_par[i].appliedParagraphStyle.name == "Absatzformat")
{
while (_par[i].lines.length < 5 ) // solange die Zahl der Absätze kleiner als 5
_par[i].insertionPoints[-2].contents = '\n'; // vor der Absatzschaltung Zeile ergänzen
}
}
}



als Antwort auf: [#482056]
(Dieser Beitrag wurde von Martin Fischer am 10. Okt 2011, 22:01 geändert)

Text an verankertem Rahmen einfügen

-hans-
Beiträge gesamt: 748

10. Okt 2011, 22:02
Beitrag # 9 von 13
Beitrag ID: #482059
Bewertung:
(3244 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
 

edit: Ups, Martins Beitrag auch nicht ... gelesen vor dem Post ...


Hallo Johannes,

Deinen letzten Beitrag lese ich gerade erst, daher hier kein Bezug darauf ...

Es geht auch ohne assoziativen Array ...

Ausgehend von 10 Zeilen, die mindestens zw. Überschrift und Überschrift vorhanden sein müssen, inklusive Überschrift:

Code
#target InDesign   
var pStyleName = "hdl"; //HdlPstyle to search for ...
var theStoryLines = app.activeDocument.stories[0].lines; // Als Bsp. hier mal nur für eine story ... sorry
var linesArray = new Array ();

for (i=0; i < theStoryLines.length; i++){
var theLine = theStoryLines[i].appliedParagraphStyle.name;
if(theLine == pStyleName){
linesArray.push(i)
}
}

for (l= linesArray.length -1; l > 0 ; l--){
var nbr01 = linesArray[l];
var nbr02 = linesArray[l-1];
var theCount = nbr01 - nbr02
if (theCount < 10){ // zehn Zeilen inklusive Überschrift
var addP = 10 - theCount;

myString = "" //create returns
for (c = 0; c < addP; c++){
myString = myString + "\r"
}

toAdd = app.activeDocument.stories[0].lines[nbr01-1].insertionPoints.lastItem();
toAdd.contents = myString
}
}


Hoffe es funzt ... bin wohl gerade nicht in Topform ;-)

Tschöle

Hans-Gerd Claßen


als Antwort auf: [#482056]
(Dieser Beitrag wurde von Martin Fischer am 11. Okt 2011, 11:56 geändert)

Text an verankertem Rahmen einfügen

Martin Fischer
  
Beiträge gesamt: 12783

10. Okt 2011, 22:20
Beitrag # 10 von 13
Beitrag ID: #482061
Bewertung:
(3230 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Johannes,

ein Nachtrag.

Dieser Ansatz funktioniert nur, wenn sich zwischen zwei Headlines genau ein Absatz mit dem AF 'Absatzformat' befindet, dessen Zeilenzahl ausgewertet und ggf. erweitert wird. Stecken zwischen zwei Headlines mehr Absätze (und darunter einer oder mehrere mit AF 'Absatzformat'), funktioniert dieser Ansatz nicht mehr.

Deswegen wäre es in meinen Augen immer noch die sicherste Methode, die Zeilen zwischen zwei Headlines zu ermitteln und darauf zu reagieren.


als Antwort auf: [#482056]

Text an verankertem Rahmen einfügen

J.Puff
Beiträge gesamt: 238

10. Okt 2011, 22:46
Beitrag # 11 von 13
Beitrag ID: #482063
Bewertung:
(3218 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,
herzlichen Dank für die Erläuterung und die Lösung! So klappt es!

Beste Grüße
Johannes


als Antwort auf: [#482058]

Text an verankertem Rahmen einfügen

Martin Fischer
  
Beiträge gesamt: 12783

11. Okt 2011, 08:34
Beitrag # 12 von 13
Beitrag ID: #482071
Bewertung:
(3147 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Johannes,

prima, dass es klappt.

Mit der folgenden, etwas eleganteren Lösung, brauchst Du nicht alle Absätze eines Textabschnitts durchwandern und untersuchen.

Das Skript sucht die Absätze mit einem bestimmten Absatzformat und untersucht in einer Schleife rückwärts die Zeilenlänge aller Fundstellen.

Damit werden auch mehrere aufeinanderfolgende Absätze mit dem gesuchten Absatzformat als eine zu untersuchende Einheit behandelt und der letzte bekommt die zusätzlichen Zeilen angehängt.

Code
if (app.selection.length > 0 && app.selection[0].hasOwnProperty ('parentStory') ) 
{
addLines( app.selection[0].parentStory, 'Absatzformat', 5);
}


function addLines(_story, _pstyle, _expected_lines) // Textabschnitt, Name des Absatzformats, Zahl der erwarteten Zeilen
{
if (app.activeDocument.paragraphStyles.itemByName(_pstyle).isValid)
{
// der Textabschnitt soll mit einer leeren Absatzschaltung enden
if (_story.characters.lastItem().contents != '\r')
_story.insertionPoints.lastItem().contents = '\r';
app.findTextPreferences = null;
app.findTextPreferences.appliedParagraphStyle = _pstyle;
var _found = _story.findText();

// Schleife durch alle Fundstellen
for ( var i = _found.length-1; i>= 0; i-- )
{
while (_found[i].lines.length < _expected_lines ) // solange die Zahl der Fundstelle kleiner als erwartet
{
_found[i].insertionPoints[-2].contents = '\n'; // vor der Absatzschaltung Zeile ergänzen
}
}
app.findTextPreferences = null;
}
}



als Antwort auf: [#482063]

Text an verankertem Rahmen einfügen

J.Puff
Beiträge gesamt: 238

11. Okt 2011, 09:20
Beitrag # 13 von 13
Beitrag ID: #482077
Bewertung:
(3134 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Moin Martin,
danke für die verbesserte Version, die nun deutlich performanter ist.

Beste Grüße
Johannes


als Antwort auf: [#482071]
X