Hallo Marco,
Antwort auf: Oder ist die Idee, dass die Rahmen platziert werden und bei Bedarf manuell aufgezogen/verschoben werden, damit sie Text verdrängen?
So weit ich verstanden habe, soll der verdrängende Textrahmen verhindern, dass InDesign sich bei einer nachträglichen Neuberechnung des Fußnotenbereichs wg. Berücksichtigung der Schusterjungen-Regel verhaspelt und auf Grund dieses gescheiterten Neuberechnungsprozesses den folgenden Textrahmen leert.
Deswegen soll das Anlegen der verdrängenden Textrahmen selbst nichts am status quo ändern, sondern helfen, diesen zu bewahren.
Das setzt voraus, dass der Fehlerteufel vor dem Anlegen der verdrängenden Textrahmen noch nicht zugeschlagen hat.
Das setzt aber auch voraus, dass der Umbruch vor dem Anlegen der verdrängenden Textrahmen im Wesentlichen abgeschlossen ist.
Der verdrängende Textrahmen ist als eine Art
Stützstrumpf, wie man ihn zur Symptombehandlung von
Krampfadern kennt, zu betrachten.
Hier der Entwurf eines solchen Stützstrumpfs für InDesign CS5 (vor Ausführung Cursor in Textabschnitt platzieren oder Textrahmen auswählen).
//verdrängenderTextrahmenUeberFussnotenbereich.jsx
//DESCRIPTION:Erstellt verdrängende Textrahmen über Fußnotenbereich
Object.prototype.isText = function()
{
switch(this.constructor.name)
{
case "InsertionPoint":
case "Character":
case "Word":
case "TextStyleRange":
case "Line":
case "Paragraph":
case "TextColumn":
case "Text":
case "TextFrame":
return true;
default :
return false;
}
}
if (app.selection.length > 0 && app.selection[0].isText())
{
var space_tolerance = 1;
var d = app.documents.firstItem();
var s = app.selection[0].parentStory;
check_frames(s.textContainers);
var layer_name = 'Textverdränger';
if (d.layers.itemByName(layer_name).isValid)
d.layers.itemByName(layer_name).remove();
var v_layer = d.layers.add({name:layer_name});
v_layer.move(LocationOptions.AT_BEGINNING);
for (var i = 0; i < s.textContainers.length; i++)
{
var tc = s.textContainers;
if (tc.lines.length > 0)
{
var gb = tc.geometricBounds;
var tc_bottom = tc.lines.lastItem().baseline;
var tgb = [tc_bottom + space_tolerance, gb[1], gb[2], gb[3]];
if (tgb[2] > tgb[0])
{
var t = tc.parentPage.textFrames.add(
{
geometricBounds: tgb,
itemLayer: v_layer,
textWrapPreferences:
{
textWrapMode : TextWrapModes.NEXT_COLUMN_TEXT_WRAP,
}
}
);
t.textWrapPreferences.textWrapOffset = 0; //Konturenführung Versatz oben
}
}
}
v_layer.locked = true;
}
else
alert('Bitte Textabschnitt auswählen.');
function check_frames( all_frames )
{
for (var i = 0; i < all_frames.length; i++)
{
if (all_frames.characters.length == 0)
selectIt(all_frames, 'Dieser Textrahmen scheint leer zu sein');
}
}
function selectIt( theObj, theMessage )
{
// wählt das übergebene Objekt aus und zoomt es heran (wechselt dabei ggf. die Seite)
var myZoom = app.activeWindow.zoomPercentage; // Zoomfaktor bei Bedarf auch fester Wert: 400;
app.select(theObj,SelectionOptions.replaceWith);
app.activeWindow.zoomPercentage = myZoom;
// Option zum Abbruch, falls innerhalb einer Schleife aufgerufen
var myChoice = confirm (theMessage + '\rWeiter?' );
if (myChoice == false)
exit();
return app.selection[0];
}
In der Zeile
var space_tolerance = [#cc0000]1;[/#0000cc] wird eine kleine Toleranz für den Bereich zwischen Grundlinie der letzten Textzeile und Oberkante des verdrängenden Textrahmens definiert. Hier
1 Einheit der aktiven Maßeinheit.
Damit soll verhindert werden, dass der verdrängende Textrahmen direkt an die Unterkante anstößt.
Das Skript legt eine neue Ebene 'Textverdränger' an, auf der später die verdrängenden Textrahmen angelegt werden.
Diese Ebene ist nach Beendigung des Skripts gesperrt, damit man beim Versuch, Fußnotentext zu bearbeiten, nicht in dem verdrängenden Rahmen hängen bleibt.
Bei der nächsten Ausführung des Skripts wird diese Ebene mit allen sich auf ihr befindlichen Objekten gelöscht!
Man sollte also darauf achten, dass auf dieser Ebene nichts anderes als diese verdrängenden Textrahmen erzeugt werden. Da die Ebene nach Beendigung des Skripts gesperrt ist, besteht die Gefahr erst dann, wenn ein Dussel die Sperrung aufhebt. ;-)
Im Skript enthalten ist eine Prüfung auf leere Textrahmen in den verketteten Textrahmen. Diese Prüfung ist der Anlage der Ebene und der verdrängenden Textrahmen vorgeschaltet. Wird das Skript fündig, bietet es an, die weitere Ausführung abzubrechen. Das Dokument bleibt in diesem Fall unverändert.