headerbild blog

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 |

Tabellenspalten ausgleichen

Ganz frisch (seit Version 3.1.24) gibt es ein neues Feature: Tabellenspalten »ausgleichen«. Damit lassen sich die Tabellen auf den Seiten ausgleichen. In der Regel benutzt eine Tabelle erst den ersten Positionierungsrahmen eines Bereichs, dann den nächsten etc.

von Patrick Gundlach |

Neuigkeiten

Es ist mal wieder an der Zeit, die aktuellen Geschehnisse der letzten zwei Monate aufzuschreiben.

Neue Webseite

Lange habe ich1 daran getüftelt, nun ist sie online. Die Seite ist wie gehabt unter https://www.speedata.de zu finden und ist im »neuen« corporate Design. Es folgt dann noch eine englische Übersetzung und dieser Blog, dann war es das soweit mit der Neugestaltung. Die letzte Webseite war noch von Anfang meiner Selbständigkeit und beinhaltete z.B. gar keinen Download-Link… Nun ist alles besser! Und hoffentlich auch einigermaßen übersichtlich.

Die Seite ist wie das Handbuch und diesen Blog übrigens mit Hugo realisiert, eine schicke Software, die statische Webseiten erstellt. Damit spare ich mir die Wordpress-Installation.

Zig neue Versionen des Publishers

Etwas übertrieben, aber einige Versionen sind es schon, hauptsächlich sind es kleine Nettigkeiten, die das Leben mit dem Publisher erleichtern. Ich bereite gerade die Version 3.2 vor, dann wird es auch eine Zusammenfassung der Neuigkeiten geben.

Das vorletzte Treffen der XUGBER (XML User Group Berlin) war zum Thema Print-CSS. Auf der XMLPrague war das auch mehrfach Thema (sowohl dieses Jahr als auch die letzten Jahre). Ein wenig spiele ich gerade damit herum (https://github.com/speedata/experimental), aber neben dem Tagesgeschäft, mit dem ich meine Brötchen verdiene, komme leider nur zu wenig dazu, das weiterzuentwickeln. Trotzdem macht es Spaß, sich in eine (für mich) neue Technologie einzulesen (und festzustellen, wie bescheuert und einschränkend CSS im Vergleich zum Publisher ist…). Mal schauen, was die nächsten Monate so bringen. Alles noch im pre-alpha Stadium.

Public-Domain Bibeln

Auf Amazon gibt eine Reihe Public-Domain Bibeln, die mit dem Publisher erzeugt wurden. Derzeit sind nur lateinische Sprachen verfügbar, demnächst aber hoffentlich auch Arabisch und andere rechts-nach-links-Sprachen.

Goldene Palme

In Zusammenarbeit mit einem großen Reiseveranstalter (Studiosus) habe ich einen »Persönlichen Katalog« entwickelt, der mit print-on-demand über Reisebüros erhältlich ist. Das kommt nicht nur bei den Kunden sehr gut an, sondern gibt auch diverse Preise der Branche, z.B. den ersten Preis des Deutschen Reisepreises Goldene Palme 2018 in der Kategorie “Veranstalter”.

von Patrick Gundlach |

Neues Handbuch

Das neue Handbuch ist nun online. Ein Grund zum Feiern: es hat etwa ein Jahr gebraucht von den ersten Texten bis zum aktuellen Status. Derzeit ist es nur auf Deutsch verfügbar, eine englische Version wird bald in Angriff genommen (kennt jemand einen guten Übersetzer für technische Dokumente?).

In der Distribution ist bis zur Übersetzung noch das alte Handbuch enthalten, das zwar immer noch aktuell, aber nicht so ausführlich ist.

Ein paar Neuerungen gegenüber dem alten Handbuch:

  • Volltextsuche
  • Ausführlicher (das neue Handbuch hat viele Beispiele, Bilder und How-Tos, die Reihe »Feature der Woche« ist im Handbuch aufgegangen)
  • Auf Mobilgeräten nutzbar (responsive Design)
  • Mit viel Liebe zum Detail gestaltet (Syntax Highlighting, leichte Navigation, …)

Demnächst gibt es an dieser Stelle ein paar Sätze zum Workflow. Nur soviel: der Text ist in Asciidoctor geschrieben, wird nach DocBook konvertiert und dann per XSLT nach Markdown und anschließend mit Hugo in eine Webseite umgewandelt. Das hört sich kompliziert an, aber dank Automatisierung geht alles wunderbar einfach. Irgendwann bestimmt auch auf Github verfügbar.

von Patrick Gundlach |

XML-Konferenz in Prag

Auch im Jahr 2018 findet XML-Konferenz in Prag statt. Siehe

http://www.xmlprague.cz/

Und wieder tritt speedata als Sponsor auf.

Dazu haben wir eine Eintrittskarte (Full pass) zu verschenken! Wer die Karte haben möchte, möge sich melden, entweder per E-Mail oder per Kommentar hier (oder per Twitter).

Also, auf eine Eintrittskarte und ein, zwei 🍻!

(Siehe auch den Eintrag vom letzten Jahr)

von Patrick Gundlach |

Excel nach PDF Konverter

Im letzten Beitrag habe ich schon erwähnt, dass der Publisher nun Excel-Dateien lesen und nach XML konvertieren kann. Somit eignet sich der speedata Publisher als »Excel nach PDF« Konverter. Das einzige, das man machen muss, ist eine kleine Prozedur schreiben, die die Daten bestimmten XML-Knoten zuweist.

Excel-Dateien lesen

Der erste Schritt für die Ausgabe von Excel-Dateien, diese einzulesen.

Das Gerüst (der Lua Filter) habe ich nun mehrfach beschrieben, z.B. ist das ähnlich wie bei den CSV-Dateien.

Es muss eine Lua-Datei erzeugt werden (z.B. xl2pdf.lua), die folgenden Aufbau hat:

spreadsheet, err = xlsx.open(".....xlsx")

if not spreadsheet then
    print(err)
    os.exit(-1)
end

mit dem spreadsheet-Objekt kann man auf die einzelnen Arbeitsblätter zugreifen:

-- Die Anzahl der Arbeitsblätter kann man mit dem # operator (#spreadsheet) erhalten.
ws = spreadsheet[1]
if not ws then
    os.exit(-1)
end

Nun kann man mit ws(x,y) auf die Zelle x,y zugreifen, wobei 1,1 die erste Zelle oben links ist. Die Größe des Arbeitsblattes ist in den Variablen ws.minrow, ws.maxrow und ws.mincol, ws.maxcol enthalten.

Und die XML-Daten schreiben

Die XML-Daten kann man über die Schnittstelle xml.encode_table(data) erzeugen. Wenn z.B. ein rechteckiger Bereich einfach als XML geschrieben werden soll, dann kann folgender Code benutzt werden:

local data = {}
local row, cell

data._name = "data"

for y=ws.minrow,ws.maxrow do
    row = {}
    row._name = "row"
    for x=ws.mincol,ws.maxcol do
        cell = {}
        cell._name = "cell"

        cell[1] = ws(x,y)
        row[#row + 1] = cell
    end
    data[#data + 1] = row
end

ok, err = xml.encode_table(data)
if not ok then
    print(err)
    os.exit(-1)
end

Die Ausgabe ist wieder wie bei dem CSV2PDF converter:

Das vollständig lauffähige Beispiel ist im Examples-Repository im Bereich technical zu finden.

von Patrick Gundlach |