[GastForen Programme Print/Bildbearbeitung Adobe InDesign

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste

CharStyleOfPeterKahrel (Extended)

Martin Fischer
  
Beiträge gesamt: 12783

23. Dez 2006, 19:16
Bewertung:

gelesen: 24208

Beitrag als Lesezeichen
Nun hat's mir doch selber in den Fingern gejuckt und ich habe mir unter Einbezug von Wolfgangs komfortablen Funktionen ein Skript zusammengebastelt, das alle im Dokument verwendeten Schriften mit ihren Schnitten in Zeichenformate einfriert.

- Für die Grundschrift selbst, die aus einem Basisabsatzformat ermittelt wird, wird kein Zeichenformat erstellt.
- Für die anderen Schnitte der Grundschrift werden Zeichenformate mit den Namen des Schnitts erstellt.
- Für alle anderen Schriften werden Zeichenformate mit den Namen der Fonts und dem Namen des Schnitts erstellt.

Beispiel:
Grundschrift = Times New Roman - Regular.
Für diese Grundschrift wird keine Zeichenformat erstellt.
Für den Kursivschnitt der Grundschrift wird (wenn im Dokument vorhanden) ein Zeichenformat "Italic" erstellt. Dasselbe gilt für den fetten Schnitt und für Bold-Italic.

Nehmen wir an, es werden im Dokument auch die Myriad Pro - Regular und Italic verwendet.
Dann werden die Zeichenformate "Myriad Pro-Regular" und "Myriad Pro-Italic" erstellt und zugewiesen.

Ein Problem mit nicht aktiven Schriften konnte ich nicht lösen:
Wird im Dokument eine Schrift verwendet, die nicht aktiv/vorhanden ist, kann diese (anders als im Suchen-Dialog der graphischen Benutzeroberfläche) über die Suchfunktion im Skript nicht gesucht werden. Diese Schriften, die damit also nicht in ein Zeichenformat eingefroren werden können, werden ggf. am Ende des Skripts in einem Dialogfenster angezeigt.

Eine kleine Überraschung:
Das o.g. Problem gibt es nicht, wenn eine aktive Schrift mit einem inaktiven Schnitt verwendet worden ist. Da wird ein Zeichenformat angelegt und zugewiesen.

Code
// charStyles4SpecialFonts.jsx    

var myDoc = app.activeDocument;
var zaehler=0;
missingFonts = new Array();
attributes = new Array();

setSpecialFonts();
attr2style(attributes);
if (missingFonts.length == 0) {
alert("Fix und fertig!");
}
else {
alert("Kein Zeichenformat für folgende fehlende Schriften: \r" + missingFonts.join("\r"));
}

/***** Schriftschnittformate für Grundschrift und Font-Formate für andere Schriften *****/
function setSpecialFonts() {
var thePresentFonts =myDoc.fonts;
var theBaseParaStyle = prompt("Basisabsatzformat", myDoc.paragraphStyles[2].name);
//var theBaseParaStyle = myDoc.paragraphStyles[2].name;

if(app.activeDocument.paragraphStyles.item(theBaseParaStyle) == null) {
alert ("Fehler\rDas Absatzformat \"" + theBaseParaStyle + "\" existiert nicht.");
exit();
//return;
}
for (var i = 0; i < thePresentFonts.length; i++) {
if (thePresentFonts[i].name != myDoc.paragraphStyles.item(theBaseParaStyle).appliedFont.name) {
if (thePresentFonts[i].fontFamily != myDoc.paragraphStyles.item(theBaseParaStyle).appliedFont.fontFamily) {
makeArray(thePresentFonts[i].name.split("\t").join("-"), 'appliedFont = "' + thePresentFonts[i].name + '"');
}
else {
makeArray(thePresentFonts[i].fontStyleName, 'appliedFont = "' + thePresentFonts[i].name + '"');
}
}
}
}

/***** Mehrdimensionales Array aus allen Parametern erzeugen *****/
function makeArray() {
attributes[zaehler]= new Array();
for (var x = 0; x < arguments.length; x++)
attributes[zaehler].push(arguments[x]);
zaehler++;
}

/***** Hier wird das mit makeArray erzeugte Array verarbeitet *****/
function attr2style(attributes) {
for (var x = 0; x < attributes.length; x++) {
app.findPreferences = app.changePreferences = null;
for (var y = 1; y < attributes[x].length; y++) {
try {
eval('app.findPreferences.' + attributes[x][y]);
// nur Formatierung ohne zugewiesenes Zeichenformat suchen
app.findPreferences.appliedCharacterStyle = app.activeDocument.characterStyles[0];

app.changePreferences.appliedCharacterStyle = checkStyle(attributes[x]);
app.activeDocument.search('', false, false, '');
}
catch(e) {
missingFonts.push(attributes[x][0]);
}
}
}
}


/***** Diese Funktion arbeitet mit dem übergebenen Teilarray aus attr2style weiter ******/
function checkStyle(attributesSection) {
if (app.activeDocument.characterStyles.item(attributesSection[0]) == null) {
app.activeDocument.characterStyles.add({ name : attributesSection[0] });
for (var x = 1; x < attributesSection.length; x++)
eval('app.activeDocument.characterStyles.item(attributesSection[0]).' + attributesSection[x]);
}
return app.activeDocument.characterStyles.item(attributesSection[0]);
}


Andere Zeichenattribute (unterstrichen, hoch-/tiefgestellt, Kapitälchen ...) bleiben von diesem Skript unberücksichtigt. Sie können aus dem Baukasten von Wolfgang leicht nachträglich nach eigenem Bedarf zusammengestellt und eingefügt werden.

Beispiel:
Code
makeArray( 'SuperScript', 'position = Position.superscript' );      
makeArray( 'SubScript', 'position = Position.subscript' );
makeArray( 'SmallCaps', 'capitalization = Capitalization.smallCaps' );


Dieser Block wäre direkt vor oder nach der folgenden Zeile einzufügen:
Code
setSpecialFonts(); 


(Dieser Beitrag wurde von Martin Fischer am 9. Mär 2007, 23:36 geändert)
Änderungsverlauf:
Beitrag geändert von Martin Fischer (Moderator) am 24. Dez 2006, 10:04
Beitrag geändert von Martin Fischer (Moderator) am 9. Mär 2007, 23:36: seltsamen Fehler im Code korrigiert; wie sich statt des i wohl ein [i] und statt [i] ein [[i]] eingeschlichen haben mag ...