Produktivität mit InDesign CS6
Über InDesign CS6 ist inzwischen viel berichtet worden, die aus meiner Sicht beste Zusammenfassung kommt mal wieder von InDesign Secrets.
Ich wurde mit der neuen Version bis jetzt noch nicht so richtig warm, es fehlten mir einerseits maßgebliche Verbesserungen beim EPUB-Export und andererseits sind viele neue Funktionen noch nicht ganz zuende gedacht. So hätte ich beispielsweise erwartet, dass man Alternate Layouts auch mit verschiedenen Document Intents (Einstellung Zielmedium) erstellen kann. Sinnvoll wäre das z.B. für die gleichzeitige Gestaltung von Print und EPUB. Aus Sicht von Adobe scheinen aber Alternate Layouts nur innerhalb eines Zielmediums (wahrscheinlich dem Tablet) sinnvoll. Auch das viel besprochene Liquid Layout hat im Praxiseinsatz noch nicht überzeugen können – so sind die notwendigen Einstellungen für ein akzeptables Ergebnis so aufwändig, dass sich der Zeitgewinn eher in Grenzen hält. Um ein Nachkontrolle kommt man sowieso nicht umhin.
Trotzdem ist CS6 hier täglich im Gebrauch und ich habe inzwischen auch meine Lieblingsfunktion gefunden: Intelligente Texteinpassung von Textrahmen.Die Einstellungen können in den Textrahmenoptionen vorgenommen werden.
In Verbindung mit der Funktionen Spaltenspanne und Konturenführung, die schon länger vorhanden sind, kann man nun endlich flexible Mustervorlagenseiten bauen. Die Kombination hat sich in der Praxis bewährt und ich kann sie nur jedem professionellen Anwender ans Herz legen.
Auch wenn sie mich als Scripter eher arbeitslos macht und ich sie meist per Hand im InDesign-Template einstelle, ein kurzer Blick auf die Programmierung:
var textFrame = app.selection[0]; with (textFrame.textFramePreferences) { autoSizingType = AutoSizingTypeEnum.HEIGHT_ONLY; autoSizingReferencePoint = AutoSizingReferenceEnum.TOP_CENTER_POINT; useMinimumHeightForAutoSizing = true; minimumHeightForAutoSizing = 15; }
Wie üblich ist die grafische Benutzeroberfläche in einer Preferences-Klasse abgebildet, die einzelnen Eigenschaften befinden sich in im konkreten Fall in textFramePreferences. Mit autoSizingType wird festgelegt, welche Parameter des Textrahmens angepasst werden. Entsprechend sind dann auch nicht immer alle Eigenschaften bei den folgenden Einstellungen gültig. Im Falle der automatischen Höhenanpassung kann bspw. der Referenzpunkt nur auf TOP_CENTER_POINT, CENTER_POINT bzw. BOTTOM_CENTER_POINT gesetzt werden.
Übrigens könne die Einstellungen auch in den Objektformaten und beim Suchen/Ersetzen von Objekten verwendet werden.
swiss publishing days
Nach der DPK freue ich mich auf spannende swiss publishing days vom 12. bis 13. September in Winterthur. Meine Vorträge zu medienübergreifenden Publizieren und GREP werden am Mittwoch den 12. September stattfinden. Der erste Tag steht unter dem Motto Layout, Workflow und Innovation.
Weitere Infos und das vollständige Programm finden sie auf der Website des Veranstalters!
Deutsche Publishing Konferenz 2012
Die erste Deutsche Publishing-Konferenz startet Ende April in München. Ich werde den Vortrag InDesign Scripting Einführung halten. Mein Beitrag wird einen Schnelleinstieg ohne großes Theorie Brimborium bieten – aus der Praxis für Praktiker.
Das restliche Programm liest sich extrem spannend. Ganz besonders freue ich mich auf den Beitrag Scripting für Fortgeschrittene von Gerald Singelmann.
Kapitel zu Suchen&Ersetzen online
Für die Leser des Ende Februar erscheinenden Buchs ePub für (In)Designer habe ich das Kapitel 4.8.1 Adobe-Skript FindChangeByList online gestellt.
Im Beitrag finden Sie auch eine nützliche Tabelle mit den wichtigsten Eigenschaften für das Suchen&Ersetzen!
Alte Skripte laufen wieder
Generell ist es kein großes Problem, Skripte für vorhergehende Versionen in InDesign zum laufen zu kriegen. Auch wenn sich gerne einige Details im Document Object Model verändern, bringt jede neue InDesign Version einen abwärtskompatiblen Interpreter mit.
Entweder man stellt die Eigenschaft app.scriptPreferences.version = "#.0" am Anfang des Skripte auf die passende Version, oder verwendet eine target-Direktive #target "InDesign-#.0". Wer das ESTK nicht öffnen will verschiebt das Skript einfach in einen Ordner mit der Namenskonvention Version #.0 Scripts.
Bei den Versionen kann man nur noch über die nicht direkt intuitiven Versionsnummern stolpern – die sich aus dem Versionssprung InDesign 2.0 auf InDesign CS erklären.
| Skript für … | Ordner | app.scriptPreferences.version |
#target |
| InDesign 2.0 | Version 2.0 Scripts | 2.0 | “InDesign-2.0″ |
| InDesign CS | Version 3.0 Scripts | 3.0 | “InDesign 3.0″ |
| InDesign CS2 | Version 4.0 Scripts | 4.0 | “InDesign-4.0″ |
| InDesign CS3 | Version 5.0 Scripts | 5.0 | “InDesign 5.0″ |
| InDesign CS4 | Version 6.0 Scripts | 6.0 | “InDesign-6.0 |
| InDesign CS5 | Version 7.0 Scripts | 7.0 | “InDesign 7.0″ |
| InDesign CS5.5 | Version 7.5 Scripts | 7.5 | “InDesign-7.5 |
Wer lieber eine Benutzeroberfläche haben möchte, kann sich auch das Skript Make it Run von Martinho da Gloria herunterladen. Ich denke das folgende Bild erklärt es ganz gut.

Ich hoffe damit hat sich die ein oder andere Support-Anfrage erledigt :-/
Das große Was ist was des EPUB- und XHTML-Exports
Beim EPUB- bzw. HTML-Export (Seit CS5.5 Datei → Export) stellt sich oft die Frage, welche Seitenobjekte und welche Formateinstellungen wie exportiert werden. Die folgende Tabelle gibt eine Übersicht über die Umsetzung in HTML-Elemente bzw. CSS-Regeln. Auffallend ist, dass der HTML und EPUB-Export manchmal zu verschiedenen Ergebnissen führen. Ich vermute, dass es noch weitere Unstimmigkeiten gibt – prinzipiell sollte meiner Ansicht das gleiche Ergebnis generiert werden. Einen entsprechenden Bug-Report habe ich bei Adobe eingereicht.
In den grau hinterlegten Zeilen finden Sie Seitenobjekte/Absätze bzw. Tabellen und deren xhtml-Umsetzung. InDesign schreibt übrigens xhtml mit ein paar HTML5 Einsprengseln – aber eigentlich kein HTML wie man anhand dem Namen der Funktion vermuten würde. In den weißen Zellen folgen dann immer die CSS-Eigenschaften für das vorhergehende Element.
Alternativ kann man sich auch die inhaltlich gleiche PDF Aufbereitung herunterladen und ausdrucken.
Ergänzungen und Korrekturen sind willkommen! Hinterlassen Sie einen Kommentar oder schicken Sie mir eine Mail!
| Objekt/ InDesign-Eigenschaft |
Element/ CSS-Deklarationen |
Anmerkung |
| Dokument | <body> |
Ggf. Sprachattributxml:lang="en-US" |
| Ränder | HTML: body { margin: 0.5em; }EPUB: @page { margin : 0.5em; } |
Einstellung im Export-Dialog |
| Gruppen | <div class="ObjectStyle"></div> |
Bei Gruppen ohne Objektformat class="group" |
| Rahmen von Bildern | <div class="ObjectStyle"></div> |
|
| Bilder | <img class="ObjectStyle" |
Format wie in Objektexportoptionen oder Export-Dialog JPG, GIF oder PNGBei Bildrahmen ohne Objektformat class="image" |
| Bildausrichtung und -abstände | display: block; |
Bei Objektexportoptionen Klasse img.media-# |
| Verankerte Bilder mit Konturenführung |
<img class="leftFloat".../> |
Feste CSS-Regel:.leftFloat {Links/Rechts Aufteilung: Position von der Zeilenmitte. |
| Textabschnitte/Textrahmen | <div class="ObjectStyle"></div> |
Objektformat des ersten Textrahmens, bei Textrahmen ohne Objektformat class="story" |
| Absätze | <p class="ParagraphStyle"></p>Lokale Abweichungen mitclass="para-style-override-#" |
Zuweisung von <p>, <h1>,…<h6>und/oder Klasse möglich. Ggf. Sprachattribut xml:lang="en-US" |
| Ausrichtung | text-align: left; |
|
| Einzug erste Zeile | text-indent: 1px; |
|
| Abstände | margin: 4px 5px 6px 7x; |
Kein Abstand: margin: 0; |
| Verschachteltes Zeichenformat | CSS-Pseudoelement p.ParagraphStyle:first-line {} |
Wird nicht von allen Readern dargestellt |
| Weitere Formatierungen bei den Inline-Formaten | ||
| Nummerierte Liste | <ol></ol> |
Statische Listen mitGgf. Sprachattribut xml:lang="en-US"<ol class="List-#"> |
| Aufzählungsliste | <ul> <li class="Absatzformat"></li> |
Ggf. Sprachattribut xml:lang="en-US"<ul class="List-#"> |
Abstand links <ol>/<ul> |
margin-left: 9px; |
|
Abstand oben <li> |
margin-top: 0; |
|
Abstand unten <li> |
margin-bottom: 10px; |
|
Abstand rechts <li> |
margin-right: 10px; |
|
| Weitere Formatierungen wie bei Absatz oder Inline-Formaten | ||
| Inline-Formatierung | <span class="CharacterStyle">Lokale Abweichungen mitclass="char-style-override-#" |
Zuweisung von <em>, <strong>, <span> und/oder Klasse möglich.Ggf. Sprachattribut xml:lang="en-US" |
| Schriftart | font-family: "Schriftname"; |
EPUB CSS: Schriftdeklaration über@font-face {...} |
| Schriftgröße | font-size: 0.83em; |
|
| Fett | font-weight: bold; |
|
| Kursiv | font-style: italic; |
|
| Kapitälchen | font-variant: small-caps; |
|
| Farbe | color:#000000; |
|
| Hoch/Tiefstellung | vertical-align: super; |
|
| Unterstrichen | text-decoration: underline; |
|
| Durchgestrichen | text-decoration: line-through; |
|
| Kapitälchen | font-variant: small-caps; |
|
| Versalien | text-transform: uppercase; |
|
| Harter Zeilenumbruch | <br/> |
|
| Hyperlinkziele/Textanker | <a id="Name des Ankers"/> |
Einige Reader erwarten <a id=”Name des Ankers”></a> |
| Hyperlink | <a href="#Name des Ankers"></a> |
|
| Tabellen | <table id="table-#" class="Tabellenformat"> |
Feste CSS-Regel:table.Tabellenformat { |
| Kopf-, Körper-, Fußbereich |
<thead></thead>, |
Feste CSS-Regel:tbody, thead, tfoot, tr, td, th { |
| Tabellenzeilen | <tr></tr> |
Bei angewählter Option Abwechselndes Muster Zeile <tr class="Row-Column-#"> |
| Flächenfarbe | background-color: #D90000; |
|
| Tabellenspalten | <col class="Row-Column-#" /> |
Erstellung nur bei angewählter Option abwechselndes Muster Spalte |
| Flächenfarbe | background-color: #D90000; |
|
| Tabellenzellen | <td>Lokale Abweichungen mitclass="cell-style-override-#" |
Feste CSS-Regel:td { |
| Flächenfarbe | background-color: #D90000; |
|
| Zellenversatz | padding-bottom : 9px;padding-left : 6px;padding-right : 9px;padding-top : 9px; |
Unklare/fehlerhafte Umsetzung |
| Video | <div class="image"> <video id="FileName.mp4" width="#" height="#" tabindex="0"> <source type="video/mp4" src="File.mp4"> </source> </video></div> |
|
| Audio | <div class="image"> |
|
Die Bibliothek Extendables von Stijn Debrouwere ist inzwischen schon fast ein Jahr im Orbit. Die Idee ist ExtendScript, also die JavaScript Implementierung fast aller Adobe Anwendungen, mit nützlichen Funktionen zu erweitern. Die Klassiker sind die Erweiterungen der Klassen String und Array, wie z.B. die Methoden "Zeichenkette".trim() oder ".Zeichenkette".contains()
Neben vielen Erweiterungen und Gimmicks fällt vor allem das HTTP-Modul auf. Die bekannten Verfahren über das Socket-Objekt sind eher aufwändig und man braucht ein gesundes Verständnis des Protokolls HTTP. Mit Extendables kann man sich die Programmierung auf dieser Ebene sparen und direkt mit Webdiensten kommunizieren. Das Minimalbeispiel aus der Dokumentation zeigt das Vorgehen recht gut:
#include "extendables/extendables.jsx"; var http = require("http"); var response = http.get("http://www.w3c.org"); if (response.status == 200) { $.writeln(response.body); } else { $.writeln("Connection failed"); }
Mit Hilfe der #include Direktive wird die Bibliothek extendables.jsx eingebunden. Das http-Package wird über die Funktion require() aktiviert und kann dann über die Variable http angesprochen werden. Mit get() kann eine Webadresse abgerufen werden, das Ergebnis der Abfrage wird hier in der Variable response gespeichert, sie enthält in der Eigenschaft body die Website. In der hier nicht verwendeten Eigenschaft headers sind weitere Statusinformationen enthalten. Weitere Infos zum Thema HTTP spukt die gute alte Wikipedia recht übersichtlich aus.
Ich möchte hier ein Praxisbeispiel vorstellen. Gerade komplexe Skripte laufen manchmal nicht ganz fehlerfrei und brauchen ab und zu ein Update. Wenn diese Skripte dann noch auf verschiedenen Rechnern verteilt sind, wäre es praktisch, diese über ein Webupdate zu aktualisieren – ganz so wie das inzwischen jede moderne Software macht.
Für das Skript braucht man natürlich einen Webserver. Das Beispiel arbeitet mit einem Skript, das die Uhrzeit bei Erstellung anzeigt. Es wird minütlich auf meinem Server per Cronjob aktualisiert und bietet somit ein ideales Beispiel für das Update-Skript.
Das eigentliche Skript ist in der Funktion checkForUpdates() enthalten, die mit den Parametern _updateServerURL und _updateFile gesteuert werden kann.
checkForUpdates ("http://www.publishingx.de/software/test/", "package.zip");
Der aktuelle Pfad wird ebenfalls mit Hilfe der Extendables Erweiterung component()ermittelt.
var _path = Folder(File($.fileName).component('path'));
Die Versionsprüfung wird anhand des Inhalts der Textdatei etag.txt vorgenommen. Im sogenannten ETag speichert der Webserver die Versionsinformation einer Datei, dies wird z.B. beim Caching von Webbrowsern eingesetzt. Später beim Update speichert das Skript die Information, hier wird sie zunächst ausgelesen, um sie später mit der Version auf dem Server zu vergleichen. Das ist nicht der eigentliche Umgang mit dem HTTP Etag (304 Modified). Laut HTTP Standard sollte der Client anfragen, ob es überhaupt notwendig ist die neue Datei zu laden. Da dies in Extendables aber nicht implementiert ist, werde ich diesen Vergleich lokal vornehmen (und muss deswegen in jedem Fall den Header herunterladen).
var _etagFile = File (_path + "/etag.txt");
if (_etagFile.open("r")) {
var _localEtag = _etagFile.read();
_etagFile.close();
}
Zunächst wird geprüft, ob eine Internet-Verbindung besteht:
if( http.has_internet_access()) { /* ... */ }
Da eine ZIP-Datei heruntergeladen werden soll, muss die Anfrage im Binary-Mode vorgenommen werden. Deswegen muss der HTTPRequest selber gebaut werden, was aber kein Problem ist. Wichtig ist, das encoding des Requests auf BINARY zu stellen.
var _updateURL = _updateServerURL + _updateFile; var _req = new http.HTTPRequest("GET", _updateURL); _req.encoding("BINARY"); var _resp = _req.do();
In _resp ist nun die Antwort enthalten. Zunächst wird anhand der Eigenschaft status geprüft, ob die Daten vorhanden sind.
if( _resp.status == 200 ) { /* ... */ }
Wenn wir Daten erhalten haben, wird das ETag aus dem Header geladen und mit dem lokalen ETag verglichen.
var _remoteETag = _resp.headers["ETag"]; // == _resp.headers.ETag;
if (_remoteETag != _localEtag) { { /* ... */ }
Sollte eine veränderte Version vorliegen, muss diese gespeichert und entpackt werden. Dazu wird zunächst die ZIP-Datei in den TEMP-Folder geschrieben und dann mit app.unpackageUCF() entpackt. Beim Schreiben muss man natürlich wieder das richtige encoding einstellen.
var _zipFile = new File (Folder.temp + "/temp.zip"); _zipFile.encoding = "BINARY"; if (_zipFile.open("w")) { _zipFile.write(_resp.body); _zipFile.close(); } // ... app.unpackageUCF(_zipFile, _path);
Im Zip-Archiv befindet sich die Datei scriptToUpdate.jsx die dann automatisch auf dem lokalen Rechner überschrieben wird. Achten Sie darauf, dass InDesign unter Windows7 im Anwedungsordner normalerweise keine Schreibrechte hat, das Skript empfiehlt sich also für den Benutzer-Ordner.
Das Update Skript inklusive Extendables kann natürlich auch vollständig heruntergeladen werden: checkForUpdates.zip Leider ist in der aktuellen Version von Extendables ein Fehler bei er Verarbeitung von Binary-Daten enthalten. Stijn hat zugesagt diesen bald zu beheben, solange muss man leider noch die im Download-Archiv enthaltene und von mir gepatchte Version verwenden!
Update zum Buch InDesign automatisieren
Mit InDesign CS5.5 ist der EPUB- und XHTML-Export vollständig überarbeitet und deutlich verbessert worden. Viele Probleme beim Export gehören nun der Vergangenheit an und der Weg zu einem verkaufbaren EPUB ist deutlich kürzer geworden. Für das Buch InDesign automatisieren habe ich ein Zusatzkapitel mit den Neuerungen geschrieben. Neben der Vorstellung der Funktionen wird der Einsatz anhand eines Praxisbeispiels vorgestellt.
Das PDF können Sie hier herunterladen: 13.6 EPUB mit InDesign CS5.5, die Beispieldaten finden Sie im Bereich Download.
Swiss Publishing Week
Wer mich nach der langen Reise mal wieder live erleben möchte, kann zur Swiss Publishing Week kommen. Ich werde am Workflow Tag (16. September 2011) einige Sessions und Workshops machen.
Früh anmelden lohnt sich: Bis Ende Juli gibt es noch den Frühbucherrabatt!
Buch
Die Homepage zu meinem Buch InDesign automatisieren – Keine Angst vor Skripting, GREP & Co ist online. Hier findet man die Kurzreferenz, Skripte, Leseproben und alles was man sonst noch braucht…
http://www.indd-skript.de
Das Buch erscheint am 18. April. Ich bin jetzt erstmal in Südamerika!



