CID Keyed Fonts

Eine »Errungenschaft« der neuen LuaTeX-Version ist, dass sie nicht mehr bei CID-keyed Schriftdateien abstürzt.

Das hat in der Vergangenheit die Benutzung der Noto Sans verhindert, zumindest in der Ausführung, die man auf der Webseite herunterladen kann.

Ich wollte heute nur mal kurz die Schriftart testen, um festzustellen, dass die ganz anders aufgebaut ist, als normale CFF-basierte OpenType Fonts. Hier werden die Zeichen in einzelnen Kind-Schriftarten gekapselt, ähnlich wie bei .ttc, den TrueType Collections.

Insofern musste ich den Fontloader etwas anpassen, aber das Ergebnis ist wieder ein wichtiger (wenn auch kleiner) Schritt in Richtung Weltherrschaft.

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

  <LoadFontfile name="NSR" filename="NotoSansCJKsc-Regular.otf" />
  <DefineFontfamily name="text" fontsize="10" leading="12">
    <Regular fontface="NSR"/>
  </DefineFontfamily>

  <Record element="data">
    <PlaceObject>
      <Textblock>
        <Paragraph>
          <Value>NotoSansCJKsc-Regular 燉牛肉很好吃</Value>
        </Paragraph>
      </Textblock>
    </PlaceObject>
  </Record>

</Layout>

CID-Keyed Font Noto beinhaltet haufenweise Glyphen

Das wird in der Version 3.5.2 (und dann auch in der Version 3.6) enthalten sein.

von Patrick Gundlach |

Neue Version 3.4.0

Es gibt mal wieder eine neue »stabile« Version. Es stehen ein paar größere Änderungen im Publisher an1, daher friere ich den aktuellen Stand ein. Wer die Entwicklungsversionen verfolgt hat, wird keine Überraschungen feststellen. Hier ein paar Punkte, die sich seit der letzten stabilen Version im März getan haben. Nachzulesen natürlich auch im Changelog. Seit dem letzten Stabilen Release wurden 14 Entwicklerversionen erzeugt.

  • Update auf LuaTeX Version 1.0.7. Hier gibt es minimale visuelle Änderungen. Siehe auch den Beitrag über LuaTeX 1.0.4. Dort steht auch, was die nächsten Versionen bringen werden.
  • Hyperlinks innerhalb von Dokumenten.
  • Erweiterte Bookmarks
  • Textdrehungen in Tabellenzellen
  • Manuell gesteuerte Seitenumbrüche in Tabellen (<TableNewPage>)
  • Neue Lua-Runtime und Erweiterung des Lua-Filters für die Datenvorverarbeitung.
  • Natürlich etliche Fehlerkorrekturen. Ich bin immer wieder erstaunt, auf welche Spezialfälle die Benutzer treffen.

Die Version ist wie immer auf der Downloadseite zu finden: https://download.speedata.de/

von Patrick Gundlach |

Happy Birthday XML

XML ist 20 Jahre alt geworden. Foto: Steven Pemberton

Im Jahr 1998 wurde XML vom W3C veröffentlicht. Auf der letzten Balisage (Markup-Konferenz) ist dieses Foto entstanden. Zeit für ein kleines persönliches Resümee, da ich beruflich ja sehr intensiv mit XML zu tun habe.

von Patrick Gundlach |

Neue Preisstruktur

Nach gefühlten Ewigkeiten habe ich die Preise für den Support des Publishers geändert. Eines vorweg: eine Preiserhöhung hat es nicht gegeben, sondern nur eine Änderung der Pakete bzw. ein neues Paket ist hinzugekommen.

Doch besser der Reihe nach:

  1. Die Preise sind transparent und auf der Webseite zu sehen. Ich mag dieses »für Preise bitte anrufen« nicht, und ich denke, das trifft auf viele zu.

  2. Die OpenSource-Version wird immer kostenlos zu haben sein. Persönlichen Support kann ich natürlich nicht geben. Hilfe gibt es auf Stackoverflow, im Chat oder im Bugtracker. Hier schaue ich regelmäßig vorbei und beantworte, was ich kann, aber ohne Garantie. Noch ein Hinweis: die OpenSource-Version unterscheidet sich nur im Support von den anderen Versionen.

  3. Neu hinzugekommen ist die Kategorie »für Spontane«. Hier helfe ich gegen Bezahlung, aber ohne Abonnement. Und das auch nur per E-Mail, damit ich mir die Zeit besser einteilen kann.

  4. Die Kategorie »Standard« ist ähnlich wie bisher, enthält aber jeden Monat zwei Stunden Support (auch per Telefon).

  5. Die Kategorie »Professional« ist für die Poweruser, die auch für ältere Versionen des Publishers Unterstützung benötigen. Außerdem wird dadurch mehr als bei den anderen Paketen die Weiterentwicklung des Publishers ermöglicht (z.B. Handbuch).

  6. Daneben gibt es natürlich auch die Möglichkeit der persönlichen Absprache. Wer intensive Unterstützung haben möchte, kann bei Mindestabnahme von Support auch besondere Konditionen bekommen.

Jetzt bleibt natürlich die Hoffnung, dass das neue Preismodell auch mehr Firmen anspricht, die nur Kleinigkeiten fragen möchten. In der letzten Zeit (vermutlich auch durch das ausführliche Handbuch) sehe ich immer mehr eigenständige Nutzer des Publishers. Die stecken dann manchmal an einem Punkt fest und brauchen nur gelegentlich Hilfe.

Vielleicht ziehe ich in einem Jahr oder so mal ein Fazit und schreibe, ob alles so geklappt hat, wie ich mir das erhoffe.

von Patrick Gundlach |

Neue Lua-Runtime

Version 3.3.10 wird eine neue Lua-Runtime für die Daten-Vorverarbeitung (siehe Lua-Filter im Handbuch). Der Anwender sollte hiervon eigentlich nichts merken, bis auf ein paar Änderungen, die ich im gleichen Atemzug durchgeführt habe:

  • Die Bibliotheken müssen mit require() geladen werden.

    xml = require("xml")
    tbl = {
    ["_type"] = "element",
    ["_name"] = "data",
    {
       ["_type"] = "element",
       ["_name"] = "child",
       "Hallo Welt",
    }
    }
    
    
    ok, msg = xml.encode_table(tbl)
    if not ok then
    print(msg)
    os.exit(-1)
    end
  • Es wird nur Lua Version 5.1 unterstützt, nicht wie bisher 5.2

  • Dafür werden auch die Lua-Patterns unterstützt (z.B. string.gsub())

  • Die CSV-Bibliothek hat andere Rückgabewerte

von Patrick Gundlach |

Hyperlinks innerhalb eines Dokuments

Eine kleine Neuerung hat die Version 3.3.8 des Publishers gebracht, die ich kurz erwähnen möchte. Ab sofort kann man Hyperlinks innerhalb eines Dokuments erstellen1. Der Code dafür ist sehr einfach:

von Patrick Gundlach |

Neue stabile Version 3.2.0

Nach gut einem halben Jahr Entwicklung ist es wieder an der Zeit eine neue Stabile Version (3.2) hochzuladen. Verfügbar ist sie wie immer als fertige Pakete für Mac, Linux und Windows unter https://download.speedata.de/ und als Quellcode auf GitHub.

Neuerungen sind

  • Viele Fehlerkorrekturen, wie immer (ich bin erstaunt, wie viele Fehler die Anwender so finden, aber meist sind das doch sehr obskure Kombinationen von Eingabedaten…)
  • Lua basiertes Preprocessing. Eine ausführliche Beschreibung dazu gibt es im Handbuch. Damit kann man vor dem Lauf Daten aus Excel- oder CSV-Dateien lesen und nach XML konvertieren oder Daten mit XSLT umwandeln oder validieren.
  • ZUGFeRD-Integration. Damit lassen sich Rechnungen im XML-Format an das PDF anhängen, so dass die PDF-Datei und die XML-Datei dieselben Informationen enthalten.
  • Tabellenausgleich (auf der letzten Tabellenseite bei mehrseitigen Tabellen). Siehe Beitrag hier im Blog.
  • Schusterjungen und Hurenkinder können nun nicht nur mit yes/no an- und ausgeschaltet werden, sondern mit einer Zahl kann bestimmt werden, wie viele Zeilen zusammen hängend bleiben sollen.
  • Das neue Handbuch ist in der Distribution enthalten.
  • Neue Version der TeXGyreHeros-Schriftarten (mit Fehlerkorrekturen und neuen Zeichen).
  • Neue Eigenschaften des Textformats (tab="hspace") um aus einem Tabulator-Zeichen einen beliebig dehnbaren Zwischenraum zu erzeugen.
  • Fehlende Zeichen werden angemerkt und erzeugen einen Fehler. Das kann mit reportmissingglyphs="no" bei <Options> ausgeschaltet werden.
  • Neue Layout- und XPathfunktionen sd:dimexpr() und round().
  • Setzen von Autor, Titel und anderen Metainformationen möglich.
  • Span wird (ein wenig) unterstützt, damit kann man farbige Hintergründe erzeugen.
  • und andere Kleinigkeiten…
von Patrick Gundlach |

So wird das Handbuch erzeugt

Lange habe ich nach einem halbwegs vernünftigen Workflow gesucht, um mein Handbuch zu erstellen. Inzwischen ist es ja online verfügbar, daher ist es jetzt eine gute Gelegenheit, die benutzten Tools aufzuzeigen. Doch zuvor gibt es ein paar Hintergründe, warum ich diesen Weg gewählt habe.

Notwendige Eigenschaften des Workflows

  1. OpenSource-Tools: alle Komponenten und Konverter müssen frei verfügbar sein. Das ist mir sehr wichtig, nicht nur, weil ich selber ein großer Verfechter des OpenSource-Gedankens bin. Vielmehr ist mir wichtig, dass ich die Dokumentation auf einem Unix-Rechner (Mac, Linux) automatisch erzeugen lassen kann, ohne Gedanken über die Gültigkeit von Softwarelizensierungen machen zu müssen.

  2. Verschiedene Ausgabeformate. Zwar ist HTML das Hauptziel, trotzdem möchte ich in der Lage sein, ein hochwertiges PDF und ggf. auch ein ebook-Format (z.B. epub) zu erzeugen. Für HTML gibt es ja etliche Werkzeuge, für hochwertiges PDF aber fast nur LaTeX. (Und falls jemand »dogfooding« in den Raum wirft: der speedata Publisher ist für Produktkataloge und Datenblätter etc. aus XML-Quellen spezialisiert, für Handbücher ist das gute alte LaTeX immer noch das Mittel der Wahl.)

  3. Single-Source Publishing. Also: nur eine Quelle für die Dokumentation haben, nicht mehrere. Was passiert, wenn man mehrere verschiedene Quellen pflegen muss, brauche ich nicht auszuführen.

  4. Die HTML-Ausgabe soll aus mehreren Seiten bestehen. Der Text des Handbuches ist so umfangreich, dass die Benutzerführung arg darunter leiden würde, wäre die HTML-Datei eine lange Seite.

  5. Bequemes editieren von Quelldateien.

Auf den letzten Punkt möchte ich etwas ausführlicher eingehen.

Bequemes editieren von Quelldateien

Das ist natürlich sehr subjektiv, man kann hervorragend darüber streiten, was »bequem« ist. Folgende Eigenschaften hätte ich gerne, damit ich Texte schnell und ohne große Schmerzen bearbeiten kann.

  1. Plain Text Eingabeformat, am besten eine leichte Markup-Sprache wie Markdown. Ich möchte nicht zwischen LaTeX oder DocBook-Tags navigieren.

  2. Direkte oder zeitnahe Vorschau. Ich möchte die Änderungen, die ich mache, unmittelbar oder ohne merkliche Verzögerung sehen.

  3. Leichtes Verlinken zu anderen Textteilen.

  4. Unterstützung von Git (Änderungen nachverfolgbar). Mit dem ersten Punkt ist das gegeben.

Ausgangspunkt: das RELAX NG Schema

Vorhanden ist die Datei commands.xml, aus der ich das RELAX NG Schema erstelle. Genau genommen sind es zwei, je eines mit deutscher und englischer Beschreibung der Befehle. Den Konverter dazu habe ich in Go geschrieben, weil mir XSLT mit de Saxon doch manchmal viel zu langsam ist…

Mit einem selbst geschriebenen Konverter erzeuge ich aus der commands.xml die RELAX NG Schemadateien. Angestoßen wird der Prozess mit »rake schema« auf der Kommandozeile.

Die Datei commands.xml möchte ich weiterhin als Grundlage für den Referenzteil benutzen, da hier formal beschrieben ist, welche Parameter (Attribute) jeder Befehl haben kann, eine Kurzbeschreibung dazu, ein Beispiel und weiterführende Informationen.

<command en="AttachFile" since="3.1.1">
    <description xml:lang="en">
      <para>Attach a ZUGFeRD file.</para>
    </description>
    <description xml:lang="de">
      <para>Binde eine ZUGFeRD Datei ein.</para>
    </description>
    <childelements/>
    <attribute en="filename" optional="no" type="text">
      <description xml:lang="en">
        <para>The name of the local file to be attached to the PDF.</para>
      </description>
      <description xml:lang="de">
        <para>Der Name der Datei, die in die PDF-Datei eingebettet werden soll.</para>
      </description>
    </attribute>
    ...
    <example xml:lang="en">
      <listing><![CDATA[<AttachFile filename="invoice.xml" description="A ZUGFeRD invoice." type="ZUGFeRD invoice"/>]]></listing>
    </example>
    <example xml:lang="de">
      <listing><![CDATA[<AttachFile filename="invoice.xml" description="ZUGFeRD Rechnung" type="ZUGFeRD invoice"/>]]></listing>
    </example>
    <seealso/>
</command>

Quellformat für das Handbuch

Es liegt nahe, Markdown als Quellformat für die übrigen Teile des Handbuchs zu benutzen. Mit dem statischen Seitengenerator HUGO zusammen sind die Punkte oben einigermaßen erfüllt, doch mir fehlen bei Markdown viele semantische Auszeichnungen wie Indexeinträge, Abbildungsunterschriften, Fußnoten, Tabellen, Definitionslisten, … Außerdem fehlt mir bei Markdown die formale Strenge, die ein XML-basiertes Format wie DocBook hat. Aber DocBook-Dateien zu bearbeiten macht nun wirklich nur begrenzt Spaß und erfüllt meine Voraussetzungen (teilweise) nicht.

DocBook als Zwischenformat

Nach langem Suchen und Testen bin ich auf das Format AsciiDoctor gestoßen, das im Prinzip zwei Ausgabeformate hat: HTML und DocBook. Das HTML Format hat leider den Nachteil, dass es immer eine einzige Seite erzeugt. Somit bleibt DocBook übrig. Da man aus XML mit XSLT leicht andere Formate erzeugen kann, insbesondere wenn diese wiederum textbasiert sind (wie HTML und LaTeX), ist das für mich die Lösung der Problem oben.

Aus dem Referenzteil »commands.xml« und den handgeschriebenen Seiten wird mit AsciiDoctor die DocBook-Datei. Aus dieser kann man nun alle weiteren Ausgaben erzeugen. HUGO hilft dabei, das Handbuch mit den umfangreichen Designanforderungen zu erzeugen.

Live-Preview während der Eingabe

Ich habe oben erwähnt, dass AsciiDoctor auch HTML erzeugt. Das nutze ich, wenn ich das Handbuch bearbeite. Von HUGO habe ich mir eine Funktionalität geklaut, die ich sehr praktisch finde. Speichert man im HUGO-Baum eine Quelldatei, so aktualisiert sich der Browser selbständig. Mit dieser quasi-Live-Vorschau sieht man schnell, ob eine Formatierung auch richtig angewendet wird. Das habe ich für AsciiDoctor angepasst und so kann ich immer nahezu sofort im Browser sehen, ob alles richtig ist.

AsciiDoctor erzeugt auch HTML, das nutze ich aber nur für die Korrekturschleife des Handbuchs. Die eigentliche HTML-Ausgabe für das fertige Handbuch erfolgt wie oben.

von Patrick Gundlach |

Aufzählungsliste nachahmen

Der Publisher hat (derzeit) noch keine besonderen Fähigkeiten, Aufzählungslisten zu erstellen. Das liegt auch daran, dass sie sich recht leicht über Textformate nachahmen lassen.

Dafür definiert man ein Textformat mit hängendem Einzug und benutzt das mit dem Text mit den Aufzählungszeichen:

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

  <DefineTextformat name="li" indentation="6pt" rows="-1"/>
  <Record element="data">
    <PlaceObject>
      <Textblock textformat="li">
        <Paragraph><Value></Value><Value select="sd:dummytext()"></Value></Paragraph>
        <Paragraph><Value>• Two</Value></Paragraph>
        <Paragraph><Value>• Three</Value></Paragraph>
      </Textblock>
    </PlaceObject>
  </Record>

</Layout>

Aufzählungen können über Tabellen simuliert werden.

von Patrick Gundlach |

Neue Version vom Oxygen

Ich empfehle ja allen Leuten, die ein Layout-Regelwerk bearbeiten wollen, den Oxygen als XML-Editor zu benutzen (die Developer Ausführung reicht). Davon gibt es eine neue Version (Version 20), die Liste der Änderungen gibt es hier:

von Patrick Gundlach |