headerbild blog

Feature der Woche fällt aus // Neuigkeiten

Das Feature der Woche fällt diese Woche leider aus. Letzte Woche war ich im Urlaub und diese Woche steht der Umzug ins neue Büro an. Und wenn jetzt jemand sagt, »das hättest du auch vorbereiten können«, dann hat er natürlich recht.

Im Moment passiert recht viel im Hintergrund. Neben den erwähnten neuen Büroräumen (Reichsstraße 92A in Berlin), die erst einmal neu eingerichtet werden wollen, gibt eine Veranstaltung, auf die ich hinweisen möchte. Der OpenSource Day findet am 23. November 2016 statt. Hier werde ich vor Ort sein und auch die Gelegenheit für einen kurzen Pitch haben. Die Veranstaltung findet in der c-base statt, eine gute Gelegenheit diesen Ort mal kennen zu lernen.

Weiterhin bin ich gerade dabei, die nun wirklich in die Jahre gekommene Webseite zu überarbeiten. Bis diese fertig gestellt ist, wird es aber noch etwas dauern, weil dazu noch etliche Dinge zu erledigen sind. (Außerdem wartet ja auch die tägliche Arbeit…)

Ebenfalls bin ich gerade dabei, die »mini-GmbH« in eine »echte« GmbH zu wandeln. Das habe ich schon länger vor, nun will ich den Prozess endlich bis Jahresende abschließen.

Und last but not least steht auch langsam mal die Veröffentlichung der Version 3 ins Haus. Ich erwarte keine großartigen Änderungen mehr. Ich will die Software noch ein wenig »reifen« lassen. Dann habe ich eine wirklich stabile Version 3 (mit ein paar nicht rückwärtskompatiblen Änderungen).

von Patrick Gundlach |

Feature der Woche: Schneidemarken & co.

In der 20. Ausgabe der Reihe »Feature der Woche« (Jubiläum!) geht es um Schneidemarken (Schnittmarken) und um Beschnittzugabe. Ob Schneidemarken in der heutigen digitalen Druckwelt überhaupt noch eine Notwendigkeit haben, vermag ich nicht zu beurteilen. Man kann sie mit

<Options cutmarks="yes" />

einschalten. An allen vier Ecken gibt es nun zwei Striche, die das Endformat (z.B. DIN A4) anzeigen. Die Striche gehen nicht bis ganz zur Schnittkante, damit noch ein wenig »Spiel« ist, wenn das Blatt nicht exakt zugeschnitten wird. Beim Druck wird oft nicht nur eine Seite auf ein Blatt gedruckt, sondern viele Seiten auf einen Bogen. Mit den Schneidemarken können nun die Seiten passend ausgeschnitten werden. (Eine Google Bildersuche ist sehr erhellend.)

Linke obere Schneidemarke. Das Endformat (TrimBox) ist grün markiert

Beschnittzugabe / Anschnitt

Verwandt mit dem Thema der Schnittmarken ist die Beschnittzugabe (auch: Anschnitt, engl. bleed). Sie kennzeichnet einen Bereich rund um das Endformat, in den sichtbare Objekte im Endformat, die an den Rand stoßen, in den Rand hineinragen sollen. Das klingt kompliziert, ist aber ganz einfach:

Bild ohne und mit Beschnittzugabe. Das Endformat (TrimBox) ist grün markiert. Mit negativen Längenangaben bei padding kann man den gezeigten Effekt erreichen.

In beiden Fällen wird das Papier (sofern es gedruckt wird) am grünen Rahmen abgeschnitten. In der Praxis treten aber im Druck und dem anschließenden Beschnitt kleine Ungenauigkeiten auf so dass der Schnitt nicht unbedingt exakt an der Kante des Bildes ist. Ist der Schnitt ein wenig zu weit vom Bild entfernt, sieht man im Ergebnis einen unschönen kleinen weißen Streifen. Um das zu vermeiden, schiebt man das Bild etwas in den Rand (Anschnitt) hinein und stellt sicher, dass immer »im Bild« ausgeschnitten wird. Wie groß die Beschnittzugabe ist, kann im Publisher eingestellt werden:

<Options bleed="3mm" />

Die Voreinstellung ist 0.

Zwei Dinge werden durch diese Angabe erreicht: zum einen wird der Anschnitt im PDF markiert (die BleedBox, im Beispiel oben blau dargestellt), so dass die weiter verarbeitende Software dies automatisch erkennt. Zweitens wird für manche Befehle (derzeit wird nur Box unterstützt) die Option bleed="..." nützlich.

<Box width="5" height="2" bleed="left" />

Die Box wird dann um die passenden Ausmaße vergrößert, ohne, dass man noch etwas rechnen muss.

Dieser Artikel bezieht sich auf den speedata Publisher in der Version 2.7.7. Andere Versionen haben womöglich andere Befehle oder die genannten Befehle zeigen ein anderes Verhalten. Bitte schau im Zweifelsfall in der Anleitung nach.

In der Serie »Feature der Woche« beschreibe ich einmal in der Woche mehr oder weniger nützliche Eigenschaften des Publishers. Kommentare gerne an mich per E-Mail oder einfach im Kommentarfeld.

von Patrick Gundlach |

Feature der Woche: Dateiorganisation

Diese Woche geht es ganz abstrakt um »Dateiorganisation«. Wo müssen die Bilder gespeichert sein, die im Dokument verwendet werden, wie muss die Datendatei heißen?

Wenn der Publisher startet, wird das aktuelle (Arbeits-)Verzeichnis und alle Kindverzeichnisse eingelesen und die Dateinamen gespeichert. Sobald eine Ressource geladen wird (Schriftdatei, Bilddatei) wird in dieser Liste nachgeschaut, ob eine entsprechende Datei existiert. Dabei wird nicht unterschieden, in welchem Verzeichnis die Datei liegt. Daraus folgt:

  1. Wenn während des Laufs sich etwas im Dateisystem ändert, bekommt der Publisher davon nichts mit
  2. Es ist egal, wie die Verzeichnisse heißen. Die Bilder können, müssen aber nicht, im Verzeichnis mit dem Namen »bilder« speichert sein.
  3. Wenn das Arbeitsverzeichnis zu groß ist, ist der Startvorgang langsam. Einige Tausend Dateien im Arbeitsverzeichnis sind in der Regel kein Problem, aber irgendwann wird es zu langsam.

Es gibt Ausnahmen von der Regel:

  1. Man kann mit sp --no-local den Publisher anweisen, das Arbeitsverzeichnis nicht rekursiv zu durchsuchen.
  2. Mit --extra-dir kann man ein Verzeichnis hinzufügen, das rekursiv durchsucht wird (das Argument kann mehrfach angegeben werden, um weitere Verzeichnisse einzubinden.).
  3. Mit sp --systemfonts wird für Schriftdateien auch in Verzeichnissen gesucht, die vom System vorgegeben sind.
  4. Mit sp --wd DIR kann ein Verzeichnis angegeben werden, das zum Arbeitsverzeichnis wird (es wird ein cd DIR vor dem Lauf ausgeführt).

Welche Namen müssen die Datendatei und die Layoutdatei haben?

Der speedata Publisher sucht das Layout mit dem Namen layout.xml und die Datendatei mit dem Namen data.xml. Beide lassen sich auf der Kommandozeile (--layout=XYZ und --data=XYZ) und in der Konfigurationsdatei anpassen (layout=XYZ und data=XYZ).

Mögliche Dateiorganisation in einem Verzeichnis. Der Name der Unterverzeichnisse (Ordner) ist beliebig.

Dieser Artikel bezieht sich auf den speedata Publisher in der Version 2.7.5. Andere Versionen haben womöglich andere Befehle oder die genannten Befehle zeigen ein anderes Verhalten. Bitte schau im Zweifelsfall in der Anleitung nach.

In der Serie »Feature der Woche« beschreibe ich einmal in der Woche mehr oder weniger nützliche Eigenschaften des Publishers. Kommentare gerne an mich per E-Mail oder einfach im Kommentarfeld.

von Patrick Gundlach |

Feature der Woche: Bilder einbinden

Bilder in das PDF einbinden geht sehr einfach mit dem Publisher:

<Record element="data">
    <PlaceObject>
        <Image file="_samplea.pdf" width="5cm"/>
    </PlaceObject>
</Record>

Das Bild _samplea.pdf ist (wie _sampleb.pdf) Bestandteil des Publishers und für Testzwecke gut nutzbar. Als Bildformate sind PDF, PNG und JPEG möglich. Andere Formate müssen vor der Verarbeitung in eines dieser Formate konvertiert werden. Das Format, das in der Praxis am wenigsten Probleme bereitet ist PDF. Hier können auch Farbprofile eingebettet werden.

Die Bilder werden bei der Verarbeitung im Publisher nicht verändert, das heißt, sie behalten unter anderem ihre ursprüngliche (Datei-)Größe bei. Bei sehr großen Bildern ist die Verarbeitungsgeschwindigkeit geringer und die Größe der resultierenden PDF-Datei nimmt natürlich zu. Daher kann es sich lohnen, für die Verarbeitung spezielle Versionen mit kleineren Dateigrößen bereit zu halten.

Breite und Höhe der Bilder

Wenn man Bilder einbindet, dann ist es immer sinnvoll, eine Größenangabe mitzugeben. Ansonsten wird die natürliche Größe des Bildes genommen. Was die natürliche Größe ist, ist nicht immer eindeutig zu sagen. In der Regel gibt es in der Bilddatei eine DPI-Angabe. Die ist aber oftmals willkürlich vom Bildbearbeitungsprogramm gesetzt (EXIF Felder). Wenn dort beispielsweise 72 DPI steht, ist ein 720 Pixel breites Bild 10 Zoll breit. Bei 300 DPI wäre das nur 2,4 Zoll.

Da man sich aber auf die Angabe nicht verlassen kann, werden Größenangaben für die Ausgabe benötigt. Das kann entweder die gewünschte Höhe des Bildes oder die gewünschte Breite des Bildes sein, oder beide Angaben zusammen. Im Beispiel oben hat das Bild eine Breite von fünf Zentimeter. Die Angabe kann natürlich auch als absolute Angaben in Rasterzellen gemacht werden. Ebenso verhält sich die Angabe einer Höhe. Die Angabe von 100% bedeutet, dass die gesamte verfügbare Breite genutzt werden soll (derzeit – Version 2.7.4 – werden andere Prozentangaben noch nicht unterstützt). Die Angabe auto ist wie das Weglassen der Angabe und ergibt keinen Sinn (außer, dass das kompatibel zu CSS ist).

Wenn beide Proportionen angegeben sind (Breite und Höhe) gibt es zwei Modi: Beibehalten des Seitenverhältnisses oder Strecken bzw. Stauchen der Ausgabe.

<PlaceObject>
    <Image file="ocean.pdf" width="10" height="3" clip="no"/>
</PlaceObject>

ergibt ein horizontal gestrecktes Bild:

Ist clip auf 'no' gesetzt, wird das Bild verzerrt.

Mit clip="yes" ist das Bild so ausgeschnitten, dass auf einer Seite die maximalen Ausmaße genommen werden

<PlaceObject>
    <Image file="ocean.pdf" width="10" height="3" clip="yes"/>
</PlaceObject>

(Die Datei ocean.pdf kann hier herunter geladen werden.)

Ist clip auf 'yes' gesetzt, wird nur ein Ausschnitt gezeigt.

Die Größe von Bildern kann man mit den beiden XPath-Funktionen sd:imagewidth(<Dateiname>) und sd:imageheight(<Dateiname>) ermitteln. Das Ergebnis ist in Rasterzellen. Vorsicht, hier wird die natürliche Größe genommen, die gegebenenfalls ohne Aussagekraft ist.

Maximale Höhe und Breite, minimale Höhe und Breite

Um die natürliche Größe zu benutzen, aber Einschränkungen anzugeben, gibt es die vier Kombination aus min/max und width/height. Das Bild in dem folgenden Beispiel wird nicht breiter als 10 Rasterzellen und nicht höher als 3. Das Seitenverhältnis bleibt erhalten:

<PlaceObject>
    <Image file="forest.jpg" maxwidth="10" maxheight="3" />
</PlaceObject>

Das Bild ist auf die Höhe von drei Rasterzellen beschränkt.

Drehen von Bildern

Mit dem Attribut rotate kann man Bilder in 90 Grad Schritten drehen (positive Werte: im Uhrzeigersinn). Das nachfolgende Beispiel dreht ein Bild um 90 Grad gegen den Uhrzeigersinn, wenn es sich um ein Hochformat-Bild handelt. Mit dem XPath-Befehl sd:aspectratio(<Dateiname>) kann man das Seitenverhältnis eines Bildes ermitteln. Wenn es größer als 1 ist, dann handelt es sich um ein Bild im Querformat.

Mit der folgenden Datendatei:

<data>
    <img file="_samplea.pdf" />
    <img file="_sampleb.pdf" />
</data>

und der dazugehörigen Datei layout.xml

<Layout xmlns:sd="urn:speedata:2009/publisher/functions/en"
    xmlns="urn:speedata.de:2009/publisher/en" >

    <Record element="data">
        <ForAll select="img">
            <PlaceObject>
                <Image file="{@file}" width="5"
                       rotate="{if ( sd:aspectratio(@file) &lt; 1 ) then '-90' else '0'}"/>
            </PlaceObject>
            <NextRow/>
        </ForAll>
    </Record>
</Layout>

wird das zweite Bild um 90° gegen den Uhrzeigersinn gedreht. Die geschweiften Klammern bei file und rotate bedeuten, dass in den XPath-Modus gesprungen wird, um die Ausdrücke auszuwerten.

Achtung: ist das Bild im Argument von sd:aspectratio() nicht im Dateisystem vorhanden, wird der Wert von dem Platzhalterbild genommen. Um zu überprüfen, ob ein Bild überhaupt vorhanden ist, kann man den Befehl sd:file-exists(<Dateiname>) benutzen.

Speicherort der Bilddateien

Meist liegen die Bilder im Dateisystem oder in einem DAM (digital asset management). Im Dateisystem können sie entweder mit einem absoluten Pfad angesprochen werden:

<Image href="file:///Pfad/zum/Bild.pdf"  />

oder als Datei in einem der Unterverzeichnisse des Suchpfads. Beispielweise können die Bilder in dem Unterverzeichnis images liegen:

Mögliche Dateiorganisation in einem Verzeichnis. Der Name der Unterverzeichnisse (Ordner) ist beliebig.

Die Bilder können auch mittels http-Protokoll von einem Webserver geladen werden. Die Syntax ist analog zum Beispiel mit dem absoluten Pfad:

<Layout xmlns="urn:speedata.de:2009/publisher/en" >

    <Record element="data">
        <PlaceObject>
            <Image href="http://placekitten.com/g/400/300" width="5"/>
        </PlaceObject>
    </Record>
</Layout>

Derzeit (Version 2.7.4) wird das https-Protokoll (SSL) nicht unterstützt.

Bild nicht gefunden?

Was passiert, wenn ein Bild nicht gefunden wird? Das normale Verhalten ist die Ausgabe einer Fehlermeldung und einem Platzhalterbild, das das Fehlen anzeigt:

<PlaceObject>
    <Image file="doesnotexist" width="5"/>
</PlaceObject>

Dass die Bilddatei nicht gefunden wurde, sollte sofort zu erkennen sein.

Eine andere Möglichkeit besteht darin, mit fallback ein Platzhalterbild selber zu bestimmen:

<PlaceObject>
    <Image file="doesnotexist" fallback="......" width="5"/>
</PlaceObject>

Man kann auch noch einstellen, ob es ein Fehler ist, wenn ein Platzhalterbild ausgewählt wird, oder nur eine Warnung.

<Options imagenotfound="error"/>

bzw. warning für eine Warnung.

Besonderheiten bei PDF-Dateien

PDF-Dateien haben einige Besonderheiten: sie können mehrere Seiten enthalten und die einzelnen Seiten haben verschiedene Boxen, die den sichtbaren Bereich und andere Bereiche markieren. Manche der Boxen sind für den Ausdruck wichtig, manche für die Ansicht im PDF-Anzeigeprogramm. Die Box, die mit den angegebenen Größen angezeigt werden soll, wird mit dem Attribut visiblebox (bis Version 2.7.5: maxsize) bestimmt:

<Image file="seite.pdf" width="210mm" height="297mm" visiblebox="artbox"/>

bedeutet, dass die »artbox« in der Größe 210mm × 297mm dargestellt wird.

Das Attribut page wurde schon in Feature der Woche: Mehrseitige PDF einbinden vorgestellt. Er dient dazu, die Seite auszuwählen, wenn eine PDF-Datei eingebunden wird. Mit sd:number-of-pages(<Dateiname>) kann ermittelt werden, wie viele Seiten eine PDF-Datei enthält.

Weitere Parameter

  • Man kann über die padding-*-Angaben festlegen, wie viel Abstand das Bild vom entsprechenden Rand haben soll.

  • Mit dipwarn kann eine Warnung herausgegeben werden, wenn die tatsächliche Anzahl der Pixel je Zoll geringer ist, als die Vorgabe.

Dieser Artikel bezieht sich auf den speedata Publisher in der Version 2.7.4. Andere Versionen haben womöglich andere Befehle oder die genannten Befehle zeigen ein anderes Verhalten. Bitte schau im Zweifelsfall in der Anleitung nach.

In der Serie »Feature der Woche« beschreibe ich einmal in der Woche mehr oder weniger nützliche Eigenschaften des Publishers. Kommentare gerne an mich per E-Mail oder einfach im Kommentarfeld.

von Patrick Gundlach |

Feature der Woche: Debugging

Nicht immer klappt die Textausgabe, wie sie soll. Manchmal sind Objekte zu breit, manchmal wird das falsche Textformat genommen und gelegentlich sieht die Tabelle nicht so aus, wie sie eigentlich sollte. Damit die Fehlersuche nicht zu schwierig wird, gibt es im speedata Publisher diverse Hilfen. In Version 2.7.4 wurde der Befehl Trace eingeführt, der verschiedene Schalter beinhaltet. Derzeit sind dies (mit Voreinstellung):

von Patrick Gundlach |

Inkompatible Änderungen in Version 3

Der Publisher wird in Version 3 (auf die ich gerade hin arbeite) zu den älteren Version inkompatible Eigenschaften haben:

  • Das Regelwerk gibt es nur noch auf Englisch, die deutschsprachige Variante fällt weg
  • Das Verhalten bei PlaceObject, wenn der rechte Rand des Objekts auf den rechten Rand der Seite fällt, ist nun wie folgt: der virtuelle Cursor wird dann auf die nächste Zeile in Spalte 1 gesetzt. Folgender Code zeigt die Änderung (siehe Fehler #105):
von Patrick Gundlach |

Feature der Woche: Qualitätssicherung / PDF-Vergleich

Diese Woche gibt es einen Auszug aus dem Handbuch. Da das Thema mehr Beachtung bekommen soll, gibt es dafür einen eigenen Beitrag

Um zu gewährleisten, dass neue Versionen des Publishers auch exakt dieselben Ergebnisse liefern wie vorhergehende, hat der Publisher eine Funktionalität eingebaut, mit der man unerwünschte Verhaltensänderungen erkennen kann.

Die Idee ist folgende: ausgehend von einer Layout-Datei und einem überprüften Ergebnis (Referenz PDF) kann der Publisher kontrollieren, ob mit der aktuellen Version noch immer dasselbe Ergebnis erzielt wird. Dazu erstellt man eine Layoutdatei und Datendatei im XML Format, lässt eine PDF Datei daraus erzeugen und speichert diese unter dem Namen reference.pdf ab. Bei dem Aufruf von sp compare <Verzeichnis> wird nun der Publisher erneut aufgerufen und prüft visuell, Seite für Seite, ob die resultierende Datei mit der vorher angelegten PDF Datei reference.pdf übereinstimmt.

Voraussetzungen für den Vergleich

Der Publisher sucht rekursiv ausgehend von dem angegebenen Verzeichnis nach Verzeichnissen, die eine Datei layout.xml oder eine Datei publisher.cfg enthalten. In diesem Verzeichnis wird dann ein Publisher-Durchlauf gestartet. Die Layoutdatei muss unter dem Namen layout.xml, die Daten-Datei unter dem Namen data.xml zu finden sein, falls das nicht in der (optionalen) Datei publisher.cfg anders konfiguriert ist.

Der PDF-Vergleich benötigt eine Installation der kostenfreien Programmbibliothek ImageMagick, die skriptbasiert Bilder manipulieren und vergleichen kann. ImageMagick gibt es unter anderem für die Betriebssysteme Windows, Mac und Linux.

Vorgehensweise

Ausgehend von einer Layout und einer Datendatei erzeugt man in gewohnter Weise eine PDF Datei. Am einfachsten ist es, wenn sie direkt unter dem Namen reference.pdf erscheint.

sp --jobname reference

erzeugt die passende PDF-Datei. Mit

sp --jobname reference clean

löscht man die übrigen und nicht weiter benötigten Zwischendateien. Das Verzeichnis sieht nun so aus:

beispiel/
├── data.xml
├── layout.xml
└── reference.pdf
 
0 directories, 3 files

Wird nun sp compare beispiel aufgerufen, sollte es keine Beanstandung geben und als Ausgabe erscheinen:

$ sp compare beispiel/
Total run time: 1.62956s

Falls nun eine zukünftige Version des Publishers eine visuelle Änderung des Layouts hervorrufen würde, wäre die Ausgabe z.B. folgende:

$ sp compare beispiel/
/pfad/zum/verzeichnis/beispiel
Comparison failed. Bad pages are: [0]
Max delta is 2162.760009765625
Total run time: 862.898ms

Die Unterschiede sind als PNG Dateien in dem Verzeichnis enthalten:

beispiel/
├── data.xml
├── layout.xml
├── pagediff.png
├── publisher.pdf
├── reference.pdf
├── reference.png
└── source.png

Die Dateien source.png und reference.png (bzw. bei mehreren Seiten mit einer Kennung für die Seitenzahl) enthalten die aktuelle Version und die Referenz als Grafik. Die Datei pagediff.png (auch hier mit Kennungen für die Seitenzahlen) stellt die Unterschiede zwischen den ersten beiden Dateien hervorgehoben dar. Die Gemeinsamkeiten werden abgeschwächt dargestellt.

Qualitätssicherung

Mit den Möglichkeiten des PDF-Vergleichs kann man nun eine Sammlung von Beispieldokumenten erstellen, die produktionstypisch sind. Eine Vorgehensweise besteht darin, eine Verzeichnisstruktur zu erstellen, die wie folgt aufgebaut ist:

qa/
├── beispiel1
│   ├── data.xml
│   ├── layout.xml
│   └── reference.pdf
├── beispiel2
│   ├── data.xml
│   ├── layout.xml
│   └── reference.pdf
├── beispiel3
│   ├── data.xml
│   ├── layout.xml
│   └── reference.pdf
├── beispiel4
│   ├── data.xml
│   ├── layout.xml
│   └── reference.pdf
└── beispiel5
    ├── data.xml
    ├── layout.xml
    └── reference.pdf

Mit dem Aufruf sp compare qa werden alle Unterverzeichnisse durchlaufen und überprüft. Im besten Fall ist die Ausgabe:

$ sp compare qa/
Total run time: 4.541458s
In der Serie »Feature der Woche« beschreibe ich jeden Montag mehr oder weniger nützliche Eigenschaften des Publishers. Kommentare gerne an mich per E-Mail oder einfach im Kommentarfeld.
von Patrick Gundlach |

Feature der Woche: Schriftarten einbinden

Das Einbinden von Schriftarten in den gängigen Formaten ist sehr einfach. Unterstützt werden die Formate Type1 (Dateien .pfb und .afm) sowie TrueType und OpenType (Dateien .ttf und .otf). TrueType collections sind prinzipiell möglich, aber noch nicht freigeschaltet (hier hätte ich gerne ein paar Testfälle).

Um dem Publisher Schriftarten bekannt zu machen und zu nutzen, sind zwei Schritte notwendig. Der erste Schritt ist das Laden einer Schriftdatei:

von Patrick Gundlach |

TeXs Trennalgorithmus

Wie im letzten Post (Feature der Woche »Silbentrennung«) schon angedeutet, gibt es hier eine Zusammenfassung, wie die Silbentrennung in TeX (und damit auch im speedata Publisher) funktioniert. Detailliert ist sie in Franklin Liangs Dissertation »Word Hy-phen-a-tion by Com-put-er« nachzulesen (zu finden auf der Seite der TUG).

Der Trennalgorithmus funktioniert statisch, das heißt, jedes Wort wird gleich getrennt, egal wo es in einem Satz vorkommt oder welche Bedeutung es hat. So wird nicht zwischen Staub-ecken und Stau-becken unterschieden. Grundlage für die musterbasierte Trennung ist eine Datei mit Einträgen wie

1auto
1to
2dc
2hn
2u1t
3bah
3mä
a2u
c4h
d1ch
h2en.
o1b
uto1
ä1d

Die Datei enthält in der Regel etliche tausend solcher Einträge. Diese Einträge sind Wortbestandteile mit Zahlen zwischen einzelnen Buchstaben. In den Zahlen steckt die Information darüber, ob an dieser Stelle getrennt werden darf oder nicht, und welche Priorität diese Regel hat. Man kennt solche Hilfen wie »Trenne nie st, denn es tut ihm weh.« (die inzwischen ja nicht mehr gilt). So könnte man dieses Verbot mit s4t ausdrücken. Hier bedeuten gerade Zahlen, dass nicht getrennt werden darf, ungerade Zahlen erlaubte Trennstellen. Und je höher die Zahl, desto mehr Gewicht hat sie. Für die Trennstelle bei Haus-tür könnte man mit einem zusätzlichem Muster haus5t die obige Regel aufheben, da 4 kleiner ist als 5.

Die Vorgehensweise ist nun folgende. Wenn man ein Wort hat, für das man die erlaubten Trennstellen ermitteln möchte, wandelt man es erst in Kleinbuchstaben um und fügt vorne und hinten ein Wortbegrenzungszeichen ein, bei TeXs Trennmustern ist das ein Punkt. So wird aus Autobahn ».autobahn.« Dann probiert man alle Trennmuster durch, ob sie irgendwo in dieses Wort passen. In diesem Beispiel sind das die Muster a2u, 1auto, 2u1t, uto1, 1to, o1b, 3bah und 2hn. Die Zahlen lässt man für das Ausprobieren weg. Hier werden die Muster an die passende Stelle unter das Wort geschrieben:

       .  a  u  t  o  b  a  h  n  .
--------------------------------------
a2u         2
1auto    1
2u1t        2  1
uto1                 1
1to            1
o1b                  1
3bah                 3
2hn                        2
--------------------------------------
Maximum
       .  a  u  t  o  b  a  h  n  .
         1  2  1  0  3  0  2  0  0

Es wird also das Maximum aller Zahlen in einer Spalte gebildet und dann wird das Wort wieder zusammengesetzt, im Beispiel also .1a2u1to3bah2n. Die Nullen kann man einfügen, muss man aber nicht. Dann werden die geraden Zahlen gelöscht: .1au1to3bahn. Dann werden alle ungeraden Zahlen durch Trennmöglichkeiten ersetzt und die Punkte für die Wortbegrenzung weggelassen: -au-to-bahn. Es sind also drei Trennstellen erlaubt: am Anfang vor dem Wort (das ist natürlich Unfug und fällt weg), dann bei au- und to-.

Im nächsten Beispiel gibt es ein Muster mit einem Wortende und einmal einen Konflikt zwischen a1d (Trennung erlaubt) und 2dc (Trennung nicht erlaubt):

       .  m  ä  d  c  h  e  n  .
3mä      3
ä1d            1
2dc            2
d1ch              1
c4h                  4
h2en.                   2

Maximum
       .  m  ä  d  c  h  e  n  .
         3     2  1  4  2

Hier ist die einzige erlaubte Trennung zwischen d und ch. TeX wählt die Parameter so, dass die ersten drei Zeichen eines Wortes und die letzten beiden Zeichen nicht getrennt werden. Daher fällt die erste 3 bei dem letzten Beispiel weg.

Nachtrag 8.9.2016: auf github liegt ein in Go geschriebenes Programm, das den Algorithmus umsetzt.

von Patrick Gundlach |