[GastForen Programme Print/Bildbearbeitung Adobe InDesign Merkeboxen/Textboxen im Fließtext - automatisch einfügen und mit Inhalt füllen.

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

Merkeboxen/Textboxen im Fließtext - automatisch einfügen und mit Inhalt füllen.

mojo_worker
Beiträge gesamt: 69

14. Aug 2008, 11:34
Beitrag # 1 von 17
Bewertung:
(4036 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Liebes Forum. Es gilt wieder, eine Menge Arbeit zu sparen:

Ich setze gerade ein Buch, das eine Unzahl von Merke- und anderen Boxen enthält. Bisher habe ich diese Boxen immer mit dem GREP-Code Suchen nach "(^(.+)\r)+" (Absatzformat: merke), ersetzen mit "~c$0" eingefügt - die Merkeboxen habe ich zuvor als ein-Objekt-Absatz in die Zwischenablage kopiert. Das funktioniert wunderbar, aber den entsprechenden Text, der dann im folgenden/den folgenden Absätzen platziert ist, musste ich anschließend immer noch von Hand in die Boxen kopieren. Nun ist die Zeit gekommen, dieser Fummelei ein Ende zu bereiten.

Ich werde versuchen, ein Skript zu schreiben, das mir diese Arbeit abnimmt. Ich denke, dass dies bei wissenschaftlichen Büchern eine der größten Arbeitserleichterungen ist, die einem das Scripting bescheren kann.

In der Suche und in der Skriptbibliothek habe ich hierzu nichts gefunden. Ich wusste allerdings auch nicht so direkt, wonach ich suchen soll. Falls es das also schon längst gibt, bitte ich um Nachricht, dann kann ich noch mehr Arbeit sparen ;-). Falls jemand sonst eine Anmerkung hat ist er in diesem Thread herzlich eingeladen, zu kommentieren.

Viele Grüße,

Pascal
X

Merkeboxen/Textboxen im Fließtext - automatisch einfügen und mit Inhalt füllen.

os_xxx
Beiträge gesamt: 206

14. Aug 2008, 11:49
Beitrag # 2 von 17
Beitrag ID: #362528
Bewertung:
(4020 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Pascal,

das finde ich prima, daß sich mal jemand dieses Thema vornimmt.
Ich freue mcih jetzt schon auf das Script.

Aber wie wird das Script wissen, was im eingehängten Textrahmen drinstehen soll?


als Antwort auf: [#362526]

Merkeboxen/Textboxen im Fließtext - automatisch einfügen und mit Inhalt füllen.

Marco Morgenthaler
Beiträge gesamt: 2474

14. Aug 2008, 12:05
Beitrag # 3 von 17
Beitrag ID: #362531
Bewertung:
(4006 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf [ os_xxx ] Aber wie wird das Script wissen, was im eingehängten Textrahmen drinstehen soll?


Über ein Absatzformat zum Beispiel (vgl. Pascals GREP). Alle zusammenhängenden Absätze eines AF gehören in die Box.

Was aber, wenn der Text, der in die Box soll, über 2 Seiten läuft?

Eine verwandte Diskussion wurde erst kürzlich geführt: http://www.hilfdirselbst.ch/..._P361559.html#361559

Evtl. wäre es einfacher, Text in eine einspaltige Tabelle umzuwandeln …

Gruss, Marco


als Antwort auf: [#362528]

Merkeboxen/Textboxen im Fließtext - automatisch einfügen und mit Inhalt füllen.

mojo_worker
Beiträge gesamt: 69

14. Aug 2008, 12:15
Beitrag # 4 von 17
Beitrag ID: #362536
Bewertung:
(3998 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Bei meinen Büchern sind die Absätze immer mit einem eindeutigen Format belegt und folgen nach Einsatz des GREP-Durchlaufs direkt auf die Box. Die Boxen habe ich immer als Tabellen realisiert, nicht als eingebettete Textrahmen. Macht aber, denke ich, auch keinen großen Unterschied.

Falls das eindeutige Absatzformat nicht gegeben ist, könnte man immer noch eine Orientierung anhand des Schriftbildes vornehmen, da der Text für solche Boxen ja meistens einen halben Punkt bis 1 Punkt kleiner ist und evtl auch in einer anderen Schriftart steht. Ich für meinen Teil werde mich aber erstmal am Absatzformat orientieren.

Die Boxen suche ich anhand eines eindeutigen Strings, in jeder Box steht zu Zeit noch der Platzhalter #merketext#.

Ich hoffe, das wird klappen :-).


als Antwort auf: [#362528]

Merkeboxen/Textboxen im Fließtext - automatisch einfügen und mit Inhalt füllen.

Marco Morgenthaler
Beiträge gesamt: 2474

14. Aug 2008, 12:34
Beitrag # 5 von 17
Beitrag ID: #362541
Bewertung:
(3981 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Mojo

Wenn du schon mit Tabellen arbeitest, warum kopierst du dann den Text nachträglich in die Tabellenzelle? Wäre es nicht einfacher, den ausgewählten Text direkt in eine einspaltige Tabelle mit geeignetem Tabellenformat umzuwandeln?

Da die letzte Absatzmarke \r in einer Tabelle störend ist, müsste der GREP etwas angepasst werden:
(^(.+)$)(\r(.+)$)*

Sucht ein oder mehrere Absätze eines bestimmten Formats (Formatsuche definieren) ohne das letzte Absatzzeichen \r.

Der oder die markierten Absätze in eine Tabelle umwandeln (Tabelle > Text in Tabelle umwandeln).

Vielleicht lässt sich darauf aufbauend ein Skript realisieren, aber da muss ich passen.

Gruss, Marco


als Antwort auf: [#362536]
(Dieser Beitrag wurde von Marco Morgenthaler am 14. Aug 2008, 12:35 geändert)

Merkeboxen/Textboxen im Fließtext - automatisch einfügen und mit Inhalt füllen.

mojo_worker
Beiträge gesamt: 69

14. Aug 2008, 12:38
Beitrag # 6 von 17
Beitrag ID: #362543
Bewertung:
(3975 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Das wäre eine Lösung, wenn ich nur simpel hinterlegte Textblöcke bräuchte. Die Tabellen sind jedoch nichtmal einspaltig, sondern zweispaltig (linke Spalte bildet einen Senkrechten Strich, oder es gibt eine spezielle Kopfzeile und solche Sachen) - von daher ist für meinen Fall eine Skriptlösung die einzig mögliche denke ich.

Bin schon fließig am probieren. Toi toi.


als Antwort auf: [#362541]

Merkeboxen/Textboxen im Fließtext - automatisch einfügen und mit Inhalt füllen.

mojo_worker
Beiträge gesamt: 69

14. Aug 2008, 13:21
Beitrag # 7 von 17
Beitrag ID: #362550
Bewertung:
(3945 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hilfe! Martin! Oder andere Kompetenzinstanzen hier: ich hänge schon am Ersten Problem fest. Ich schaffe es nicht, den übergeordneten Absatz der Tabelle in die der Text soll, anzusprechen. Der Datenbrowser liefert mir kein wirklich aufschlussreiches Element. myFoundItems.parent.parent spricht die Tabelle an. myFoundItems.parent.parent.paragraphs gibt es nicht, myFoundItems.parent.parent.index gibt denke ich bloß an, um die wievielte Tabelle es sich handelt.? myFoundItems.parent.parent.parent ist der Textrahmen (TextFrame). Wenn ich InsertionPoints im Datenbrowser aufklappen will stürzt Indesign ab.
myFoundItems.parentStory.insertionPoints.itemByRange( 0, myTopPara.index ).paragraphs.length gibt 1 zurück.

Wäre nett wenn mir da jemand unter die Arme greift. Ich muss zuerst mal Mittagessen.

Gruß


als Antwort auf: [#362543]

Merkeboxen/Textboxen im Fließtext - automatisch einfügen und mit Inhalt füllen.

Martin Fischer
  
Beiträge gesamt: 12783

14. Aug 2008, 14:21
Beitrag # 8 von 17
Beitrag ID: #362562
Bewertung:
(3922 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo mojo,

der storyOffset einer Tabelle spuckt einen insertionPoint aus.
Nämlich den, an welchem die Tabelle innerhalb des Textabschnitts platziert ist.
Und den Absatz dieses Einfügepunkts kannst Du über paragraphs[0] fassen:

Code
var myPara = myTable.storyOffset.paragraphs[0]; 



als Antwort auf: [#362550]

Merkeboxen/Textboxen im Fließtext - automatisch einfügen und mit Inhalt füllen.

zaphodbeeblebroxx
Beiträge gesamt: 408

14. Aug 2008, 15:00
Beitrag # 9 von 17
Beitrag ID: #362572
Bewertung:
(3914 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
 
Hallo Mojo,

da Du ja mit CS3 arbeitest, kannst Du doch Tabellen-/Zellformate
anlegen und nach Umwandlung des Textes in eine Tabelle den entsprechenden Stil zuweisen (ebenfalls per Skript).


als Antwort auf: [#362562]

Merkeboxen/Textboxen im Fließtext - automatisch einfügen und mit Inhalt füllen.

mojo_worker
Beiträge gesamt: 69

14. Aug 2008, 16:16
Beitrag # 10 von 17
Beitrag ID: #362592
Bewertung:
(3894 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Zitat da Du ja mit CS3 arbeitest, kannst Du doch Tabellen-/Zellformate
anlegen und nach Umwandlung des Textes in eine Tabelle den entsprechenden Stil zuweisen (ebenfalls per Skript).


Hmmh... würde das funktionieren? Na ja, jetzt bin ich eigentlich shcon zu fortgeschritten um mich von meiner bisherigen Lösung zu verabschieden.

Zitat der storyOffset einer Tabelle spuckt einen insertionPoint aus.
Nämlich den, an welchem die Tabelle innerhalb des Textabschnitts platziert ist.
Und den Absatz dieses Einfügepunkts kannst Du über paragraphs[0] fassen:


Perfekt!!! Danke!
So sieht das derzeitige (nicht funktionierende) Skript aus:

Code
// merkeboxen.jsx 
//

var myDoc = app.activeDocument;

app.findTextPreferences = app.changeTextPreferences = null;
app.findTextPreferences.findWhat = "#merketext#"
var myFoundItems = myDoc.findText();

if (myFoundItems.length > 0)
{
for (i = myFoundItems.length-1; i >=0 ; i--)
{
var myPara = myFoundItems[i]; // betroffener Absatz
var myTopPara = myFoundItems[i].parent.parent.storyOffset.paragraphs[0];
var myParaIndex = myFoundItems[i].parentStory.insertionPoints.itemByRange( 0, myTopPara.index ).paragraphs.length; // zähle die Absätze vom Anfang des Textabschnitts bis zum betroffenen Absatz
var myNextPara = myFoundItems[i].parentStory.paragraphs[myParaIndex + 1]; // Absatz nach dem betroffenen Absatz
myPara.contents = checkMerkeParas(myNextPara);
}

}

alert("Fertig");

function checkMerkeParas( merkPara )
{
var alleMerkParas = merkPara;
var merkParaIndex = merkPara.parentStory.insertionPoints.itemByRange( 0, merkPara.index ).paragraphs.length;

while (merkPara.parentStory.paragraphs[merkParaIndex + 1].appliedParagraphStyle.name=="<MERKE>" || merkPara.parentStory.paragraphs[merkParaIndex + 1].appliedParagraphStyle.name=="<MERKE-E1>")
{
alleMerkParas += merkPara;
merkParaIndex += 1;
}
return(alleMerkParas);
}


[edit]
Das is alles super, im Grunde muss ich eigentlich nur noch die Absätze (kein Array, denn join() ist nicht anwendbar - im Datenbrowser ist das ein lila Kreis mit drei Punkten, also vielleicht eine Sammlung?), die checkMerkeParas übergibt, so zu Text zu machen, dass sie als .contents in die Tabelle eingefügt werden können.

Vorschläge?


als Antwort auf: [#362562]
(Dieser Beitrag wurde von mojo_worker am 14. Aug 2008, 16:28 geändert)

Merkeboxen/Textboxen im Fließtext - automatisch einfügen und mit Inhalt füllen.

mojo_worker
Beiträge gesamt: 69

14. Aug 2008, 19:37
Beitrag # 11 von 17
Beitrag ID: #362612
Bewertung:
(3845 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
AAAh ich werd noch irre. Ich habe es nun fast so weit (mit dem Einfügen). Nur dass er mir die jweils ersten sechs Zeichen eines jeden Absatzes löscht, der eingefügt wird (offenbar, weil "#merketext#" 11 Zeichen lang ist)

Das ist der aktuelle Code:
Code
// merkeboxen.jsx 
//

var myDoc = app.activeDocument;

app.findTextPreferences = app.changeTextPreferences = null;
app.findTextPreferences.findWhat = "#merketext#"
var myFoundItems = myDoc.findText();

if (myFoundItems.length > 0)
{
for (i = myFoundItems.length-1; i >=0 ; i--)
{
var myPara = myFoundItems[i]; // betroffener Absatz
var myTopPara = myFoundItems[i].parent.parent.storyOffset.paragraphs[0];
var myParaIndex = myFoundItems[i].parentStory.insertionPoints.itemByRange( 0, myTopPara.index ).paragraphs.length; // zähle die Absätze vom Anfang des Textabschnitts bis zum betroffenen Absatz
var myNextPara = myFoundItems[i].parentStory.paragraphs[myParaIndex + 1]; // Absatz nach dem betroffenen Absatz
var thatResult = checkMerkeParas(myNextPara);
for (j = thatResult.length-1; j >= 0 ; j--)
{
$.writeln(thatResult[j].contents);
myPara.contents = thatResult[j].contents;

}
}

}

alert("Fertig");

function checkMerkeParas( merkPara )
{
var alleMerkParas = [merkPara];
var merkParaIndex = merkPara.parentStory.insertionPoints.itemByRange( 0, merkPara.index ).paragraphs.length;

while (merkPara.parentStory.paragraphs[merkParaIndex + 1].appliedParagraphStyle.name=="<MERKE>" || merkPara.parentStory.paragraphs[merkParaIndex + 1].appliedParagraphStyle.name=="<MERKE-E1>")
{
alleMerkParas.push(merkPara.parentStory.paragraphs[merkParaIndex + 1]);
merkParaIndex += 1;
}
return(alleMerkParas);
}


Ich wäre sehr dankbar, wenn mir einer von euch alten Haudegen noch unter die Arme greifen könnte. Werde gleich zu Hause noch ein wenigig fummeln... :-(.


als Antwort auf: [#362592]

Merkeboxen/Textboxen im Fließtext - automatisch einfügen und mit Inhalt füllen.

mojo_worker
Beiträge gesamt: 69

14. Aug 2008, 20:37
Beitrag # 12 von 17
Beitrag ID: #362615
Bewertung:
(3830 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf [ mojo_worker ] Nur dass er mir die jeweils ersten sechs Zeichen eines jeden Absatzes löscht


Ich meinte natürlich die ersten 11 Zeichen... ähem.


als Antwort auf: [#362612]

Merkeboxen/Textboxen im Fließtext - automatisch einfügen und mit Inhalt füllen.

mojo_worker
Beiträge gesamt: 69

14. Aug 2008, 22:06
Beitrag # 13 von 17
Beitrag ID: #362621
Bewertung:
(3814 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Es ist fast vollbracht...

Sicherlich ein äußerst unelegant geschriebenes Skript, aber es tut so langsam seinen Dienst.

Das Einzige was jetzt noch nicht funktioniert, ist dass das Absatzformat der Aufzählungen ("Merke-E1") nicht übernommen wird, sondern mit "MERKE" überschrieben wird. Wahrscheinlich die Ursache dessen, dass ich die Absätze immer am insertionPoint[0] eingefügt habe? Falls da noch jemand Rat weiß, immer her damit. Ich habe die Geduld nicht mehr, werde die blöden Aufzählungen erstmal von Hand wieder richten :-).

Code
// Merkeboxen.jsx 
//

var myDoc = app.activeDocument;

app.findTextPreferences = app.changeTextPreferences = null;
app.findTextPreferences.findWhat = "#merketext#"
var myFoundItems = myDoc.findText();

if (myFoundItems.length > 0)
{
for (i = myFoundItems.length-1; i >=0 ; i--)
{
var myPara = myFoundItems[i]; // betroffener Absatz
var myTopPara = myFoundItems[i].parent.parent.storyOffset.paragraphs[0];
var myParaIndex = myFoundItems[i].parentStory.insertionPoints.itemByRange( 0, myTopPara.index ).paragraphs.length; // zähle die Absätze vom Anfang des Textabschnitts bis zum betroffenen Absatz
var myNextPara = myFoundItems[i].parentStory.paragraphs[myParaIndex + 1]; // Absatz nach dem betroffenen Absatz
var thatResult = checkMerkeParas(myNextPara);
for (j = thatResult.length-1; j >= 0 ; j--)
{
myPara.paragraphs[0].insertionPoints[0].contents = thatResult[j].contents;
thatResult[j].contents = "";

}
}
app.findGrepPreferences = app.changeGrepPreferences = null;
app.findGrepPreferences.findWhat = "\r#merketext#";
app.changeGrepPreferences.changeTo = "";
myDoc.changeGrep();

}

alert("Fertig");

function checkMerkeParas( merkPara )
{
var alleMerkParas = [merkPara];
var merkParaIndex = merkPara.parentStory.insertionPoints.itemByRange( 0, merkPara.index ).paragraphs.length;

while (merkPara.parentStory.paragraphs[merkParaIndex + 1].appliedParagraphStyle.name=="MERKE" || merkPara.parentStory.paragraphs[merkParaIndex + 1].appliedParagraphStyle.name=="MERKE-E1")
{
alleMerkParas.push(merkPara.parentStory.paragraphs[merkParaIndex + 1]);
merkParaIndex += 1;
}
return(alleMerkParas);
}


Gute Nacht mojo worker


als Antwort auf: [#362615]

Merkeboxen/Textboxen im Fließtext - automatisch einfügen und mit Inhalt füllen.

mojo_worker
Beiträge gesamt: 69

18. Aug 2008, 11:42
Beitrag # 14 von 17
Beitrag ID: #362898
Bewertung:
(3701 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Liebes Forum!

Das böse Erwachen kommt wie immer Montag früh. Leider ist es so, dass nicht bloß ein Absatzformat überschrieben wird, sondern sämtliche Zeichenformatierungen (hätte ich mir ja eigentlich auch denken können...).

Ich wäre also sehr dankbar, wenn mir jemand sagen könnte, was meine checkMerkeParagraphs Unterfunktion so !"§$%&/() macht und wie man einen Austausch von Absätzen am besten in Javascript realisiert. Ich muss jetzt erstmal patchen :-).

Gruß,

mojo


als Antwort auf: [#362621]

Merkeboxen/Textboxen im Fließtext - automatisch einfügen und mit Inhalt füllen.

zaphodbeeblebroxx
Beiträge gesamt: 408

18. Aug 2008, 12:07
Beitrag # 15 von 17
Beitrag ID: #362905
Bewertung:
(3685 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
 
Hallo Mojo,

um alle Formatierungen des Textes, der in eine Box oder Tabelle positioniert werden soll zu erhalten würde ich den move()-Befehl verwenden.

Ich mache das unter CS2 immer wie folgt (per JavaSkript):

In einer Bibliothek hinterlege ich einen Textrahmen, der eine Mustertabelle (oder Musterbox) enthält.

Den Textbereich suchen, der in Box/Tabelle verschoben werden soll (zusammenhängende Absätze derselben Formatierung).

Musterbox/Mustertabelle aus Bibliothek auf Dokumentenseite positionieren

Den gefundenen Text in die platzierte Mustertab./-box verschieben mit dem move()-Befehl.

Die gesamte Mustertabelle/-box mit dem enthaltenen Text an die Einfügemarke verschieben, an der der gesuchte Text ürsprünglich gestanden hat.


als Antwort auf: [#362898]
X