[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt IndexFromCharacterStyle CS 4

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

IndexFromCharacterStyle CS 4

Pomeranz
Beiträge gesamt: 10

19. Mär 2022, 07:37
Beitrag # 46 von 65
Beitrag ID: #582990
Bewertung: |||
(7003 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ist es möglich, das Skript »IndexFromCharacterStyle_z_CS4.jsx« so zu ändern, dass die Verweise der 2. Themenstufe zugeordnet werden und die 1. Themenstufe den Namen des zugewiesenen Zeichenformates erhält?

Beispiel:

In einem Text ist den Wörtern Banane, Kirsche, Apfel das Zeichenformat Obst und den Wörtern Hammer, Säge, Zange das Zeichenformat Werkzeug zugewiesen.

Im ersten Durchlauf möchte ich das Skript alle Wörter mit dem Zeichenformat Obst indizieren lassen. Danach starte ich das Skript erneut und suche nach Wörtern, die mit dem Zeichenformat Werkzeug ausgezeichnet sind.

Im Index sollte dann dieses Ergebnis stehen:

Obst
- Apfel
- Banane
- Kirsche

Werkzeug
- Hammer
- Säge
- Zange


als Antwort auf: [#534427]
X

IndexFromCharacterStyle CS 4

Martin Fischer
  
Beiträge gesamt: 12778

27. Mär 2022, 09:14
Beitrag # 47 von 65
Beitrag ID: #583038
Bewertung:
(6651 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ja, das sollte möglich sein.


als Antwort auf: [#582990]

IndexFromCharacterStyle CS 4

Pomeranz
Beiträge gesamt: 10

29. Mär 2022, 17:37
Beitrag # 48 von 65
Beitrag ID: #583070
Bewertung:
(6535 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

danke für deine Rückmeldung. Du beantwortest zwar genau meine Frage, aber trotzdem ist mir damit nicht geholfen. Kannst du mir auch sagen, wie ich das anstelle?

Freundlicher Gruß
Thomas


als Antwort auf: [#583038]

IndexFromCharacterStyle CS 4

Martin Fischer
  
Beiträge gesamt: 12778

29. Mär 2022, 21:56
Beitrag # 49 von 65
Beitrag ID: #583072
Bewertung: |||
(6486 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Thomas,

teste mal das Skript unten.

Zur Vorbereitung legst Du eine Zeichenformatgruppe »Index« an und verschiebst bereits vorhandene Zeichenformate, die für den Index berücksichtigt werden sollen, da rein oder legst die entsprechenden Zeichenformate dort an.

Code
// indexFromCharacterStyles.jsx 

var doc = app.activeDocument;
var i = 0;
var r = [];
var _error = [];
var register = (doc.indexes.item(0).isValid) ? doc.indexes.item(0) : doc.indexes.add();
var cs = null;
var cs_name_arr = [];
var cs_group = doc.characterStyleGroups.itemByName('Index');


if (!cs_group.isValid)
{
alert('Die erforderliche Zeichenformatgruppe "Index" fehlt.');
exit();
}

// Zeichenformate über Dialog ermitteln
cs_name_arr = get_cs(cs_group.characterStyles.everyItem().name);

// per Schleife Registereinträge aus den ermittelten Zeichenformaten generieren
for (i = 0; i < cs_name_arr.length; i++)
{
cs = cs_group.characterStyles.itemByName(cs_name_arr[i]);
r = generate_index_entries(doc, register, cs);
if (r.length > 0)
_error = _error.concat(r);
}

if (_error.length > 0)
alert('Achtung!\n' + _error.join('\n'));


function generate_index_entries(doc, register, cs)
{
var x = 0;
var err = [];
var str = '';
var result = [];
var main_topic = (register.topics.itemByName(cs.name).isValid) ? register.topics.itemByName(cs.name) : register.topics.add({name: cs.name});
var sup_topic = null;

app.findTextPreferences = NothingEnum.NOTHING;
app.findTextPreferences.appliedCharacterStyle = cs;
result = doc.findText(true);
app.findTextPreferences = NothingEnum.NOTHING;

for (x = 0; x < result.length; x++)
{
str = result[x].contents;
sup_topic = (main_topic.topics.itemByName(str).isValid) ? main_topic.topics.itemByName(str) : main_topic.topics.add({name: str});

try
{
sup_topic.pageReferences.add(result[x], PageReferenceType.currentPage);

} catch (error)
{
err.push(str + ': ' + error);
}
}
return err;
}


function get_cs(arr)
{

var n = 0;
var cb = [];
var result_arr = [];

// DIALOG
// ======
var dialog = new Window("dialog");
dialog.text = "Registereinträge aus Zeichenformaten";
dialog.preferredSize.width = 250;
dialog.orientation = "column";
dialog.alignChildren = ["left", "top"];
dialog.spacing = 10;
dialog.margins = 16;

// SELECT
// ======
var select = dialog.add("group", undefined, {name: "select"});
select.preferredSize.width = 250;
select.orientation = "row";
select.alignChildren = ["left", "center"];
select.spacing = 20;
select.margins = 20;

// PANEL1
// ======
var panel1 = select.add("panel", undefined, undefined, {name: "panel1"});
panel1.text = "Zeichenformatgruppe Index";
panel1.preferredSize.width = 250;
panel1.orientation = "column";
panel1.alignChildren = ["left", "top"];
panel1.spacing = 5;
panel1.margins = 20;

// Checkboxen
for (n = 0; n < arr.length; n++)
{
cb[n] = panel1.add("checkbox", undefined, undefined);
cb[n].text = arr[n];
cb[n].value = true;
}

// CONFIRM
// =======
var confirm = dialog.add("group", undefined, {name: "confirm"});
confirm.preferredSize.width = 250;
confirm.orientation = "row";
confirm.alignChildren = ["right", "top"];
confirm.spacing = 10;
confirm.margins = 0;

var cancel = confirm.add("button", undefined, undefined, {name: "cancel"});
cancel.text = "Cancel";

var ok = confirm.add("button", undefined, undefined, {name: "ok"});
ok.text = "OK";

if (dialog.show() == 1)
{
for (n = 0; n < cb.length; n++)
{
if (cb[n].value == true)
result_arr.push(cb[n].text);
}
}
dialog.close()
return result_arr;
}



als Antwort auf: [#583070]
(Dieser Beitrag wurde von Martin Fischer am 29. Mär 2022, 23:44 geändert)

IndexFromCharacterStyle CS 4

Rotkehlpieper
Beiträge gesamt: 37

30. Mär 2022, 20:22
Beitrag # 50 von 65
Beitrag ID: #583104
Bewertung:
(6416 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Thomas,
vielen Dank für Deine Arbeit!
Das Script wie erwartet ganz prima.
Bei nächster Gelegenheit werde ich es nutzen (und dadurch viel Arbeitzeit sparen)

Besten Gruß,
B.


als Antwort auf: [#583072]

IndexFromCharacterStyle CS 4

Pomeranz
Beiträge gesamt: 10

8. Apr 2022, 04:42
Beitrag # 51 von 65
Beitrag ID: #583208
Bewertung:
(6090 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

vielen herzlichen Dank! Das Skript ist großartig und macht genau, was ich mir gewünscht hatte. Das erleichtert meine Arbeit ganz ungemein. Gibt es hier eigentlich so etwas wie eine Kaffeekasse, in die man was spenden kann, um sich erkenntlich zu zeigen?
Nochmals: Vielen, vielen herzlichen Dank!


Hallo Rotkehlpieper,

du hast wahrscheinlich Martin und mich (Thomas) vertauscht. Die Arbeit hatte nämlich Martin; ich hatte nur die Frage/Bitte sowas zu erstellen.

Freundlicher Gruß
Thomas


als Antwort auf: [#583072]

IndexFromCharacterStyle CS 4

Martin Fischer
  
Beiträge gesamt: 12778

8. Apr 2022, 19:15
Beitrag # 52 von 65
Beitrag ID: #583216
Bewertung:
(6025 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Thomas,

hab Dank für die positive Rückmeldung.

Die »Kaffeekasse« findest Du hier: Spende/Mitgliedschaft.

Im Übrigen hat mir Dein Konzept grundsätzlich gefallen (deswegen habe ich mich gerne damit beschäftigt). Allerdings vermeide ich für solche Markierungszwecke Zeichenformate, die ich eher zur typographischen Auszeichnung verwende (Mehrfachzuweisungen sind nicht möglich).
Statt dessen missbrauche ich lieber Bedingungen (conditions), die zum Ein-/Ausblenden von Text konzipiert sind, aber mit ihrer ausblendbaren Färbung und optionaler Ausgabemöglichkeit (Drucken/Exportieren) eine optische Unterstützung bei der Markierung von Text fürs Register u.a. bieten.

Deswegen hier analog zu der Markierung von Registereinträgen auf Zeichenformatbasis eine auf Bedingungen hin umgearbeitete Variante: indexFromConditions.jsx

Code
// indexFromConditions.jsx 

var doc = app.activeDocument;
var i = 0;
var r = [];
var _error = [];
var register = (doc.indexes.item(0).isValid) ? doc.indexes.item(0) : doc.indexes.add();
var ct = null;
var ct_name_arr = [];


// Bedingungen über Dialog ermitteln
ct_name_arr = get_ct(doc.conditions.everyItem().name);

// per Schleife Registereinträge aus den ermittelten Bedingungen generieren
for (i = 0; i < ct_name_arr.length; i++)
{
ct = doc.conditions.itemByName(ct_name_arr[i]);
r = generate_index_entries(doc, register, ct);
if (r.length > 0)
_error = _error.concat(r);
}

if (_error.length > 0)
alert('Achtung!\n' + _error.join('\n'));


function generate_index_entries(doc, register, ct)
{
var x = 0;
var err = [];
var str = '';
var result = [];
var main_topic = (register.topics.itemByName(ct.name).isValid) ? register.topics.itemByName(ct.name) : register.topics.add({name: ct.name});
var sup_topic = null;

app.findTextPreferences = NothingEnum.NOTHING;
app.findTextPreferences.appliedConditions = [ct];
result = doc.findText(true);
app.findTextPreferences = NothingEnum.NOTHING;

for (x = 0; x < result.length; x++)
{
str = result[x].contents;
sup_topic = (main_topic.topics.itemByName(str).isValid) ? main_topic.topics.itemByName(str) : main_topic.topics.add({name: str});

try
{
sup_topic.pageReferences.add(result[x], PageReferenceType.currentPage);

} catch (error)
{
err.push(str + ': ' + error);
}
}
return err;
}


function get_ct(arr)
{
var n = 0;
var cb = [];
var result_arr = [];

// DIALOG
// ======
var dialog = new Window("dialog");
dialog.text = "Registereinträge aus Bedingungen";
dialog.preferredSize.width = 250;
dialog.orientation = "column";
dialog.alignChildren = ["left", "top"];
dialog.spacing = 10;
dialog.margins = 16;

// SELECT
// ======
var select = dialog.add("group", undefined, {name: "select"});
select.preferredSize.width = 250;
select.orientation = "row";
select.alignChildren = ["left", "center"];
select.spacing = 20;
select.margins = 20;

// PANEL1
// ======
var panel = select.add("panel", undefined, undefined, {name: "panel"});
panel.text = "Bedingung";
panel.preferredSize.width = 250;
panel.orientation = "column";
panel.alignChildren = ["left", "top"];
panel.spacing = 5;
panel.spacing = 5;
panel.margins = 20;

// Checkboxen
for (n = 0; n < arr.length; n++)
{
cb[n] = panel.add("checkbox", undefined, undefined);
cb[n].text = arr[n];
cb[n].value = true;
}

// CONFIRM
// =======
var confirm = dialog.add("group", undefined, {name: "confirm"});
confirm.preferredSize.width = 250;
confirm.orientation = "row";
confirm.alignChildren = ["right", "top"];
confirm.spacing = 10;
confirm.margins = 0;

var cancel = confirm.add("button", undefined, undefined, {name: "cancel"});
cancel.text = "Cancel";

var ok = confirm.add("button", undefined, undefined, {name: "ok"});
ok.text = "OK";

if (dialog.show() == 1)
{
for (n = 0; n < cb.length; n++)
{
if (cb[n].value == true)
result_arr.push(cb[n].text);
}
}
dialog.close()
return result_arr;
}



als Antwort auf: [#583208]

IndexFromCharacterStyle CS 4

Pomeranz
Beiträge gesamt: 10

15. Apr 2022, 08:06
Beitrag # 53 von 65
Beitrag ID: #583292
Bewertung:
(5777 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

danke für den Tipp mit der »Kaffeekasse«. Ich habe soeben gespendet.

Den Index über Bedingten Text zu erstellen (und somit Zeichenformate nur für die wirkliche Formatierung zu nutzen) ist genial. Vielen herzlichen Dank für diese Idee und das zugehörige Skript.

Freundlicher Gruß
Thomas


als Antwort auf: [#583216]

IndexFromCharacterStyle CS 4

Martin Fischer
  
Beiträge gesamt: 12778

15. Apr 2022, 10:57
Beitrag # 54 von 65
Beitrag ID: #583293
Bewertung:
(5725 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Dankeschön Thomas.


als Antwort auf: [#583292]

IndexFromCharacterStyle CS 4

Pomeranz
Beiträge gesamt: 10

10. Aug 2022, 21:07
Beitrag # 55 von 65
Beitrag ID: #584160
Bewertung:
(3840 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

ich möchte diesen Thread nochmal aufmachen. Ich hoffe, das ist in Ordnung.

Das Skript indexFromConditions.jsx leistet gute Arbeit und hat mir schon vieles vereinfacht. Nun stehe ich vor einer neuen Aufgabe, für die ich eine Modifizierung des Skripts benötige.

Das Skript schreibt

1) in die erste Themenstufe: den Namen der Bedingung und
2) in die zweite Themenstufe: die Wörter, die mit der Bedingung versehen sind.

Kann man das auch umdrehen? Also:

1) in die erste Themenstufe: die Wörter, die mit der Bedingung versehen sind, und
2) in die zweite Themenstufe: die Namen der Bedingung.

Wenn ja, wie? Ich bin für Tipps sehr dankbar, da ich leider gar nichts vom Skripten verstehe.

Oder weiß jemand eine andere Möglichkeit, um InDesign dazu zu bekommen, die Themenstufen zu vertauschen?

Freundlicher Gruß
Thomas


______

Zur Erläuterung warum so etwas sinnvoll sein kann und wozu ich es benötige:

Ich habe das immer gleiche Wortmaterial, das in verschiedenen Listen nach unterschiedlichen Kriterien (z. B.: alphabetisch, rückläufig, nach Anzahl der Buchstaben sortiert) angeordnet ist. Das sieht dann beispielsweise so aus:

Liste A (alphabetisch):
Belgien
Deutschland
Frankreich
Österreich

Liste B (retrograd):
Deutschland
Frankreich
Österreich
Belgien

Liste C (Wortlänge):
Belgien
Frankreich
Österreich
Deutschland

In Liste A sind die Worte jeweils mit der Bedingung namens "A" versehen, in der Liste B mit der Bedingung namens "B" und in der Liste C mit der Bedingung namens "C".

Mit dem bisherigen Skript komme ich zu folgendem Ergebnis (wobei die Seitenzahlen hier natürlich fiktiv sind):

A:
Belgien 5
Deutschland 6
Frankreich 7
Österreich 7

B:
Belgien 8
Deutschland 8
Frankreich 9
Österreich 10

C:
Belgien 12
Deutschland 14
Frankreich 14
Österreich 15

Was ich für diese neue Aufgabe benötige, ist aber etwas anderes. Der Index soll wie folgt aussehen:

Index:
Belgien A 5; B 8; C12
Deutschland A 6; B 8; C 14
Frankreich A 7; B 9; C 14
Österreich A 7; B 10; C 15

Dazu müssten die Eintragungen in den beiden Themenstufen vertauscht werden. Bei wenigen Wörtern, wie hier im Beispiel, kann ich das gut händisch machen, aber bei über 6.000 Wörtern ist das eine ganz schöne Fleißaufgabe. Daher meine Hoffnung, dass man das Skript durch eine – hoffentlich einfache – Änderung dazu bringen kann, direkt beim Anlegen der Einträge die Themenstufen andersherum zu befüllen.


als Antwort auf: [#583293]

IndexFromCharacterStyle CS 4

Martin Fischer
  
Beiträge gesamt: 12778

11. Aug 2022, 08:01
Beitrag # 56 von 65
Beitrag ID: #584162
Bewertung:
(3802 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Pomeranz,

ganz so einfach ist dies nicht mit einem kleinen Umlenken zu lösen.

Unmittelbar vor dem Urlaub fehlt mir grad die Zeit für's Umstricken.

Du kannst mich aber Anfang September wieder anstupsen.


als Antwort auf: [#584160]

IndexFromCharacterStyle CS 4

Pomeranz
Beiträge gesamt: 10

11. Aug 2022, 18:09
Beitrag # 57 von 65
Beitrag ID: #584173
Bewertung:
(3739 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

danke für deine Hilfsbereitschaft. Ich wünsche dir einen wunderschönen Urlaub.

Freundlicher Gruß
Thomas


als Antwort auf: [#584162]

IndexFromCharacterStyle CS 4

Pomeranz
Beiträge gesamt: 10

16. Sep 2022, 22:54
Beitrag # 58 von 65
Beitrag ID: #584417
Bewertung:
(2968 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf: anstupsen


Hallo Martin,

ich hoffe, du hattest einen schönen und erholsamen Urlaub. Genügt dieser aufrichtige Wunsch als Anstupser?

Freundlicher Gruß
Thomas


als Antwort auf: [#584162]

IndexFromCharacterStyle CS 4

Martin Fischer
  
Beiträge gesamt: 12778

17. Sep 2022, 10:51
Beitrag # 59 von 65
Beitrag ID: #584420
Bewertung:
(2922 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Thomas,

die Aufgabenstellung habe ich mir nochmals angesehen und ich fürchte, die Umsetzung könnte aufwendiger sein, als von uns beiden spontan erwartet.

Wenn ich es richtig verstanden habe, sollen die Listen in Bedingungen abgebildet werden:
Liste A: Bedingung A
Liste B: Bedingung B
Liste C: Bedingung C

Anders als im ursprünglichen Skript indexFromConditions.jsx bilden nicht die Namen der Bedingungen die Hauptstichworte, sondern die einzelnen Inhalte, die mit den Bedingungen ausgezeichnet sind und die Namen der Bedingungen dienen als Unterstichworte.

So weit so gut.
Aber es gibt noch einen weiteren Unterschied, der die Angelegenheit deutlich komplexer macht: Es gibt Mehrfachauszeichnungen.
Der Begriff »Deutschland« kann in allen Listen auftauchen und entsprechend mit allen Bedingungen versehen sein.

Nun ist es aber so, dass kumulierte Bedingungen nicht unabhängig von den anderen gefunden werden können. Das heißt in der Praxis:
Deutschland, ausgezeichnet mit den Bedingungen A, B, C wird nicht gefunden, wenn nur nach Bedingung A gesucht wird. Es wird auch nicht gefunden, wenn nach Bedingung A + B gesucht wird, sondern nur bei der Suche nach Bedingung A + B + C.

Um also alle Treffer in denen Bedingung A auftaucht zu finden, müsste nach allen möglichen Bedingungskombinationen gesucht werden:
1. Bedingung A
2. Bedingung A + B
3. Bedingung A + C
4. Bedingung A + B + C

Das vervielfacht sich mit jeder weiteren Bedingung/Liste z.B. D)
1. Bedingung A
2. Bedingung A + B
3. Bedingung A + C
4. Bedingung A + D
5. Bedingung A + B + C
6. Bedingung A + B + D
7. Bedingung A + B + C + D

Und dasselbe Spiel dann freilich ausgehend von Bedingung B alleine und allen möglichen Kombinationen mit den anderen Elementen, ohne die bereits zuvor abgeklapperten Kombinationen. Und so fort mit allen Elementen.

Grundsätzlich sollte das per Skript durchaus möglich sein, aber mehr fehlt grad die abstrakte mathematische Formal für alle möglichen Kombinationen eines Elements A alleine und mit allen Elementen der Menge {A, B, C, D, ...}.

Abgesehen davon dürfte sich die Dauer der Skriptausführung mit jedem weiteren Element signifikant erhöhen.

Am Besten lässt Du mir vorab neben einem Beispieldokument mit Markierungen auch die notwendige mathematische Formel, mit der alle Kombinationen abzuklappern sind, zukommen, dann muss ich mir den Kopf nicht selbst zerbrechen, sondern kann mich auf die einfache Skriptumsetzung konzentrieren. Smile


als Antwort auf: [#584417]
(Dieser Beitrag wurde von Martin Fischer am 17. Sep 2022, 11:40 geändert)

IndexFromCharacterStyle CS 4

Pomeranz
Beiträge gesamt: 10

25. Sep 2022, 00:33
Beitrag # 60 von 65
Beitrag ID: #584460
Bewertung:
(2500 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

bitte entschuldige, dass ich jetzt erst antworte. (Ich war zwischenzeitlich im Krankenhaus – nichts schlimmes.)

Schön, dass du dich meiner Sache weiterhin annehmen möchtest. Es hört sich jedoch komplizierter an, als ich gedacht/gehofft hatte.

Die Kombinationsmöglichkeiten aus den sechs Bedingungen (A bis F) müssten diese hier sein:

a
a b
a b c
a b c d
a b c d e
a b c d e f
a b c d f
a b c e
a b c e f
a b c f
a b d
a b d e
a b d e f
a b d f
a b e
a b e f
a b f
a c
a c d
a c d e
a c d e f
a c d f
a c e
a c e f
a c f
a d
a d e
a d e f
a d f
a e
a e f
a f
b
b c
b c d
b c d e
b c d e f
b c d f
b c e
b c e f
b c f
b d
b d e
b d e f
b d f
b e
b e f
b f
c d
c d e
c d e f
c d f
c e
c e f
c f
d
d e
d e f
d f
e
e f
f

Das sind 62 Möglichkeiten. Ich würde es verstehen, wenn du bei dieser Menge lieber aussteigen möchtest. Anderenfalls wäre meine Freude natürlich um so größer.

Ein Beispieldokument findest du hier: https://ABCdarium.de/DATA/ZIP/Index.zip (ZIP-Datei; 16 MB; beinhaltet Index.indd und Index.pdf) Die InDesign-Dokument besteht aus sechs Listen, deren Einträge mit den Bedingungen A bis F markiert sind.

Ich hoffe, dass hilft weiter. Bei Fragen stehe ich natürlich gerne zur Verfügung.

Freundlicher Gruß
Thomas


als Antwort auf: [#584420]
X