[GastForen Programme Print/Bildbearbeitung Adobe InDesign (beschränkter) vertikaler Keil

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

(beschränkter) vertikaler Keil

Martin Fischer
  
Beiträge gesamt: 12778

20. Okt 2005, 09:12
Beitrag # 1 von 5
Bewertung:
(17110 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Anlaß meiner Anfrage bzgl. 10-tel Schritte in Paletten (http://www.hilfdirselbst.ch/...i?post=191410#191410) war die Suche nach einer Möglichkeit, Absätze in kleineren als 1mm-Schritten auszutreiben, so daß Seiten, auf welchen der Text nicht ganz bis zur Satzspiegelunterkante reicht, manuell "aufgefüllt" werden können.

In dem genannten Thread wurden auch Tastaturlösungen vorgestellt und dokumentiert.

Allerdings stellte mich diese manuelle Lösung nicht restlos zufrieden, so daß ich den Versuch unternahm, die proportionale Verteilung des übrigen Raums auf Absätze mit Abständen oben und/oder unten per Skript zu lösen: Der Abstand sollte nicht gleichmäßig / linear zwischen den Absätzen verteilt werden, sondern relativ zu der ursprünglichen Größe der Abstände. Dort, wo kein Abstand oben oder unten ist, sollte nicht ausgetrieben werden.

Der InDesign-eigene "vertikale Keil" aus den Textrahmenoptionen taugt für meine Zwecke nicht, da er auch zwischen Absätzen, die keinen Abstand oben/unten aufweisen, austreibt und im schlimmsten Fall auch noch den Durchschuß (Zeilenabstand) erhöht.

Hier das Ergebnis meiner Versuche, einen beschränkten vertikalen Keil nachzubilden:

Code
// vertikalerKeil.js 
//
// ... treibt die Abstände der Absätze proportional zu den ursrpünglichen Werten aus,
// um den ausgewählten Textrahmen vertikal zu füllen.
//
// Vor dem Start des Skripts muß ein Textrahmen ausgewählt sein (sonst läuft nix)
//
// ein Objekt ausgewält?
if (app.selection.length > 0) {
// Schleife für mehrere Objekte
for (myObject = 0; myObject < app.selection.length; myObject++){
// ist das Objekt ein Textrahmen
if (app.selection[0].constructor.name == "TextFrame"){
var mySpace = 0;
var myFrame = app.selection[myObject];
var myPs = myFrame.paragraphs;
// untere Textrahmenkante
var myBottom = myFrame.geometricBounds[2];
// Grundlinie letzte Zeile
var myBaseline = myFrame.lines[-1].characters[-1].baseline;
var myDiff = myBottom - myBaseline;

// Addition der Abstände VOR den Absätzen
// der Abstand des ersten Absatzes wird nicht berücksichtigt
for (oneP = 1; oneP < myPs.length; oneP++){
mySpace += myPs[oneP].spaceBefore
}

// Addition der Abstände NACH den Absätzen
// der Abstand des letzten Absatzes wird nicht berücksichtigt
for (oneP = 0; oneP < myPs.length-1; oneP++){
mySpace += myPs[oneP].spaceAfter
}

// Berechnung des Zuschlagfaktors
var myFactor = myDiff/mySpace

// Proportionale Verteilung des zu verteilenden Raums auf die Abstände VOR den Absätzen
// erweitert wird nur dort, wo bereits Abstand drin ist
// der Abstand des ersten Absatzes wird nicht berücksichtigt
for (oneP = 1; oneP < myPs.length; oneP++){
if (myPs[oneP].spaceBefore > 0){
myPs[oneP].spaceBefore += myPs[oneP].spaceBefore*myFactor
}
}
// Proportionale Verteilung des zu verteilenden Raums auf die Abstände NACH den Absätzen
// erweitert wird nur dort, wo bereits Abstand drin ist
// der Abstand des letzten Absatzes wird nicht berücksichtigt
for (oneP = 0; oneP < myPs.length-1; oneP++){
if (myPs[oneP].spaceAfter > 0){
myPs[oneP].spaceAfter += myPs[oneP].spaceAfter*myFactor
}
}
}
else {
alert("Fehler \nKeinen Textrahmen erwischt, \nsondern (in english) \"" + app.selection[0].constructor.name + "\"!")
}
}
}
else {
alert("Welcher Textrahmen darf's denn sein?")
}

//alert(mySpace)

Das Skript orientiert sich nicht an der Satzspiegelunterkante (unterer Rand) eines Dokuments, sondern an der unteren Kante eines Textrahmens.

Vor dem Start muß mindestens ein Textrahmen ausgewählt werden.

Die Ausführungsgeschwindigkeit läßt noch zu wünschen übrig.
Möglicherweise läßt sich da noch etwas beschleunigen.
Aber ansonsten scheint das Skript seinen Job zu erledigen.
Ich bin offen für Kritik und Änderungsvorschläge.
X

(beschränkter) vertikaler Keil

Martin Fischer
  
Beiträge gesamt: 12778

31. Jan 2006, 01:04
Beitrag # 2 von 5
Beitrag ID: #208066
Bewertung:
(16917 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Auf der Suche nach einer passenden Bezeichnung für einen vertikalen Keil, der die Zeilen nicht austreibt, sondern einbringt, bin ich in der "Detailtypographie" von Forssman/de Jong auf folgende Feststellung gestoßen:

Zitat "Der vertikale Textkeil bringt mehr Probleme als er löst.
Ein so unschöner und störender Eingriff in die Seite ist viel schwerer zu ertragen als ein Hurenkind - und als ein Schusterjunge sowieso."


Manchmal aber ist der Wunsch des Auftraggebers gewichtiger als die Ästhetik.

Aus aktuellem Anlaß suchte ich nach einer Lösung, nicht Zeilen auszutreiben, sondern auch einzubringen. Den Arbeitstitel "vertikalesVakuum.jsx" habe ich nach der Konsultation von Forssman/de Jong zugunsten eines erweiterten "vertikalerKeil.jsx", also "vertikalerKeil_xl.jsx" verworfen.

Austreiben
Das folgende Skript vertikalerKeil_xl.js treibt dann Absätze proportional aus, wenn die Unterkante des/der ausgewählten Textrahmen(s) oberhalb oder auf dem unteren Seitenrand steht.
Anders: Die untere Textrahmenkante ist die Bezugslinie.

Einbringen
Das Skript bringt dann Zeilen proportional ein, wenn die Unterkante des/der ausgewählten Textrahmen(s) unterhalb des unteren Seitenrands steht.
Das Skript versucht, die Grundlinie der letzten Textzeile auf den unteren Satzspiegelrand zu bringen. Wenn nicht genügend Raum zum Einbringen vorliegt, dann erscheint eine Fehlermeldung.
Anders: Der untere Seitenrand ist die Bezugslinie.

Bin gespannt auf Eure Erfahrungen und Kritik.
Das Skript hat meine Tests bestanden. Aber vielleicht habe ich etwas übersehen.

Code
// vertikalerKeil_xl.jsx 
//DESCRIPTION: bringt die Abstände der Absätze proportional zu den ursrpünglichen Werten ein oder treibt sie aus, um den ausgewählten Textrahmen vertikal zu füllen.
// Vor dem Start des Skripts muß ein Textrahmen ausgewählt sein (sonst läuft nix)
//
// ein Objekt ausgewählt?
if (app.selection.length > 0) {
// Schleife für mehrere Objekte
for (myObject = 0; myObject < app.selection.length; myObject++){
// ist das Objekt ein Textrahmen
if (app.selection[0].constructor.name == "TextFrame"){
var mySpace = 0;
var myFrame = app.selection[myObject];
var myPs = myFrame.paragraphs;

// untere Textrahmenkante
myPage = app.activeWindow.activePage;
myDoc = app.documents[0];
// Wenn die untere Textrahmenkante über dem unteren Seitenrand liegt, dann ist diese die Bezugslinie zum Austreiben
if ((myFrame.geometricBounds[2] < myDoc.documentPreferences.pageHeight - myPage.marginPreferences.bottom) )
{
var myBottom = myFrame.geometricBounds[2];
}
// Wenn die untere Textrahmenkante auf dem unteren Seitenrand oder darunter liegt,
// dann ist der untere Seitenrand die Bezugslinie zum Austreiben
else
{
var myBottom = myDoc.documentPreferences.pageHeight - myPage.marginPreferences.bottom;
}

// Grundlinie letzte Zeile
var myBaseline = myFrame.lines[-1].characters[-1].baseline;
var myDiff = myBottom - myBaseline;

// Addition der Abstände VOR den Absätzen
// der Abstand des ersten Absatzes wird nicht berücksichtigt
for (oneP = 1; oneP < myPs.length; oneP++){
mySpace += myPs[oneP].spaceBefore
}

// Addition der Abstände NACH den Absätzen
// der Abstand des letzten Absatzes wird nicht berücksichtigt
for (oneP = 0; oneP < myPs.length-1; oneP++){
mySpace += myPs[oneP].spaceAfter
}

if (myDiff*-1 > mySpace)
{
alert("Sorry!\rZu wenig Raum, um den Text einzubringen.");
exit();
}
// Berechnung des Zuschlagfaktors
var myFactor = myDiff/mySpace

// Proportionale Verteilung des zu verteilenden Raums auf die Abstände VOR den Absätzen
// erweitert wird nur dort, wo bereits Abstand drin ist
// der Abstand des ersten Absatzes wird nicht berücksichtigt
for (oneP = 1; oneP < myPs.length; oneP++){
if (myPs[oneP].spaceBefore > 0){
myPs[oneP].spaceBefore += myPs[oneP].spaceBefore*myFactor
}
}
// Proportionale Verteilung des zu verteilenden Raums auf die Abstände NACH den Absätzen
// erweitert wird nur dort, wo bereits Abstand drin ist
// der Abstand des letzten Absatzes wird nicht berücksichtigt
for (oneP = 0; oneP < myPs.length-1; oneP++){
if (myPs[oneP].spaceAfter > 0){
myPs[oneP].spaceAfter += myPs[oneP].spaceAfter*myFactor
}
}
}
else {
alert("Fehler \nKeinen Textrahmen erwischt, \nsondern (in english) \"" + app.selection[0].constructor.name + "\"!")
}
}
}
else {
alert("Welcher Textrahmen darf's denn sein?")
}



als Antwort auf: [#191814]
(Dieser Beitrag wurde von Martin Fischer am 31. Jan 2006, 01:08 geändert)

(beschränkter) vertikaler Keil

r_how
Beiträge gesamt: 2

7. Aug 2020, 11:42
Beitrag # 3 von 5
Beitrag ID: #576397
Bewertung:
(10492 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin
Erstmal vielen Dank für dein Script, das du vor langer Zeit geteilt hast. Für mich seeehr praktisch! Erspart mir viel Gebastel!

Ich habe eine Frage dazu: Könnte man es eventuell auch abändern, so dass es nur in folgendem Fall den "Abstand danach" erweitert:

--> Nur bei zwei aufeinanderfolgenden Absätzen und dabei nur beim zweiten Absatz.

Dann wäre es für meinen Anwendungszweck perfekt :-)

Liebe Grüsse
Renato


als Antwort auf: [#191814]

(beschränkter) vertikaler Keil

Martin Fischer
  
Beiträge gesamt: 12778

7. Aug 2020, 12:02
Beitrag # 4 von 5
Beitrag ID: #576398
Bewertung:
(10480 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Renato,

Zitat --> Nur bei zwei aufeinanderfolgenden Absätzen und dabei nur beim zweiten Absatz.


Das verstehe ich nicht.
Fehlt da was?
Etwa: Zwei aufeinanderfolgende Absätze mit demselben Absatzformat?

Aus meiner Erfahrung kann ich spontan keine Situation erinnern, wo diese Anforderung Sinn machen würde.

Hast Du ein Beispiel, in dem die Situation erkenn- und nachvollziehbar wird?


als Antwort auf: [#576397]

(beschränkter) vertikaler Keil

r_how
Beiträge gesamt: 2

7. Aug 2020, 15:31
Beitrag # 5 von 5
Beitrag ID: #576408
Bewertung:
(10420 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin

Danke für die schnelle Antwort.

Zu deiner Frage: Nein es wäre nicht 2x das selbe Absatzformat.

Lass mich mein Fall kurz anhand eines Beispiels erklären:

[Absatzformat Lauftext] Non plaut re ressi tescimil modi volumque el min poria quae eos adi. [Absatz]
[Absatzformat Titel 1] [Absatz]
[Absatzformat Titel 1] Titel [Absatz]
[Absatzformat Lauftext] Non plaut re ressi tescimil modi volumque el min poria quae eos adi...

Bei der 2. Zeile im Beispiel handelt es sich lediglich um einen Platzhalter vor dem entsprechenden Titel. Dieser hat standardmässig das Absatzformat des nachfolgenden Titels, darf aber beim "Abstand danach" varieren und wird daher bei der Verteilung des Rest-Zwischenraums vorzugsweise verändert.

Zusammengefasst: Das Script sollte nur dann eingreifen, wenn 2 Absätze (egal welche) aufeinander folgen. Falls es diesen Fall nicht gibt, kann es wie von dir programmiert ablaufen.

Zitat und dabei nur beim zweiten Absatz.

... ist bei genauerer Betrachtung nicht nötig, da das Lauftext-Format sowieso 0mm "Abstand danach" hat.


Meine Frage ist nun, ob es für diesen spezifischen Fall eine nicht allzu aufwendige Lösung gäbe.


Liebe Grüsse
Renato


als Antwort auf: [#576398]
X