Version 5.9.2

# Version 5

## 5.9

### 5.9.2 (21.8.2026)

- Das Attribut height verkleinert jetzt auch QR-Codes. ↗
  Das Attribut `height` bei `<Barcode>` wurde bei QR-Codes ignoriert, der Code füllte immer die verfügbare Breite. Da QR-Codes quadratisch sind, bestimmt jetzt der kleinere Wert von `width` und `height` ihre Größe (#732).
- Neue Einstellung luafile: Lua-Callbacks für Dateisuche und Bildkonvertierung. ↗
  Die neue Konfigurationseinstellung `luafile` (Kommandozeile `--luafile`) lädt zu Beginn des Publishing-Laufs eine Lua-Datei. Darin lassen sich Callbacks registrieren: `lookup_file` schreibt Dateinamen vor der Dateisuche um, `image_handler` und `resize_handler` steuern die Konvertierung von Bildern mit externen Programmen. Die Callbacks sind der flexiblere Ersatz für die Einstellungen `pathrewrite`, `imagehandler` und `resizehandler`, die weiterhin wie bisher funktionieren (#710).
- Mit LoadFontfile geladene Schriften haben Vorrang vor den eingebauten Schriften serif, sans und monospace. ↗
  Wird eine Schriftdatei mit `<LoadFontfile>` unter einem der eingebauten Namen `serif`, `sans` oder `monospace` (oder einer ihrer Varianten für fett und kursiv) geladen, dann wird diese Schrift jetzt auch in der Ausgabe verwendet. Bisher wurde stattdessen stillschweigend die eingebaute Schrift benutzt, was auch zu Meldungen über fehlende Zeichen führen konnte (#718).
- Neues experimentelles Kommando Math für mathematische Formeln. ↗
  Das neue Kommando `<Math>` setzt mathematische Formeln, die in MathML-Notation angegeben werden. Unterstützt werden Brüche, Wurzeln sowie Hoch- und Tiefstellungen, sowohl im Fließtext als auch im Display-Stil. Benötigt wird eine Mathematikschrift im OpenType-Format wie Latin Modern Math; sie wird als Schriftfamilie geladen und über das Attribut `fontfamily` ausgewählt. Das Kommando ist experimentell, der unterstützte MathML-Umfang wächst in den nächsten Versionen.

### 5.9.1 (18.8.2026)

- Der alte XPath-Parser (luxor) wurde entfernt. ↗
  Layouts werden immer mit dem lxpath-Parser verarbeitet. Die Konfigurationseinstellung `xpath` und `require="luxor"` bei `<Layout>` führen jetzt zu einer Fehlermeldung. Die Kommandozeilenoptionen `--extra-xml` und `--prepend-xml` sind ebenfalls entfallen, zum Aufteilen des Layouts auf mehrere Dateien dient XInclude.
- Der alte fontforge-Fonthandler wurde entfernt. ↗
  Schriften werden immer mit harfbuzz geladen und gesetzt. Die Konfigurationseinstellung `fontloader`, das Attribut `mode` bei `<LoadFontfile>` und `require="fontforge"` bei `<Layout>` führen jetzt zu einer Fehlermeldung. Type-1-Schriften (.pfb) werden nicht mehr unterstützt, bitte nach OpenType konvertieren.

## 5.8

### 5.8.0 (17.8.2026)

- Veröffentliche Version 5.8.0.

## 5.7

### 5.7.12 (17.8.2026)

- Ausgeglichene Spalten bei Output werden jetzt nach der Höhe geteilt. ↗
  Wurde der Inhalt von `<Output balance="yes">` auf zwei Rahmen verteilt, bestimmte die Anzahl der Zeilen die Teilungsstelle, nicht ihre Höhe. Unterschiedlich hohe Zeilen führten zu sichtbar ungleichen Spalten. Jetzt wird nach der tatsächlichen Höhe geteilt, und die zweite Spalte wird nie höher als die erste (#714).
- Beim Ausgleichen geteilter Tabellen werden wiederholte Tabellenköpfe jetzt berücksichtigt. ↗
  Wurde eine Tabelle mit `balance="yes"` auf mehrere Rahmen verteilt, fehlte die Höhe der wiederholten dynamischen Tabellenköpfe (Zeilen mit `sethead="yes"`) in der Höhenberechnung. Bei hohen Köpfen wurden die Rahmen ungleich hoch oder der Inhalt lief unten über den Rahmen hinaus. Jetzt enden die Rahmen auf gleicher Höhe (#715).
- Die Sperrung bei Span hängt jetzt von der Schriftgröße ab. ↗
  Wenn das Attribut `letter-spacing` bei `<Span>` auf `yes` gesetzt war, wurde ein fester Abstand zwischen die Zeichen eingefügt, unabhängig von der Schriftgröße. Das war für kleinen Text viel zu viel und für große Überschriften zu wenig. Jetzt beträgt der Abstand ein Zehntel der aktuellen Schriftgröße, so dass die Sperrung zu allen Größen passt (#716).
- Gruppen können jetzt beliebig groß werden. ↗
  Der virtuelle Bereich einer `<Group>` war intern auf zehn Seitenhöhen begrenzt. Objekte, die über diese Grenze hinausreichten, landeten wieder am Anfang der Gruppe und überlappten den vorhandenen Inhalt. Jetzt wächst die Gruppe mit ihrem Inhalt mit (#717).

### 5.7.11 (14.8.2026)

- Ein falsches Namensraum-Präfix in einem XPath-Funktionsaufruf ergibt jetzt eine verständliche Fehlermeldung. ↗
  Wenn ein XPath-Ausdruck eine Funktion mit einem unbekannten Namensraum-Präfix aufrief, zum Beispiel `fn:tabhead()` mit einem nicht deklarierten Präfix `fn`, brach der Publisher mit einem internen Fehler und einem langen Stacktrace ab. Jetzt steht im Protokoll eine verständliche Fehlermeldung mit dem Präfix, dem Funktionsnamen und der Stelle in der Layoutdatei.
- Zellen über mehrere Spalten richten sich nach der ersten überspannten Spalte. ↗
  Enthielt eine Tabellenzelle mit `colspan` eine Tabelle oder ein Bild, wurde die horizontale und vertikale Ausrichtung aus der letzten überspannten Spalte übernommen. Eine Zelle, die bis zu einer rechtsbündigen Spalte reichte, wurde deshalb rechtsbündig ausgegeben. Jetzt gilt die Ausrichtung der ersten überspannten Spalte, so wie es bei Absätzen schon der Fall war.
- Objekte, die auf die nächste Seite rutschen, behalten die angeforderte Spalte. ↗
  Wenn ein mit `<PlaceObject column="...">` platziertes Objekt nicht mehr in den restlichen Platz auf der Seite passte und nicht geteilt werden konnte, wurde es auf der Folgeseite in der ersten Rasterspalte ausgegeben statt in der angeforderten Spalte. Jetzt bleibt die angeforderte Spalte erhalten.
- Bei Verwendung des veralteten XPath-Parsers (luxor) oder des fontforge-Fonthandlers erscheint jetzt eine Warnung. ↗
  Der alte XPath-Parser (`luxor`) und der alte fontforge-Fonthandler sind veraltet und sollen mit Version 6.0 entfernt werden. Der Publisher schreibt jetzt eine Warnung ins Protokoll, wenn einer von beiden verwendet wird, mit einem Hinweis, wie die Umstellung auf die Voreinstellungen `lxpath` und `harfbuzz` gelingt.

### 5.7.10 (12.8.2026)

- Das Sammeln von Elementen in einer Variablen mit Copy-of funktioniert wieder. ↗
  Wurde eine Variable mit `<SetVariable>` und `<Copy-of select="$var"/>` Schritt für Schritt erweitert, fanden Pfadausdrücke wie `$var/eintrag` nur das zuletzt hinzugefügte Element. Ein so aufgebautes Stichwortverzeichnis, das an `<Makeindex>` übergeben wurde, enthielt zum Beispiel nur einen Eintrag. Mit dem alten XPath-Parser (`luxor`) funktionierte alles wie erwartet. Jetzt werden wieder alle gesammelten Elemente gefunden (#712).
- Der Befehl sp doc zeigt jetzt das mitgelieferte Handbuch an. ↗
  Die ZIP-Dateien der Distribution enthalten jetzt das Handbuch im HTML-Format. Der Befehl `sp doc` liefert es über einen lokalen Webserver aus und öffnet den Browser; mit `--no-autoopen` bleibt der Browser geschlossen. Wird kein lokales Handbuch gefunden, öffnet der Befehl wie bisher die Online-Dokumentation.
- Der alte XPath-Parser (luxor) und der alte fontforge-Fonthandler sind veraltet. ↗
  Der alte XPath-Parser (`luxor`) und der alte fontforge-Fonthandler sind veraltet und sollen mit Version 6.0 entfernt werden. Layouts, die noch eine der beiden Varianten nutzen, sollten auf die Voreinstellungen `lxpath` und `harfbuzz` umgestellt werden. Wie das geht, zeigt das Kapitel zur Kompatibilität mit älteren Versionen im Handbuch.

### 5.7.9 (10.8.2026)

- Seiten aus SavePages und InsertPages erhalten jetzt Endformat- und Anschnittrahmen. ↗
  Wurden alle Seiten über `<SavePages>` und `<InsertPages>` ausgegeben, fehlten im PDF die Angaben zu Endformat und Anschnitt (TrimBox und BleedBox), was zum Beispiel den PDF/X-Standard verletzt (#705).

### 5.7.8 (28.7.2026)

- Mit Function definierte Funktionen liefern ihr Ergebnis jetzt in allen Kontexten. ↗
  Das Ergebnis einer mit `<Function>` definierten Funktion kam nur bei `<Value select="...">` und `<SetVariable>` an. In `<Message select="...">` und in Attributausdrücken in geschweiften Klammern, zum Beispiel `file="{concat('a-', fn:add(3,4), '.pdf')}"`, war der Funktionsaufruf stillschweigend leer. So entstanden kaputte Werte wie „a-.pdf“ statt „a-7.pdf“, ohne jeden Hinweis im Protokoll. Das Funktionsergebnis steht jetzt überall zur Verfügung, wo XPath-Ausdrücke erlaubt sind, auch in Stringfunktionen wie `concat()` und in Vergleichen (#704).

### 5.7.7 (27.7.2026)

- Kein Absturz mehr mit dem veralteten Attribut colorprofile bei Options. ↗
  Wenn das veraltete Attribut `colorprofile` bei `<Options>` eine ICC-Datei angab, die einem der eingebauten Farbprofile entspricht, stürzte der Publisher beim Schreiben der PDF-Datei ab. Das Attribut funktioniert wieder; empfohlen ist stattdessen `<DefineColorprofile>` zusammen mit `colorprofile` bei `<PDFOptions>`.
- Kein Absturz mehr, wenn dieselbe Schriftdatei mit dem harfbuzz- und dem fontforge-Fonthandler geladen wird. ↗
  Wurde dieselbe Schriftdatei einmal mit `mode="harfbuzz"` (der Voreinstellung) und einmal mit `mode="fontforge"` bei `<LoadFontfile>` geladen, brach der Publisher mit der Meldung „Perhaps you have combined harfbuzz with fallback? Please file a bug report.“ und einem Lua-Fehler ab. Beide Varianten können jetzt im selben Layout verwendet werden.
- text-decoration: line-through und dashed funktionieren jetzt in HTML-Auszeichnungen. ↗
  In HTML-Auszeichnungen wurde `text-decoration: line-through` als Unterstreichung statt als Durchstreichung ausgegeben, und `text-decoration-style: dashed` ergab immer eine durchgezogene Linie. Durchstreichung und gestrichelte Linien werden jetzt korrekt ausgegeben. Die Stile `dotted` und `wavy` sind noch nicht umgesetzt und erscheinen als durchgezogene Linie.
- Nach einem Zeilenumbruch (Br) behält der Absatz sein Textformat. ↗
  Der Teil eines Absatzes nach einem `<Br/>` wurde mit einem Format formatiert, das vom Standardformat `text` abgeleitet war statt vom Textformat des Absatzes. Einstellungen wie Ausrichtung oder Einzüge gingen nach dem Umbruch verloren. Das abgeleitete Format erbt jetzt vom zugewiesenen Textformat.
- Eine CSS-Regel ::before ohne content zerstört die HTML-Ausgabe nicht mehr. ↗
  Eine `::before`-Regel ohne die Eigenschaft `content` ließ Teile der HTML-Ausgabe verschwinden und konnte den Publisher zum Absturz bringen, zum Beispiel bei Listen oder Tabellen. Wie in CSS vorgesehen erzeugt eine solche Regel jetzt einfach kein Pseudoelement, die übrige Ausgabe bleibt unverändert.
- Der neue XML-Parser wird jetzt auch für Daten von der Standardeingabe und für sd:decode-html() verwendet. ↗
  Wenn der neue XML-Parser aktiv ist (die Voreinstellung), verwendete der Publisher beim Einlesen der Daten von der Standardeingabe (`--data -`) und für das Ergebnis der Layoutfunktion `sd:decode-html()` intern noch den alten XML-Parser. Jetzt wird in beiden Fällen der neue Parser verwendet. Dadurch gehen Attribute im Ergebnis von `sd:decode-html()` in Verbindung mit `<HTML select="...">` nicht mehr verloren, zum Beispiel Links mit `href`.
- Type-1-Schriften (.pfb) funktionieren wieder ohne weitere Einstellungen, sind aber veraltet. ↗
  Beim Laden einer Type-1-Schrift (.pfb) ohne die Angabe `mode="fontforge"` bei `<LoadFontfile>` brach der Publisher mit der Fehlermeldung „lua-loaded font has no name“ ab. Jetzt schaltet er automatisch auf den alten fontforge-Fonthandler um und gibt eine Warnung aus. Der fontforge-Fonthandler ist veraltet und wird in einer zukünftigen Version entfernt. Type-1-Schriften sollten nach OpenType konvertiert werden.

### 5.7.6 (23.7.2026)

- Warnung bei unbekannten Attributen im Layout. ↗
  Attribute, die ein Befehl nicht kennt, wurden bisher stillschweigend ignoriert, zum Beispiel ein Tippfehler wie `<Textblock widht="...">` oder ein Attribut an einem Element, das es nicht unterstützt. Der Publisher zeigt jetzt eine Warnung mit dem Namen des Attributs und des Elements. Attribute aus anderen Namensräumen (etwa `xml:lang` oder eigene Anmerkungen) werden wie bisher ignoriert. Die Prüfung ist mit dem neuen XML-Parser aktiv; einige alte, nicht dokumentierte Schreibweisen wie `backgroundcolor` statt `background-color` erhalten jetzt ebenfalls eine Warnung, funktionieren aber weiterhin (#702).
- Keine Endlosschleife mehr, wenn der Text in AtPageCreation nicht in die Fläche passt. ↗
  Wenn ein `<Output>` innerhalb von `<AtPageCreation>` oder `<AtPageShipout>` mehr Text enthielt, als in die Rahmen der Fläche passt, geriet der Publisher in eine Endlosschleife, weil an dieser Stelle keine neue Seite begonnen werden kann. Jetzt wird der Text ausgegeben, der Platz findet, der Rest wird verworfen und eine Fehlermeldung nennt die betroffene Fläche (#701).
- Eine Mark innerhalb eines Paragraph geht nicht mehr verloren. ↗
  Eine `<Mark>` wurde nur als direktes Kind von `<Textblock>` oder `<Td>` verarbeitet. Innerhalb eines `<Paragraph>` wurde sie stillschweigend ignoriert. Eine Mark kann jetzt auch innerhalb eines Absatzes an beliebiger Stelle im Text stehen und liefert die Seite, auf der diese Stelle ausgegeben wird (#699).
- XPath-Ausdrücke mit Vereinigungen wie „a | b“ funktionieren jetzt. ↗
  Mit dem neuen XML-Parser lieferte ein Vereinigungsausdruck wie `select="foo | bar"`, zum Beispiel in `<ProcessNode>`, ohne Fehlermeldung nur den Teil vor dem `|`. Vereinigungen funktionieren jetzt wie erwartet: Das Ergebnis enthält die Knoten aller Teile in Dokumentreihenfolge, Duplikate werden entfernt. Auch die Operatoren `intersect` und `except` werden unterstützt (#698).
- Die XPath-Funktionen upper-case() und lower-case() wandeln jetzt auch Umlaute und andere Sonderzeichen um. ↗
  Mit dem neuen XML-Parser änderten `upper-case()` und `lower-case()` nur die Buchstaben A bis Z. Umlaute und andere Zeichen außerhalb von ASCII blieben unverändert, aus `upper-case('Reisebüro')` wurde also „REISEBüRO“. Beide Funktionen nutzen jetzt die vollständigen Unicode-Regeln für die Groß- und Kleinschreibung: Umlaute und Buchstaben mit Akzenten werden wie erwartet umgewandelt, und `upper-case('Straße')` ergibt „STRASSE“. Das Verhalten des alten XML-Parsers (`--xpath=luxor`) bleibt unverändert (#697).
- Ein Paragraph ohne Inhalt erzeugt jetzt eine Leerzeile. ↗
  Ein `<Paragraph>` ohne Inhalt wurde in der Ausgabe ignoriert. Er erzeugt jetzt immer eine Leerzeile, genau wie ein Absatz, der nur ein geschütztes Leerzeichen (`&#xa0;`) enthält. Das gilt für ein leeres `<Paragraph></Paragraph>` ebenso wie für einen Absatz, dessen Kindelemente keinen Inhalt liefern, zum Beispiel ein leeres `<Value/>`, ein `<Value select="..."/>` ohne Treffer oder ein `<ForAll>` beziehungsweise `<Switch>` ohne Ausgabe. Wer in solchen Fällen keine Leerzeile möchte, erzeugt den Absatz stattdessen innerhalb von `<ForAll>` beziehungsweise `<Switch>`.

### 5.7.5 (21.7.2026)

- Das neue Attribut break-pagetype bei Table fügt zwischen den Teilen einer mehrseitigen Tabelle eine zusätzliche Seite ein. ↗
  Wenn eine Tabelle an einem Seitenumbruch geteilt wird, fügt das neue Attribut `break-pagetype` bei `<Table>` zwischen den beiden Teilen der Tabelle eine zusätzliche Seite ein, zum Beispiel für die Rückseite eines Blattes. Der Wert ist der Name eines Seitentyps; der Inhalt der eingefügten Seite wird mit `<AtPageCreation>` dieses Seitentyps erzeugt. Die Seitennummerierung läuft normal weiter.

### 5.7.4 (9.7.2026)

- Ein zentrierter rechtsläufiger Absatz mit einem Zeilenumbruch wird wieder korrekt zentriert. ↗
  In einem zentrierten Absatz mit Schreibrichtung von rechts nach links (etwa Arabisch oder Hebräisch), der einen Zeilenumbruch (`<Br/>`) enthält, wurde die Zeile nach dem Umbruch leicht aus der Mitte verschoben. Solche Zeilen werden jetzt wieder korrekt zentriert.
- Die Zeichen U+0083 (no break here) und U+2060 (word joiner) verhindern jetzt einen Zeilenumbruch. ↗
  Daten enthalten manchmal die Zeichen U+0083 (`&[#131](https://github.com/speedata/publisher/issues/131);`, „no break here“) oder U+2060 (`&[#8288](https://github.com/speedata/publisher/issues/8288);`, „word joiner“), um zwei Wörter auf einer Zeile zu halten. Bisher führte U+0083 zu einem Fehler „Glyph is missing from the font“, und U+2060 wurde stillschweigend verworfen. Beide Zeichen tun jetzt das, wofür sie gedacht sind: An ihrer Position wird nicht umbrochen, und ein angrenzendes Leerzeichen wird ebenfalls geschützt (#695).

### 5.7.3 (8.7.2026)

- Ein literales „<“ wie in „<5“ ist in Text für sd:decode-html() jetzt erlaubt. ↗
  Text, der an `sd:decode-html()` übergeben wurde und ein `<` enthielt, das kein HTML-Tag einleitet (etwa ein Kleiner-als-Zeichen wie in „Menge <5“), ließ bisher den gesamten Wert scheitern und musste in den Daten maskiert werden. Ein solches `<` wird nun wie in Webbrowsern als normaler Text behandelt, sodass alltägliche Vergleiche und ähnliche Ausdrücke ohne zusätzliche Maskierung funktionieren.

### 5.7.2 (3.7.2026)

- Letztes Glyph bleibt im Hyperlink, wenn dieser eine Box beendet (z. B. NoBreak). ↗
  Wenn ein Hyperlink bis zum letzten Node einer Liste reichte (`head.next == nil`), fügte `insert_nonmoving_whatsits` das `pdf_end_link`-Whatsit vor diesem Node ein, sodass das letzte Glyph aus der klickbaren Linkfläche herausfiel. Das trat bei `<NoBreak>` (und anderen eng gepackten Boxen) auf, deren Inhalt ohne nachfolgende Glue `hpack`t wird. In einem normalen Absatz sorgt der `parfillskip` hinter dem Text dafür, dass das letzte Glyph nicht der finale Node ist, weshalb der Fehler dort verborgen blieb. Das `pdf_end_link` wird in diesem Fall jetzt hinter dem Node eingefügt, analog zur bestehenden Endcolor-Behandlung.
- HarfBuzz-Font-Kerning wird auf NoBreak-Inhalt angewendet. ↗
  Die `keeptogether`-Strategie von `<NoBreak>` `hpack`te ihre Glyphenliste, ohne den HarfBuzz-Kern-Pass auszuführen, sodass das Font-Kerning verloren ging und die Box zu breit wurde; die Glyphen standen auf ihrer Standard-Vorschubbreite. Der Effekt war zwischen den letzten beiden Glyphen am deutlichsten und hing von der an HarfBuzz übergebenen Sprache ab. `node.kerning` gefolgt von `hbkern` läuft jetzt vor dem `hpack`, analog zu `finish_par`, sodass eine NoBreak-Box exakt wie ein normaler Absatz gekernt wird. Die drei NoBreak-Referenz-PDFs werden neu erzeugt.
- Sinnvolle Fehlermeldung statt Absturz, wenn das Wurzelelement zu keinem Record passt. ↗
  Wenn das Wurzelelement einer Datendatei nicht direkt zu einem `Record` passte und der neue XPath-Parser den Pattern-Matching-Fallback versuchte, rief er ein unqualifiziertes `find_matching_pattern` auf, das nil war; der Lauf brach mit `attempt to call a nil value` ab statt mit der vorgesehenen Meldung `Can't find “Record” command for the root node`. Der Aufruf ist jetzt als `M.dispatch.find_matching_pattern` qualifiziert, sodass der Fallback funktioniert und bei fehlender Übereinstimmung die hilfreiche Diagnose (mit Namespace und Elementname) erscheint.
- Boolesches viertes Argument von sd:merge-pagenumbers() wird beachtet. ↗
  Das vierte Argument von `sd:merge-pagenumbers()` aktiviert Hyperlinks auf den zusammengefassten Seitenzahlen. Es wurde mit `string_value` gelesen, sodass `false()` die Zeichenkette `"false"` ergab, die in Lua wahr ist und die Hyperlinks trotzdem einschaltete. Es wird jetzt mit `boolean_value` gelesen, sodass ein echtes boolesches `false` die Hyperlinks wie beabsichtigt deaktiviert.

### 5.7.1 (22.6.2026)

- False-Positive “Output loop detected in vsplit” behoben, das bei langen Dokumenten Inhalt verwarf. ↗
  Die Schleifenerkennung in `Output`/`Text` verglich nur Node-Referenzen (`prevobj1 == obj1`). LuaTeX verwendet freigegebenen Node-Speicher wieder, sodass die frisch gebaute Seiten-Box den Pointer einer bereits ausgegebenen Box erben und gleich erscheinen kann, obwohl echter vertikaler Fortschritt gemacht wurde. Bei einem Dokument, dessen einzelnes `<Output>` über mehr Seiten läuft als bis zur ersten Pointer-Kollision, brach die Ausgabe dadurch vorzeitig ab und verwarf den restlichen Inhalt stillschweigend. Die Erkennung verlangt jetzt zusätzlich, dass kein vertikaler Fortschritt gemacht wurde (das verbleibende Material nicht kleiner wird); echte Endlosschleifen (ein nicht umbrechbarer Block, der höher als die Fläche ist) lösen den Fehler weiterhin wie bisher aus. Fügt `qa/output/vsplitloop` als Regressionstest hinzu.
- Verschwindender expliziter Bindestrich neben einem Kerning-Paar behoben. ↗
  Wenn `lang.hyphenate` einen expliziten Bindestrich in eine automatische Trennstelle (Discretionary) umwandelt, liegt das Bindestrich-Glyph in deren `replace`-Liste. `hbkern` überschrieb die `replace`-Liste mit dem anstehenden Kern-Node (`d_setfield(head, "replace", kern)`), sodass der Bindestrich verloren ging und immer dann verschwand, wenn die Schrift das unmittelbar davorstehende Glyph kernte (z. B. bei `allowbreak=" "`). Der Kern wird jetzt der bestehenden `replace`-Liste vorangestellt, statt sie zu ersetzen. Fügt `qa/harfbuzz/hyphenkern` als Regressionstest hinzu.

### 5.7.0 (12.6.2026)

- luahbtex als Fallback-Backend-Binary akzeptiert. ↗
  Der `sp`-Launcher suchte bisher ausschließlich nach `sdluatex` (in `installdir/bin` und im `PATH`) und brach ab, wenn die Binary fehlte. Jetzt wird zusätzlich ein normales `luahbtex` als Fallback akzeptiert, sodass Installationen ohne das speedata-gepatchte LuaTeX (z. B. Distributions-Pakete) den Publisher trotzdem starten können. Die Konfigurationsoption `luatex` überschreibt nach wie vor beide. Die abschließende Fehlermeldung nennt jetzt beide Binary-Namen.

## 5.6

### 5.6.0 (3.6.2026)

- Veröffentliche Version 5.6.0.

## 5.5

### 5.5.25 (1.6.2026)

- Bilder in rotierten Td-Zellen rutschten nach oben aus der Zelle. ↗
  Das von LuaTeX vor einem Bild emittierte `cm` enthält in neuen Versionen keinen y-Shift von `-image_height` mehr; frühere LuaTeX-Versionen fügten ihn automatisch hinzu. Bei `<Td rotate="..."/>`, das um die obere Zellkante rotiert, wurde das Bild dadurch über dem Pivot gezeichnet und ragte nach oben aus der Zelle. Das Bild wird jetzt in ein save/restore eingewickelt, das es vorher um die Inhaltshöhe nach unten verschiebt, sodass die Rotation um die obere Bildkante pivotiert. Text in rotierten Zellen ist nicht betroffen, weil seine Position über eine absolute `Tm`-Matrix gesetzt wird, die den CTM-Shift überschreibt.
- Lateinische Glyphen werden bei bidi=“no” nicht mehr gespiegelt. ↗
  Bei `bidi="no"` in Kombination mit `direction="rtl"` wurde die Segmentrichtung auf rtl forciert und an HarfBuzz weitergereicht, das pflichtbewusst lateinische (oder andere LTR-Skript-)Glyphen spiegelte: Ein Lorem-Ipsum-Block las sich rückwärts. HarfBuzz bekommt für die Segmentrichtung jetzt `nil`, damit sie aus dem Skript abgeleitet wird; die absatzbezogene `maindirection` steuert weiterhin die Zeilenrichtung.
- Options/startpage wurde durch den Default überschrieben. ↗
  Der in einem 5.5.x-Cleanup eingeführte Default `1` für `publisher.options.startpage` sorgte dafür, dass ein nachgelagerter Codepfad `current_pagenumber` immer wieder auf `1` zurücksetzte und damit den vom `<Options startpage="..."/>`-Handler gerade gesetzten Wert überschrieb. Der Handler schreibt den eingelesenen Wert jetzt zusätzlich nach `publisher.options.startpage` zurück, sodass die nachgelagerte Prüfung die Wahl des Anwenders sieht.

### 5.5.24 (30.5.2026)

- Neue Option jardir, mit der Paket-Maintainer den Publisher auf systemweit installierte Java-JARs verweisen können. ↗
  Der Publisher liefert Saxon-HE, jing und xmlresolver als JAR-Dateien im `lib`-Verzeichnis mit. Maintainer von Betriebssystem-Paketen (Auslöser war der FreeBSD-Port `textproc/saxon-he`, #685) müssen gegen die systemweiten Kopien in `/usr/local/share/java/classes/` linken, statt eine private Zweitkopie auszuliefern. Eine neue Konfigurationsoption `jardir` (setzbar über `publisher.cfg` oder `--option jardir=...`) überschreibt das Suchverzeichnis für die JARs. Die Saxon-JAR wird jetzt per Glob `saxon-he-*.jar` gefunden statt über einen festen Dateinamen, sodass die System-Version nicht exakt mit der mitgelieferten Point-Release übereinstimmen muss.

### 5.5.23 (26.5.2026)

- matches()-XPath-Funktion lehnte mit dem neuen Parser ein drittes (Flag-)Argument ab. ↗
  Die XPath-2.0-Signatur `matches(input, pattern, flags)` war mit dem neuen XPath-Parser kaputt: Ein Aufruf mit drei Argumenten brach mit `function matches() requires 1 to 2 arguments, 3 supplied` ab (#692). Der publisher-seitige Wrapper in `layout_functions_lxpath.lua` überschrieb die lxpath-Default-Registrierung mit der falschen Min/Max-Argumentzahl (1/2 statt 2/3) und ignorierte das dritte Argument stillschweigend. Der Wrapper akzeptiert jetzt 2-3 Argumente und reicht die Flags (`i`, `m`, `s`) per Inline-Präfix `(?flags)` an Gos `regexp`-Engine weiter, analog zum Verhalten des Legacy-Parsers. Das `x`-Flag wird weiterhin nicht unterstützt und löst eine Warnung aus.
- Breite von HSpace in Tabellenzellen wird nicht mehr überschrieben. ↗
  `fix_justification` ersetzte die Breite von `subtype=0`-Glues durch die Wortzwischenraum-Breite der umgebenden Schrift, sobald die Zeile gestretcht wurde. Damit ging die explizite Breite von `<HSpace width="..."/>` in Tabellenzellen verloren, weil der linksbündige Zellabsatz fast immer durch `parfillskip` gestretcht wird. `HSpace`-Glues mit fester Breite werden jetzt mit einer Property markiert und in `fix_justification` übergangen.

### 5.5.22 (16.5.2026)

- page/line-Kontext aus Run-Abschluss-Logs entfernt. ↗
  Die Run-Abschluss-Zeilen `Start processing`, `Stop processing data`, `N errors occurred` und `Duration: ...` liefen durch `main.log`, das automatisch die aktuelle `page`, `line_layout` und `line_data` als strukturierte Felder anhängt. Bei Warnungen/Fehlern während des Laufs sind diese Felder sinnvoll, bei einer Run-Zusammenfassungszeile aber nur die zufällige Position, an der der Publisher gestoppt ist; das ist irreführend, wenn die Ausgabe mehrerer Läufe aggregiert wird. Die vier Zeilen rufen jetzt direkt `splib.log` auf, sodass die Protokoll-Einträge schlank sind (`<entry level="info" msg="0 errors occurred"/>`).
- CJK-Shaping-Crash behoben: publisher.prohibited_at_end war nil. ↗
  Der Satz von CJK-Text (Chinesisch, Japanisch) brach mit `attempt to index a nil value (field 'prohibited_at_end')` in `nodes.lua:1453` ab. Die Tabellen `prohibited_at_end` und `prohibited_at_beginning` in `spinit.lua` wurden als nackte globale Variablen definiert, in `nodes.lua` aber als `publisher.prohibited_at_end` angesprochen. Das funktionierte, bis der `_G.publisher`-Table mit `__index = _G` entfernt wurde; seither lief der Zugriff ins Leere. Die Tabellen hängen jetzt korrekt am publisher-Namespace. Ein kleiner Regressionstest unter `qa/harfbuzz/cjk/` deckt den CJK-Codepfad ab.

### 5.5.21 (13.5.2026)

- Crash in ForAll bei leerer Auswahl mit dem neuen XPath-Parser behoben. ↗
  Wenn der neue XPath-Parser für einen `select`-Ausdruck ohne Treffer nil lieferte (z. B. `<ForAll select="foo/bar/*"/>`, wenn `foo/bar` keine Kinder hat), brach ForAll mit einem Fehler auf `#selection` ab. Der Legacy-Parser-Zweig hatte diese Absicherung bereits; der Newxpath-Zweig zieht jetzt nach, sodass eine leere Sequenz wieder ein stilles No-Op ist (#691).
- cgo-Brücke XML-zu-Lua robuster: binärsichere Strings und typisierte Key/Value-Helfer. ↗ ↗
  Zwei zusammengehörige Änderungen in `splib`. (1) `pushString` nutzt jetzt `lua_pushlstring` mit expliziter Länge, sodass eingebettete NUL-Bytes erhalten bleiben; `lua_pushstring` hätte am ersten `\0` stillschweigend abgeschnitten, was XML-CDATA oder binäre Attributwerte beschädigen konnte. Der C-seitige malloc/free-Umweg über `C.CString` entfällt: Lua kopiert die Bytes intern, der Go-String kann direkt übergeben werden. (2) Der `any`-typisierte Helfer `addKeyValueToTable`, der seine Argumente in Interfaces boxte und bei unerwartetem Typ `panic` warf, wird durch drei typisierte Helfer ersetzt (`addStringValueToTable`, `addIntValueToTable`, `addBoolValueToTable`); alle Aufrufstellen in Streaming-Parser, Tree-Renderer und CSS-zu-Lua-Renderer wählen die passende Variante statisch. Kein für Anwender sichtbares Verhalten geändert.

### 5.5.20 (13.5.2026)

- splib: lua_checkstack vor jedem Push der XML-Daten nach Lua aufrufen. ↗
  Die Streaming-Brücke XML-zu-Lua (für Layout- und Datendateien, inkl. `xi:include`-Auflösung) und der rekursive Tree-Renderer pushten Werte auf den Lua-Stack, ohne je `lua_checkstack` aufzurufen. Lua garantiert nur `LUA_MINSTACK` (20) freie Slots; jeder weitere Push ohne explizite Reservierung ist undefiniertes Verhalten. Bei tief verschachtelten oder großen Dokumenten konnte sich das als nicht-deterministische `STATUS_HEAP_CORRUPTION`- / `STATUS_BAD_STACK`-Crashes unter Windows äußern (Issue #691). Die Brücke reserviert jetzt vor der Document-Tabelle und in jeder Token-Iteration ausreichend Stack-Platz; der Tree-Renderer reserviert Platz in `RenderToLua`, in `pushElement` und um jeden Kind-Push.

### 5.5.19 (11.5.2026)

- Falsche Position von Tablerules in gestretchten vboxes bei tablerulefix=yes behoben. ↗
  `tablerulefix="yes"` sammelt Linien-Whatsits beim Page-Shipout und gibt sie an absoluten `(curx, cury)`-Positionen wieder aus. Beim Cursor-Update für Glue-Knoten wurde nur die natürliche Breite verwendet, die effektive Breite nach Stretch/Shrink der umgebenden Box wurde ignoriert. Dadurch landeten Linien, die in einer vlist hinter gestretchter Glue standen, zu hoch. Die effektive Glue-Breite wird jetzt aus `glue_sign`, `glue_set` und `glue_order` des Parent-Boxes berechnet, bevor der Cursor weiterläuft.
- lxpath: $a*$b wurde fälschlich als Wildcard-QName geparst. ↗
  Der QName-Scanner von lxpath akzeptierte `*` als reguläres Namenszeichen, sodass Ausdrücke wie `$a*$b` als einzelner QName verschluckt statt als Multiplikation geparst wurden. `*` wird jetzt nur noch am Anfang eines QName oder direkt nach dem Namespace-Doppelpunkt akzeptiert, wo es als legitime Wildcard steht.
- Crashes im Legacy-XPath-Parser bei fehlenden Attributen/Elementen/Variablen behoben. ↗
  Issue #691 meldete zwei Crashes im Legacy-XPath-Parser bei Ausdrücken auf ungebundene Werte: Arithmetik mit nil in `eval_addition` (über SetVariable/select) und ein Vergleich mit nil in `eval_comparison` (über Switch/Case). `get_argument_number` behandelt jetzt den nilmarker-Sentinel wie ein echtes nil, sodass der bestehende „Evaluating to 0"-Fallback greift, und `tex.sp` wird in `pcall` gewickelt, um bei von LuaTeX abgelehnten Eingaben auf 0 zurückzufallen. `eval_comparison` hat einen zusätzlichen Guard nach tonumber, der die nilmarker-Konvention spiegelt: nil verglichen mit irgendetwas ist false, außer `!=` ist true. lxpath bleibt der empfohlene Parser; dies repariert nur den Legacy-Fallback.

### 5.5.18 (9.5.2026)

- Lua-Stack-Overflow und massiven Slowdown durch Origin-Referenzen auf Tr/Tablehead/Tablefoot behoben. ↗
  `Tr`, `Tablehead` und `Tablefoot` legten ihre `layoutxml` und `dataxml` seit 5.5.10 (Commit `ea433dc7`, für das neue `eval-on-split`) direkt auf der Zeilen-Wert-Tabelle ab. Wenn ein `SetVariable` eine Variable überschrieb, die eine solche Struktur enthielt, lief `flush_table` rekursiv durch den gesamten Layout- und Daten-XML-Baum. Bei tief geschachtelten Daten überlief der Lua-Stack, bei flacheren Daten brach die Performance dramatisch ein (120s → 1000s in einem Bericht). Die Referenzen werden jetzt in einer schwach referenzierten Origin-Map gehalten, sodass die Wert-Tabellen sauber bleiben und `flush_table` sie nicht mehr verfolgt (#690).

### 5.5.17 (7.5.2026)

- Crash bei sp –help / –version und bei frühen Startup-Fehlern behoben. ↗
  `sp --help` und `sp --version` liefen mit einem Nil-Pointer-Crash auf einen Absturz, weil der Help-Pfad `exitProgram` aufrief, bevor die Konfiguration geladen wurde; `exitProgram` ruft seinerseits `showDuration` auf, das eine Option aus der noch nicht initialisierten Konfiguration liest. Derselbe Crash konnte die eigentliche Fehlermeldung bei frühen Startup-Fehlern verschlucken (z. B. wenn unter Windows die mitgelieferte `sdluatex`-Binary nicht ausführbar ist). Der Help-Pfad beendet jetzt direkt, und `ConfigData.String` ist gegen einen Nil-Receiver abgesichert (#689).

### 5.5.16 (5.5.2026)

- Platzhalterbilder über placeholder://-URL. ↗
  Mit `file="placeholder://WxH"` auf `Image` wird zur Laufzeit ein graues Rechteck mit Diagonalkreuz in der natürlichen Größe W × H bp erzeugt; das ist praktisch für die Layoutentwicklung, wenn die finalen Bilder noch nicht vorliegen. Skalierung und Seitenverhältnis funktionieren wie bei einer regulären Bilddatei.
- Absolute Positionierung von Objekten in Gruppen behoben. ↗
  PlaceObject mit absoluten `column`/`row`-Angaben innerhalb einer `Group` landete immer in der oberen linken Ecke der Gruppe statt an den angegebenen Koordinaten. Im Gruppen-Pfad wurden die falschen Felder aus der Parameter-Tabelle gelesen.
- background-text in Tabellenzellen wieder funktionsfähig. ↗
  background-text an einem `Td` brach den Lauf seit dem Lua-Modularisierungs-Refactor in 5.5.x mit einem Lua-Fehler ab. Drei Bugs sind behoben: eine falsche Aufrufsignatur für mknodelist, ein fälschliches %d für einen Float-Wert im Format-String und die Geometrie des Wasserzeichens (die rotierte Bounding-Box ist asymmetrisch um den Drehpunkt, Descender bei Glyphen wie ( ) g y wurden ignoriert). Bestehende Wasserzeichen können leicht versetzt erscheinen, weil sie jetzt korrekt zentriert werden.

### 5.5.15 (4.5.2026)

- Falsche Schrift in langen Dokumenten mit Schriftwechsel behoben. ↗ ↗
  In Dokumenten, die innerhalb eines Absatzes die Schrift wechseln (etwa einem nicht-lateinischen Fließtext mit lateinischen Vers- oder Fußnotenzahlen), konnte Text in späteren `Output`-Blöcken nach einem Spalten- oder Seitenumbruch in der falschen Schrift gesetzt werden, sodass Zeichen ersetzt wurden oder ganz von der Seite verschwanden. Eine interne Schrift-Status-Variable lief zwischen unbeteiligten Teilen des Layouts aus; beide Stellen, an denen das auftrat, sind jetzt korrekt gekapselt.

### 5.5.14 (3.5.2026)

- Crash und übermäßige Warnungen beim Satz komplexer Schriftsysteme behoben. ↗
  Indexierungs-Crash in `hbglyphlist` vermieden, wenn ein backgemappter Codepoint nicht in der characters-Tabelle der Schrift vorhanden ist (z.B. ausgelöst durch Khmer-Subscript-Konsonantenstapel). HarfBuzz-Sentinel-Glyphen (Codepoint `0xFFFF` mit `x_advance=0`), die beim komplexen Reordering entstehen, werden übersprungen. „Glyph is missing from the font"-Warnungen werden dedupliziert: Jede `(Font, Codepoint)`-Kombination wird nur beim ersten Auftreten gemeldet, am Laufende folgt eine Zusammenfassung mit der Häufigkeit.
- sp-filter-Skripte laufen jetzt auf Lua 5.4. ↗
  Die Lua-VM für `sp filter`-Skripte wurde von yuin/gopher-lua (Lua 5.1) auf speedata/go-lua (Lua 5.4) umgestellt, näher am LuaTeX-Stack und mit konsolidiertem Lua-Tooling. Enthält ein neues, hauseigenes `luahttp`-Modul als Ersatz für cjoudrey/gluahttp.

### 5.5.13 (27.4.2026)

- Publishing API v1. ↗
  Neue Server-API Version 1 mit verbesserten Endpunkten für Publishing-Läufe, Statusabfragen und PDF-Abruf.
- Fortschritt anzeigen mit sp –progress. ↗
  Neue Kommandozeilenoption `--progress`, die den Satzfortschritt während eines Publishing-Laufs anzeigt.

### 5.5.12 (27.4.2026)

- Aktualisiere auf LuaTeX Version 1.24.0.
- Unterstützung für variable Schriftarten. ↗
  Variable Fonts laden und Designachsen (Gewicht, Breite, optische Größe usw.) per Harfbuzz-Subsetting auf feste Werte setzen. Neue Attribute `weight` und `width` sowie das Kind-Element `Axis` bei `LoadFontfile`.
- Speicherverbrauch bei großen Daten-XML-Dateien um ca. 50% reduziert. ↗
  Der Streaming-SAX-Parser erzeugt Lua-Tabellen direkt ohne Go-Zwischenbaum, lässt im Datenmodus ungenutzte Metadaten-Felder weg, behandelt ignoreeol bereits beim Parsen und nutzt korrekte createTable-Größenhinweise, um wiederholte Hash-Tabellen-Resizes zu vermeiden.
- XPath 3.1 Arrays, Maps, Lookup-Operator und String-Verkettung. ↗
  Arrays (`[1,2,3]`, `array { 1 to 3 }`), Maps (`map { 'key': value }`), der Lookup-Operator (`?`) und der `||`-Operator zur String-Verkettung wurden in XPath hinzugefügt. Enthält `array:`- und `map:`-Funktionsbibliotheken (size, get, put, append, keys, contains, merge, usw.).

### 5.5.11 (23.4.2026)

- fn:serialize() in XPath implementiert. ↗
  Die XPath-Funktion `fn:serialize()` wandelt ein Node-Set in seine XML-Stringdarstellung um.
- HTML/CSS-Verarbeitung von Inline-Styles korrigiert. ↗ ↗
  Fehlerhaftes Quoting von HTML-Attributen bei der Rekonstruktion behoben (Luas `%q` erzeugte Backslashes vor Zeilenumbrüchen) und Elementerkennung in `Copy-of` und `SetVariable` korrigiert.

### 5.5.10 (22.4.2026)

- colspan="*" in Tabellenzellen erlauben. ↗
  Mit `colspan="*"` auf einem Td-Element werden automatisch alle verbleibenden Spalten ab der aktuellen Position überdeckt, ohne die Spaltenanzahl fest angeben zu müssen.
- Entferne Erzeugung der Debian-Pakete. ↗
  Es ist zu viel Arbeit, die Debian-Pakete aktuell zu halten.
- Abstand bei Listenmarkern per CSS einstellbar. ↗
  Der Abstand zwischen Listenmarker und Text ist nun per li::marker { padding-right: … } in CSS konfigurierbar. Der Standardwert bleibt 5pt.
- Alternierende Zeilenfarben starten auf jeder Seite neu. ↗
  Hintergrundfarben in Tabellenzellen werden nun erst nach dem Seitenumbruch gesetzt. Das neue Tabellen-Attribut eval-on-split ermöglicht es, alternierende Zeilenfarben auf jeder neuen Seite korrekt neu zu beginnen.
- Haarlinien-Artefakte zwischen Tabellenzellen behoben. ↗
  Wenn alle Zellen einer Zeile dieselbe Hintergrundfarbe haben, wird der Hintergrund nun als einzelnes Rechteck gezeichnet. Das beseitigt Haarlinien-Artefakte zwischen benachbarten Zellen in einigen PDF-Betrachtern.
- Leere Zeilen zwischen HTML-Blockelementen behoben. ↗
  Leerraum zwischen HTML-Blockelementen (z.B. zwischen zwei Absätzen) wird nicht mehr als leere Zeile dargestellt.
- Leerzeichendarstellung in einigen Schriften korrigiert. ↗
  Die Font-Backmap bevorzugt jetzt druckbare Zeichen, wenn mehrere Codepoints dieselbe Glyph-ID haben. Das korrigiert fehlerhafte Leerzeichendarstellung in einigen Schriften wie HelveticaNeue-Bold.
- Bessere Fehlerbehandlung bei undefinierten Farben. ↗
  Das Layout zeigt nun eine Warnung statt mit einem Lua-Fehler abzubrechen, wenn Probleme wie undefinierte Farben auftreten.
- Sicherheit: Go-Abhängigkeiten aktualisiert. ↗
  Aktualisierung von golang.org/x/net und golang.org/x/image zur Behebung von CVEs (XSS, HTTP-Proxy-Bypass, OOM durch manipuliertes TIFF).
- Windows-DLL-Crash beim Aufräumen behoben. ↗
  Umgehung eines Go-Runtime-Problems, bei dem das Aufräumen der DLL unter Windows eine Zugriffsverletzung (0xc0000005) verursachte, obwohl die PDF-Erzeugung erfolgreich war.

### 5.5.9 (20.4.2026)

- Dokumentation: Umstellung auf Hugo, Struktur neu organisiert.
- Erlaube Textblock in Td für bessere Kontrolle bei Rotation.
- Unterstützung für CSS ::marker.
  Das CSS-Pseudoelement ::marker wird nun für die Listengestaltung unterstützt, einschließlich eigener Inhalte und Farben.
- Bilder werden bei trace objects=“yes” gezeichnet.
- Fehlerkorrektur HTML Rahmen Breitenberechnung.

### 5.5.8 (14.4.2026)

- Berücksichtige Box-Höhe in Zeilen (Zeilenhöhe).
- Box-Rahmen.
- Vertikale Ausrichtung für Box im Absatzmodus.
- Bilder: vertikale Ausrichtung im Absatz.
- Action-Befehl entfernt.
- Suppressinfo für Metadaten.
- Prüfsummenunterschied in sp compare anzeigen.
- Neues Attribut match bei Record.

### 5.5.7 (2.4.2026)

- Fehlerkorrektur Tabellenstauch-Algorithmus.

### 5.5.6 (2.4.2026)

- Fehlerkorrektur PDF copy/paste hyphen minus.

### 5.5.5 (1.4.2026)

- Korrigiere minimale Breite in Tabellen mit colspan und rowspan.
- Korrigiere CSS Vererbung bei td/tr.

### 5.5.4 (1.4.2026)

- HTML-Tabellen: beachte rowspan und colspan. Verhindere rowspan am Ende der Seite.

### 5.5.3 (9.3.2026)

- Servermodus: Endpunkt zum Abrufen der publisher-protocol.xml hinzugefügt.

### 5.5.2 (6.3.2026)

- Viele Rechtschreibkorrekturen in der Dokumentation.
- Barrierefreiheit für Output/Text (#614).
- PDF/UA Strukturbaum.
- Korrektur PDF/UA und InsertPages / SavePages (#613).
- Suchpfad hinzufügen, Dateien nicht duplizieren.
- Bessere Fehlermeldungen für Funktionsaufrufe und alten XPath-Parser.
- Fehlerkorrektur letter-spacing und Silbentrennung.
- Filter: Klassenpfad für Saxon korrekt setzen, einschließlich aller benötigten JAR-Dateien.

### 5.5.1 (2.3.2026)

- Fehlerkorrektur für Bildeinbindung (Transparenz), Attribut Kontext und Creator Version.

### 5.5.0 (26.2.2026)

- Fehlerkorrektur letter-spacing in Tabellen.

## 5.4

### 5.4.3 (4.3.2026)

- Fehlerkorrektur letter-spacing und Silbentrennung.
- Bessere Fehlermeldungen für Funktionsaufrufe und alten XPath-Parser.
- Filter: Klassenpfad für Saxon korrekt setzen, einschließlich aller benötigten JAR-Dateien.

### 5.4.2 (27.2.2026)

- Fehlerkorrektur Attribut Kontext.
- Fehlerkorrektur Bildeinbindung (Transparenz).
- Fehlerkorrektur Creator/Producer Version in PDF-Metadaten.

### 5.4.1 (26.2.2026)

- Fehlerkorrektur letter-spacing in Tabellen.

### 5.4.0 (24.2.2026)

- Veröffentliche stabile Version 5.4.

## 5.3

### 5.3.24 (23.2.2026)

- Neuer Befehl Section, um Layoutdateien zu organisieren (ohne Auswirkung auf Formatierung).

### 5.3.23 (19.2.2026)

- Fehlerkorrektur: ForAll behält Kontext.

### 5.3.22 (18.2.2026)

- Massive Geschwindigkeitsverbesserungen.
- Optischer Randausgleich Wert ist 1/1000 em.

### 5.3.21 (5.2.2026)

- Fehlerkorrektur: Silbentrennung funktioniert jetzt korrekt mit letter-spacing.

### 5.3.20 (29.1.2026)

- Fehlerkorrektur: Berechnung der verbleibenden Höhe in PlaceObject / absolute Positionierung.

### 5.3.19 (29.1.2026)

- Korrigiere Programmabbruch bei sp –help / –version.

### 5.3.18 (26.1.2026)

- Füge letter-spacing Attribut zu DefineTextformat hinzu (in 1/1000 em).
- Korrigiere Endlosschleife in post_linebreak.

### 5.3.17 (23.1.2026)

- Korrigiere Endlosschleife in HTML-Tabellen.
- Verbessere das Beenden von Kindprozessen in sp.

### 5.3.16 (20.1.2026)

- HTML-Tabellen mit nur Header oder Footer (leerer Body) werden jetzt korrekt ausgegeben.

### 5.3.15 (19.1.2026)

- Fehlerkorrektur für leere HTML-Tabellen.
- Implementiere Until für den neuen XPath-Parser.
- HTML-Verbesserungen (einschließlich Dokumentation).

### 5.3.14 (15.1.2026)

- HTML kann nun auf mehrere Seiten umbrechen.

### 5.3.13 (14.1.2026)

- Löse Endlosschleife in HTML-Tabellen.

### 5.3.12 (5.12.2025)

- Füge globale html-Option im Options-Befehl und –option html=off Kommandozeilen-Flag hinzu, um HTML-Parsing zu steuern.

### 5.3.11 (4.12.2025)

- Beschleunigt den Schriftsatz mit frühen Abbrüchen, gecachten Zugriffen und schlankerer Attributbehandlung in mknodes.
- Modularisiert publisher.lua in die Module color, links und metadata, um die Datei zu verkleinern.
- Aktualisiert qrencode auf die aktuelle Upstream-Version.

### 5.3.10 (30.11.2025)

- Behebt Verlangsamung im CSS/HTML-Rendering.

### 5.3.9 (25.11.2025)

- Ermögliche Textformaten, für HTML-Inhalte die in CSS definierte Schriftgröße zu verwenden.
- Korrigiere die Verarbeitung relativer (em) Schriftgrößen auf Basis der aktuellen Schriftgröße.
- Korrigiere die Darstellung von HTML-Rahmen im normalen Absatzmodus.
- Aktualisiere auf die neuste Saxon HE Version.
- Lösche Rust Quellcode.

### 5.3.8 (21.11.2025)

- Korrigiere HTML Border und currentcolor in Tabellenlinien.

### 5.3.7 (19.11.2025)

- HTML Border überarbeitet.
- Styles in HTML-Tabellen.

### 5.3.6 (11.11.2025)

- Fehlerkorrektur: UL-Zähler zurücksetzen.

### 5.3.5 (10.11.2025)

- Korrigiere @font-face in CSS (fataler Absturz).

### 5.3.4 (10.11.2025)

- HTML: Unterstützung für weitere Nummerierungsarten in Listen hinzugefügt (lower-alpha, upper-alpha usw.).
- Setze Exit-Code ungleich Null, wenn Fehler aufgetreten sind.
- Compare-Tool: Überarbeitung für mehr Stabilität und verbesserten HTML-Report (Prüfsummen, Build-Fehler, Vorschaubilder, Sortierung).
- HTML-zu-Lua-Rendering-Pipeline überarbeitet für strukturierte Ausgabe und klarere Trennung von CSS-Berechnung.

### 5.3.3 (4.11.2025)

- Führe alte Syntax mit geschweiften Klammern wieder ein bei Value/select und dem alten XPath parser (#680) .
- Entferne die Rust-Bibliothek aus dem Build-Prozess (#678).

### 5.3.2 (1.11.2025)

- Korrigiere Einrückung nach einem br.

### 5.3.1 (21.10.2025)

- Korrigiere Windows/Rust laden.

### 5.3.0 (21.10.2025)

- Alternative Rust-Bibliothek für dynamische Bindung.

## 5.2

### 5.2.0 (14.10.2025)

- Veröffentliche Version 5.2.

## 5.1

### 5.1.29 (14.10.2025)

- Go-XML-Parser tlw. neu geschrieben.

### 5.1.28 (5.10.2025)

- Korrigiere PDF-Metadaten / ISO-Datumsformat.

### 5.1.27 (4.10.2025)

- Fehlerkorrektur: XPath-Funktion doc() gibt den Wurzelknoten zurück statt des Dokumentknotens.

### 5.1.26 (23.9.2025)

- Neue XPath-Funktion translate().
- Dokumentation: Verwendung von px (Pixel) präzisiert.
- tabular.lua in ein Modul umgewandelt (interne Änderung).
- Absicherung für fehlenden Dateinamen in AttachFile.
- Neue XPath-Funktion distinct-values().

### 5.1.25 (15.9.2025)

- Publisher führt mehrere Läufe nun auch bei Fehlern aus.
- Unterstützung für japanischen Schriftsatz.
- Fehlerbehebung beim Fallback mit mehrzeichigen Sequenzen.

### 5.1.24 (15.9.2025)

- Warnung bei leerem Hyperlink.
- Verbesserte Fehlermeldung bei leerer Gruppe/Trace.
- Verbesserte Fehlermeldungen bei doppelten Dateien und Fehlern beim Schreiben der Aux-Datei.
- XPath: Neu: format-number() und round-half-to-even().
- Neuer Attributtyp „rawstring“ ohne {}-Maskierung.

### 5.1.23 (10.9.2025)

- Optionaler resizehandler für DPI-Einstellung (Konfigurationsdatei).
- CSS font-family darf nun mehrere Einträge haben.

### 5.1.22 (25.8.2025)

- Mehr HTML/CSS Features (Pseudoklassen, Padding in Tabellen und Rahmen).

### 5.1.21 (23.8.2025)

- NoBreak mit Hintergrundfarbe.
- NoBreak in Tabellenzellen (#670).
- Fehlerkorrektur Bildkonvertierung mit gleichem Dateinamen und unterschiedlicher Dateiendung.
- Erweitere grundlegende HTML Eigenschaften (Eigene Schriftarten, Rahmen, rem-Größen).

### 5.1.20 (19.8.2025)

- Setze trapped auf false im PDF für Preflight.
- Schutzmaßnahmen gegen Go/Lua Thread-Fehler.

### 5.1.19 (18.8.2025)

- Erlaube Absatzform in Gruppen.
- Fehlerkorrektur: Datei löscht sich selbst beim kopieren (#668).
- PDF Producer Eintrag in Metadaten.

### 5.1.18 (1.8.2025)

- Fehlerkorrektur: PlaceObject/rotate und vreference.

### 5.1.17 (30.7.2025)

- Fehlerkorrektur lxpath Modus und neuer XPath Parser.
- HTML Modus neu implementiert.
- Log-Level im Server-Modus.

### 5.1.16 (15.7.2025)

- Korrigiere sd:format-number (#664).

### 5.1.15 (14.7.2025)

- Korrekte XML-Kodierung von Metadaten bei ZUGFeRD Anhängen.

### 5.1.14 (10.7.2025)

- Fehlerkorrektur HTML und großgeschriebene Tags.

### 5.1.13 (3.7.2025)

- Ignoriere DEL (Dezimal 127) Zeichen in der Eingabe (#663).

### 5.1.12 (25.6.2025)

- Korrigiere (XPath)-Boolean-Wert von Attributen.

### 5.1.11 (18.6.2025)

- Kein fataler Fehler wenn ein Http-Bild fehlt.

### 5.1.10 (6.6.2025)

- Bessere Log-Meldungen.
- Neue XPath-Funktion sd:symbol() um eine Glyph-ID einzugeben.
- Lösche alte XPath-Dokumentation.

### 5.1.9 (23.5.2025)

- Neue Option ‘addlocalpath’ in der Konfigurationsdatei, damit das Arbeitsverzeichnis nicht rekursiv durchsucht wird.
- Neue Option mpcolorwarning um die Farb-Warnungen von MetaPost zu zeigen (Voreinstellung ist ’true’) .

### 5.1.8 (22.5.2025)

- Fehlerkorrektur Layoutfunktion sd:current-framenumber() und neuer XPath parser.

### 5.1.7 (18.5.2025)

- cache=none funktioniert auch bei SVG Konvertierung (#622).

### 5.1.6 (15.5.2025)

- Neuer Befehl `sp checkversion`, um auf Aktualisierungen zu prüfen (#660).

### 5.1.5 (5.5.2025)

- Aktualisiere auf neue LuaTeX binaries (1.22.0).
- Ändere Systemfonts-Verzeichnissuche für Windows.

### 5.1.4 (5.5.2025)

- Fehlerkorrektur: Tabellenumbruch in AtPageShipout (#659).
- Absolute Positionierung innerhalb einer Gruppe.

### 5.1.3 (7.4.2025)

- Korrigiere Leerzeichen im imagehandler.

### 5.1.2 (7.4.2025)

- Ändere die Breite und Höhe für vertikale Linien. Sollte keine Auswirkungen auf das Erscheinungsbild haben.

### 5.1.1 (7.4.2025)

- Lua Präprozessor: runtime.execute liefert den Erfolg bzw. den Exit-Code zurück.

### 5.1.0 (4.4.2025)

- Setze Hintergrundfarbe für jede Seite.

## 5.0

### 5.0.2 (4.4.2025)

- Fehlerkorrektur: Dateiname image hander bei automatischer Umwandlung.

### 5.0.1 (1.4.2025)

- Fehlerkorrektur: Rundungsfehler in manchen Rasterkonfigurationen.

### 5.0.0 (11.3.2025)

- Veröffentliche Version 5.0.

#### Inhalt