[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Marginalie aus Absatz autom. generieren

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

Marginalie aus Absatz autom. generieren

JoPie
Beiträge gesamt: 75

21. Mai 2015, 18:43
Beitrag # 1 von 13
Bewertung:
(7408 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Scripter,

folgende Aufgabe habe ich zu bewältigen:

Ein Dokument hat mehrere hundert Marginalien.
Die Marginalien sind als einzelner Absatz im Dokument vorhanden.
Dieser Marginalienabsatz besitzt das Absatzformat "X".

Nun möchte ich automatisiert diesen Absatz als Marginalie in einen Rahmen neben den Folgeabsatz gesetzt und mit diesem verknüpft haben.

Objektformat für Rahmen = marginalie
Absatzformat für Marginalabsatz = marginalie.

Folgendes sollte das Script beherrschen:
Textabschnitt durchsuchen und alle Absätze mit dem AF "X" in einen Rahmen kopieren,
Marginalrahmen das Objektformat "marginalie" zuweisen,
Absatz im Rahmen den AF "marginalie zuweisen",
den Marginalrahmen mit dem Folgeabsatz (Absatzanfang)verknüpfen.

Beispiel vorher/nachher habe ich angehängt.

Wäre so etwas möglich?


Bisher arbeite ich mit einem Script das dies teilweise beherrscht.
Nur muss ich den Marginaltext vorher markieren und dann das Script laufen lassen.
Sehr mühsam.
Script siehe unten (ich weiß leider nicht mehr wo es herkommt).

Zur Info:
Ich kann nicht scripten.
Arbeite mit ID SC6 unter Win 8.1.



#target InDesign
if (app.documents.length > 0 && app.selection.length > 0 && app.selection[0].hasOwnProperty ("baseline") && app.selection[0].constructor.name != "InsertionPoint") {
if (app.scriptPreferences.version >= 6 ) { // Ab CS4 Undo bereitstellen
app.doScript(createInlineText, ScriptLanguage.JAVASCRIPT , [], UndoModes.ENTIRE_SCRIPT, "Marginalie erstellen");
}
else {
createInlineText();
}
} else {
alert ("Bitte positionieren Sie den Cursor im Text!")
}

function createInlineText() {
var _dok = app.activeDocument;
var _sel = app.selection[0];
var _mtf = _sel.insertionPoints[0].textFrames.add();
if (app.scriptPreferences.version == 5) { //Nur CS3
_sel = _sel.parentStory.characters.itemByRange (_sel.insertionPoints[1].index,_sel.insertionPoints[-1].index + 1);
}
var _breite = 17.755;
var _hoehe = 20;
_mtf.geometricBounds = [0,0,_hoehe,_breite];
var _res = _sel.move(LocationOptions.AT_BEGINNING, _mtf);
_mtf.appliedObjectStyle = _dok.objectStyles.itemByName("marginalie");
//Rahmen an Textgröße ausgeschaltet
//_mtf.fit(FitOptions.FRAME_TO_CONTENT);
_mtf.paragraphs.everyItem().appliedParagraphStyle = _dok.paragraphStyles.itemByName("marginalie");
var _char = _mtf.parent;
var _pos = _char.index;
var _story = _char.parentStory;
if (_story.characters[_pos -1].contents == " " && _story.characters[_pos +1].contents == " " ) {
_story.characters[_pos + 1].remove();
}
}

Anhang:
HDS-nachher.idml (56.6 KB)   HDS-vorher.idml (52.1 KB)
X

Marginalie aus Absatz autom. generieren

Kai Rübsamen
Beiträge gesamt: 4684

21. Mai 2015, 19:59
Beitrag # 2 von 13
Beitrag ID: #539888
Bewertung:
(7391 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Jo,

es gibt ein Beispiel vorher / nachher. Sehr gut! :)
Aber: In deinem Beispiel 'vorher' gibt es dein Marginalabsatzformat noch nicht, das Objektformat heißt 'Marginalie' u. nicht 'marginalie', das Absatzformat ist nicht im Objektformat hinterlegt und die Position der Verankerung passt nicht.

Also: Erstmal alles richtig bauen, viell. noch Aufzählungen als Aufzählungen anlegen, der Erstzeileneinzug nach Überschrift raus u. die Headlines als echte Nummerierungen anlegen. Für die Marginalien sollte dann das funktionieren:

Code
/* - - - - -  Werte anpassen  - - - - -  */ 

var absatzformat = "dein Format";
var objektformat = "dein Format";
var breite = "30mm";
var hoehe = "10mm";

// - - - - - - - - - - - - - - - - - - - - -

// das aktive Dokument
var curDoc = app.documents[0];

// Zurücksetzen der Sucheinstellungen  
app.findGrepPreferences = app.changeGrepPreferences = null;
// Setzen der Sucheinstellungen  
app.findGrepPreferences.appliedParagraphStyle = absatzformat;

// Suchen und Ergebnisse in Variable speichern  
var results = curDoc.findGrep(true);

// Zurücksetzen der Sucheinstellungen  
app.findGrepPreferences = app.changeGrepPreferences = null;

// Den Text in einen neuen Rahmen verschieben  
for ( var n = 0; n < results.length; n++ ) {   
var curResult = results[n];
var a = curResult.insertionPoints[-1]; // der letzte Einfügepunkt
// Textrahmen wird am Anfang des nächsten Absatzes eingefügt
var newTf = a.textFrames.add( {geometricBounds: [0 ,0, hoehe, breite] } );
// das Objektformat zuweisen
newTf.appliedObjectStyle = curDoc.objectStyles.itemByName( objektformat );

// Die Fundstelle wird durch das Einfügen des Textrahmens um 1 Zeichen erweitert.
// Dieses muss vor dem Verschieben abgezogen werden, sonst erhält man einen Fehler!
var myTextToMove = curResult.characters.itemByRange( 0 , -1 );
// den Text in den neuen Rahmen verschieben
myTextToMove.move( LocationOptions.AFTER, newTf.insertionPoints[0] );
}



als Antwort auf: [#539885]

Marginalie aus Absatz autom. generieren

JoPie
Beiträge gesamt: 75

22. Mai 2015, 08:13
Beitrag # 3 von 13
Beitrag ID: #539898
Bewertung:
(7298 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Kai,

das ist ja der Hammer.
Und mit so wenig Programmcode.
Herzlichen Dank dafür.
Das spart Stunden mühsame Arbeit.
Die nächste Spende wird höher ausfallen.

Zwei Änderungswünsche hätte ich noch.
1. Kann das Absatzendezeichen im Marginalrahmen mitgelöscht werden. Das gibt dann weniger Übersatz und ist eleganter.
2. Könnte das Script statt das ganze Dokument zu durchsuchen, nur den aktuellen Textabschnitt durchsuchen.
Ich arbeite meist Abschnittsbezogen und oft werden fehlende Beiträge später nachgeschoben.
Dann kommt es mit der bisherigen Version zu einer Fehlermeldung.

PS: Deine Anmerkungen lasse ich mal unkommentiert.
Es war das Kundenmuster, was ich Quick&Dirty um die Marginalien erweitert habe.
Aber das Vorher-Dokument hätte ich besser aufbauen sollen.
Da hast du recht. Ich hatte mich nur auf nachher konzentriert.
Aber mit dem Dokument kann man ja nicht testen.
Ich werde demnächst mehr Sorgfalt walten lassen.

Gruß
JoPie


als Antwort auf: [#539888]

Marginalie aus Absatz autom. generieren

Kai Rübsamen
Beiträge gesamt: 4684

22. Mai 2015, 08:58
Beitrag # 4 von 13
Beitrag ID: #539901
Bewertung:
(7287 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Jo,

erstell mir bitte ein Beispieldokument 'vorher', wo alles richtig drin ist und ich ergänze dir das Skript so, wie du es haben möchtest.


als Antwort auf: [#539898]

Marginalie aus Absatz autom. generieren

JoPie
Beiträge gesamt: 75

22. Mai 2015, 09:28
Beitrag # 5 von 13
Beitrag ID: #539903
Bewertung:
(7277 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
So, bitte schön


als Antwort auf: [#539901]
Anhang:
HDS-vorher1.idml (57.5 KB)

Marginalie aus Absatz autom. generieren

Kai Rübsamen
Beiträge gesamt: 4684

22. Mai 2015, 09:58
Beitrag # 6 von 13
Beitrag ID: #539906
Bewertung:
(7268 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Versuch es mal so:

Code
/* - - - - -  Werte anpassen  - - - - -  */ 

var absatzformat = "marginalie";
var objektformat = "marginalie";
var breite = "30mm";
var hoehe = "10mm";

// - - - - - - - - - - - - - - - - - - - - -

// das aktive Dokument
var curDoc = app.documents[0];

// die Auswahl
var curSel = app.selection[0];

// prüfen, ob etwas ausgewählt ist
if (curSel == undefined) {
alert ("Achtung:\rBitte einen Textrahmen auswählen oder \rden Cursor in einen Textabschnitt stellen.", "Stop");
exit();
}
// je nach Art der Auswahl, den Textabschnitt ermitteln
if (curSel.hasOwnProperty("baseline")) {
var curStory = curSel.parentStory;
}
else if (curSel.constructor.name == "TextFrame") {
var curStory = curSel.parentStory;
}
else {
alert ("Bitte einen Textrahmen auswählen.", "Stop");
exit();
}

// Zurücksetzen der Sucheinstellungen  
app.findGrepPreferences = app.changeGrepPreferences = null;
// Setzen der Sucheinstellungen  
app.findGrepPreferences.appliedParagraphStyle = absatzformat;

// Suchen und Ergebnisse in Variable speichern  
var results = curStory.findGrep(true);  

// Den Text in einen neuen Rahmen verschieben  
for ( var n = 0; n < results.length; n++ ) {   
var curResult = results[n];
var a = curResult.insertionPoints[-1]; // der letzte Einfügepunkt
// Textrahmen wird am Anfang des nächsten Absatzes eingefügt
var newTf = a.textFrames.add( {geometricBounds: [0 ,0, hoehe, breite] } );
// das Objektformat zuweisen
newTf.appliedObjectStyle = curDoc.objectStyles.itemByName( objektformat );

// Die Fundstelle wird durch das Einfügen des Textrahmens um 1 Zeichen erweitert.
// Dieses muss vor dem Verschieben abgezogen werden, sonst erhält man einen Fehler!
var myTextToMove = curResult.characters.itemByRange( 0 , -1 );
// den Text in den neuen Rahmen verschieben
myTextToMove.move( LocationOptions.AFTER, newTf.insertionPoints[0] );

// die überflüssigen Returns im Absatzformat 'marginalie' löschen  
app.findGrepPreferences.findWhat = "\r+";
app.changeGrepPreferences.changeTo = "";
newTf.paragraphs[0].changeGrep();
}

// Zurücksetzen der Sucheinstellungen  
app.findGrepPreferences = app.changeGrepPreferences = null;



als Antwort auf: [#539903]

Marginalie aus Absatz autom. generieren

JoPie
Beiträge gesamt: 75

22. Mai 2015, 10:29
Beitrag # 7 von 13
Beitrag ID: #539909
Bewertung:
(7232 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ja super,

so habe ich mir das gewünscht.

Mal schauen, ob bei der Auftragsbearbeitung noch Überraschungen auftauchen.
Das wird aber erst nächste Woche sein.

Nocheinmal herzlichen Dank dafür.

Gruß
JoPie


als Antwort auf: [#539906]

Marginalie aus Absatz autom. generieren

Kai Rübsamen
Beiträge gesamt: 4684

22. Mai 2015, 18:51
Beitrag # 8 von 13
Beitrag ID: #539929
Bewertung:
(7117 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Jo,

dann nimm mal diese Version. Hier werden auch mehrere Returns am Schluss berücksichtigt und der Rahmen wird gleich an seinen Inhalt angepasst:

Code
/* - - - - -  Werte anpassen  - - - - -  */ 

var absatzformat = "marginalie";
var objektformat = "marginalie";
var breite = "30mm";
var hoehe = "10mm";

// - - - - - - - - - - - - - - - - - - - - -

// das Dokument im Vordergrund
var curDoc = app.documents[0];

// die Auswahl
var curSel = app.selection[0];

// prüfen, ob etwas ausgewählt ist
if (curSel == undefined) {
alert ("Achtung:\rBitte einen Textrahmen auswählen oder \rden Cursor in einen Textabschnitt stellen.", "Stop");
exit();
}
// je nach Art der Auswahl, den Textabschnitt ermitteln
if (curSel.hasOwnProperty("baseline")) {
var curStory = curSel.parentStory;
}
else if (curSel.constructor.name == "TextFrame") {
var curStory = curSel.parentStory;
}
else {
alert ("Bitte einen Textrahmen auswählen.", "Stop");
exit();
}

// Zurücksetzen der Sucheinstellungen  
app.findGrepPreferences = app.changeGrepPreferences = null;
// Setzen der Sucheinstellungen  
app.findGrepPreferences.appliedParagraphStyle = absatzformat;

// Suchen und Ergebnisse in Variable speichern  
var results = curStory.findGrep(true);  

// Den Text in einen neuen Rahmen verschieben  
for (var n = 0; n < results.length; n++) {   
var curResult = results[n];
var a = curResult.insertionPoints[-1]; // der letzte Einfügepunkt
// Textrahmen wird am Anfang des nächsten Absatzes eingefügt
var newTf = a.textFrames.add( {geometricBounds: [0 ,0, hoehe, breite] } );
// das Objektformat zuweisen
newTf.appliedObjectStyle = curDoc.objectStyles.itemByName(objektformat);

// Die Fundstelle wird durch das Einfügen des Textrahmens um 1 Zeichen erweitert.
// Dieses muss vor dem Verschieben abgezogen werden, sonst erhält man einen Fehler!
var myTextToMove = curResult.characters.itemByRange(0 , -1);
// den Text in den neuen Rahmen verschieben
myTextToMove.move( LocationOptions.AFTER, newTf.insertionPoints[0] );

// die überflüssigen Returns im Absatzformat 'marginalie' löschen
while (newTf.parentStory.characters[-1].contents == "\r") {
newTf.parentStory.characters[-1].contents = "";
}
// den Textrahmen an den Inhalt anpassen
fitFrame(newTf)
}

// Zurücksetzen der Sucheinstellungen  
app.findGrepPreferences = app.changeGrepPreferences = null;

function fitFrame(/*TextFrame*/frame, /*int*/tempResizediff) {
if (tempResizediff == null) {
tempResizediff = 50;
}
var gB = frame.geometricBounds;
// temp. einen anderen Wert zuweisen
gB[2] += tempResizediff;
frame.geometricBounds = gB;

var lastBaseLine = frame.lines.lastItem().baseline;
gB[2] = lastBaseLine;
frame.geometricBounds = gB;
return;
}



als Antwort auf: [#539909]
(Dieser Beitrag wurde von Kai Rübsamen am 22. Mai 2015, 18:53 geändert)

Marginalie aus Absatz autom. generieren

JoPie
Beiträge gesamt: 75

22. Mai 2015, 19:04
Beitrag # 9 von 13
Beitrag ID: #539930
Bewertung:
(7109 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Kai,

das wird ja immer eleganter.
Toll.

Gruß und schöne Pfingsttage
JoPie


als Antwort auf: [#539929]

Marginalie aus Absatz autom. generieren

tntypography
Beiträge gesamt: 4

10. Feb 2016, 16:14
Beitrag # 10 von 13
Beitrag ID: #546868
Bewertung:
(6083 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,
Ich würde dieses Script gerne anpassen um anstatt Absatzformaten persische Ziffern am Absatzbeginn zu finden und in die Marginalien zu kopieren.

Meine Vermutung war, dass ich dafür nur diese Zeile:

Code
app.findGrepPreferences.appliedParagraphStyle = absatzformat; 


zu dieser ändern müsste:
Code
app.findGrepPreferences.findWhat = "(^\t[&#1777;&#1778;&#1779;&#1780;&#1781;&#1782;&#1783;&#1784;&#1785;&#1776;][&#1777;&#1778;&#1779;&#1780;&#1781;&#1782;&#1783;&#1784;&#1785;&#1776;][&#1777;&#1778;&#1779;&#1780;&#1781;&#1782;&#1783;&#1784;&#1785;&#1776;])"; // Finde 3-stellige persische Zahlen nach Tabulator am Absatzbeginn 


Auf jeden Fall bekomme ich davon unabhängig, also auch mit dem Script wie es hier gepostet ist den folgenden Fehler:

JavaScript Error!

Error Number: 30614
Error String: Invalid object for this request

Engine: main
File... das script
Line: 46
Source: var newTf = a.textFrames.add( {geometricBounds:[0 ,0, hoehe, breite] } );

InDesign ist CC 2015.2, OSX 10.11.3

Mit Dank im Voraus,
Titus


als Antwort auf: [#539929]

Marginalie aus Absatz autom. generieren

Kai Rübsamen
Beiträge gesamt: 4684

10. Feb 2016, 17:35
Beitrag # 11 von 13
Beitrag ID: #546879
Bewertung:
(6047 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Titus,

ich rate mal, dass es in der Variablen 'a' etwas anderes ankommt, als erwartet. Stelle mir bitte ein Testdokument per PM zur Verfügung mit Stand vorher (wo der Fehler passiert) und nachher (wie es final aussehen soll). Danke.


als Antwort auf: [#546868]

Marginalie aus Absatz autom. generieren

tntypography
Beiträge gesamt: 4

10. Feb 2016, 20:42
Beitrag # 12 von 13
Beitrag ID: #546889
Bewertung:
(6005 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Kai,

vielen Dank für die prompte Antwort. Ich habe dank deines Hinweises nochmals überprüft ob ich alles richtig gemacht habe, und siehe da, irgendwas war in meinem Dokument falsch. Tatsächlich funktioniert das script mit meiner minimal Änderung genau so wie ich es brauche, herzlichen Dank dafür!

Ich werde jetzt versuchen einen Dialog der nach der zu suchenden Variablen frägt einzubauen, sollte es mir gelingen werde ich es hier wieder posten.

Grüße!
t


als Antwort auf: [#546879]

Marginalie aus Absatz autom. generieren

tntypography
Beiträge gesamt: 4

11. Feb 2016, 08:15
Beitrag # 13 von 13
Beitrag ID: #546892
Bewertung:
(5894 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Kai,

habe also ein Bißchen herumprobiert und es ist mir gelungen das script mit einem Dialog der den zu suchenden string abfrägt auszustatten. Es ist zusammengestöpselt aus deinem und InDesign Beispiel scripten, ginge also sicher auch eleganter, aber es funktioniert.

Danke nochmal fürs zur Verfügung stellen.

Titus

Code
/* - - - - -  Werte anpassen  - - - - -  */  

var objektformat = "marginalie";
var breite = "30mm";
var hoehe = "10mm";

// - - - - - - - - - - - - - - - - - - - - -

// das Dokument im Vordergrund
var curDoc = app.documents[0];

// die Auswahl
var curSel = app.selection[0];

// prüfen, ob etwas ausgewählt ist
if (curSel == undefined) {
alert ("Achtung:\rBitte einen Textrahmen auswählen oder \rden Cursor in einen Textabschnitt stellen.", "Stop");
exit();
}
// je nach Art der Auswahl, den Textabschnitt ermitteln
if (curSel.hasOwnProperty("baseline")) {
var curStory = curSel.parentStory;
}
else if (curSel.constructor.name == "TextFrame") {
var curStory = curSel.parentStory;
}
else {
alert ("Bitte einen Textrahmen auswählen.", "Stop");
exit();
}

// Zurücksetzen der Sucheinstellungen
app.findGrepPreferences = app.changeGrepPreferences = null;

// Öffne Dialog um Suchbegriff zu definieren
main();
function main(){
mySetup();
mySnippet();
myTeardown();
}
function mySetup(){
}
function mySnippet(){

var myDialog = app.dialogs.add({name:"Define GREP string",canCancel:true});
with(myDialog){

// Öffne Dialog
with(dialogColumns.add()){

// Füge Textfeld ein
var myTextEditField = textEditboxes.add({editContents:"What do you seek?", minWidth:180});
}
}

// Zeige den Dialog
var myResult = myDialog.show();
if(myResult == true){

// Definiere den Suchbegriff als Inhalt des Textfelds
var myString = myTextEditField.editContents;

// Setzen der Sucheinstellungen
app.findGrepPreferences.findWhat = myString;

// Suchen und Ergebnisse in Variable speichern
var results = curStory.findGrep(true);

// Den Text in einen neuen Rahmen verschieben
for (var n = 0; n < results.length; n++) {
var curResult = results[n];
var a = curResult.insertionPoints[-1]; // der letzte Einfügepunkt
// Textrahmen wird am Anfang des nächsten Absatzes eingefügt
var newTf = a.textFrames.add( {geometricBounds: [0 ,0, hoehe, breite] } );
// das Objektformat zuweisen
newTf.appliedObjectStyle = curDoc.objectStyles.itemByName(objektformat);

// Die Fundstelle wird durch das Einfügen des Textrahmens um 1 Zeichen erweitert.
// Dieses muss vor dem Verschieben abgezogen werden, sonst erhält man einen Fehler!
var myTextToMove = curResult.characters.itemByRange(0 , -1);
// den Text in den neuen Rahmen verschieben
myTextToMove.move( LocationOptions.AFTER, newTf.insertionPoints[0] );

// die überflüssigen Returns im Absatzformat 'marginalie' löschen
while (newTf.parentStory.characters[-1].contents == "\r") {
newTf.parentStory.characters[-1].contents = "";
}
// den Textrahmen an den Inhalt anpassen
fitFrame(newTf)
}
}

// Lösche den Dialog aus dem Speicher
myDialog.destroy();

}
function myTeardown(){
}

// Zurücksetzen der Sucheinstellungen
app.findGrepPreferences = app.changeGrepPreferences = null;

function fitFrame(/*TextFrame*/frame, /*int*/tempResizediff) {
if (tempResizediff == null) {
tempResizediff = 50;
}
var gB = frame.geometricBounds;
// temp. einen anderen Wert zuweisen
gB[2] += tempResizediff;
frame.geometricBounds = gB;

var lastBaseLine = frame.lines.lastItem().baseline;
gB[2] = lastBaseLine;
frame.geometricBounds = gB;
return;
}



als Antwort auf: [#546879]
X