PDF: Font-Fallback für Emoji und Sonderzeichen - 2070 Missing-character-Faelle behoben

This commit is contained in:
dschlueter 2026-09-09 19:10:50 +02:00
commit abc7a5693f
8 changed files with 198 additions and 1 deletions

View file

@ -2592,6 +2592,45 @@ eine **doppelte Nummer** — „Abbildung 21: Abb. 7.2: …". Die erste vergibt
`nummeriere_marken()`. Das betrifft alle 48 Abbildungen und besteht seit Langem; behoben wäre
es dadurch, dass die LaTeX-Nummerierung der Gleitumgebung unterdrückt wird.
### Sonderzeichen in der PDF-Fassung — ein stiller Font-Fehler behoben ✅
In der gesamten PDF-Fassung fehlten alle Zeichen, die Times New Roman nicht mitbringt: die
Lernelemente-Symbole (⭐ ✏ ❓ 🎯 🚀 …), aber auch die Sub-/Superskripte (₀ ₁ ₂ ₜ ₙ ⁶ ᵀ) und die
langen Pfeile (⟹ ⟶ ⟵ ⇒). Das alte LaTeX-Protokoll enthielt **rund 2 070**
`Missing character`-Meldungen; die Zeichen fielen stillschweigend aus dem Druckbild.
Zwei Ursachen, beide lange unentdeckt, weil die Website die Zeichen korrekt zeigt
(der Browser weicht selbst auf eine Emoji-Schrift aus):
* xelatex hat keine automatische Font-Fallback-Kette — fehlt einem Zeichen der Glyph, wird
es weggelassen, ohne dass der Bau fehlschlägt.
* Die pandoc-Variable `emoji-font: "Noto Color Emoji"` wertet der LaTeX-Writer
(pandoc 3.1.3) **nicht aus** — sie hat seit ihrer Einführung still nichts getan.
**Die Lösung ist zweistufig**, weil die Zeichen auf zwei Wegen in den PDF gelangen:
1. **`pandoc/emoji_fallback.lua`** (neu) — ein pandoc-Filter, der die betreffenden Zeichen
im Fließtext in `{\texorpdfstring{\symfont{…}}{…}}` einschüttet. `\symfont` ist
**Symbola** — die einzige Schrift auf dem Bausystem, die das komplette Set abdeckt
(Noto Color Emoji funktioniert unter XeTeX nicht: die Zeichen landen im `nullfont`);
monochrom, für den Drucksatz ohnehin passend. Der `\texorpdfstring`-Antil hält die
PDF-Lesezeichen ruhig und erhalten. Variationsselektoren (U+FE0F) werden entfernt.
Zwei pandoc-3.1.3-Eigenheiten unterwegs gefunden: Filterhandler funktionieren **nur als
globale Funktionen** — ein vom Filter zurückgegebenes Table wird stillschweigend
ignoriert; und der Einschub muss `RawInline` sein, als `Str` würde pandoc die
Backslashes escapen.
2. **`ucharclasses`** in `pandoc/header-includes.tex` — für den **Diagrammtext**: Das Paket
`svg` exportiert die SVG-Texte (x₁, σᵀ, ∈ in Achsen- und Knotenbeschriftungen) als
LaTeX-Text, dorthin reicht der AST-Filter nicht. Die Zurück-Umschaltung ist bewusst
`\fontfamily{\familydefault}\selectfont` statt `\normalfont``\normalfont` würde den
Fettdruck hinter dem Stern einer Aufgabentitel-Zeile zerstören (gemessen mit
pdfminer: „Titel“ bleibt Bold).
Die tote `emoji-font`-Variable ist aus `pandoc-defaults-basis.yaml` entfernt (mit
Begründung), und `baue_pdf()` zählt die `Missing character`-Meldungen im Protokoll:
Der neue Lauf meldet **null fehlende Zeichen**; taucht die Warnung wieder auf, kennt Times
New Roman ein Zeichen, das der Filter noch nicht umschaltet. Symbola ist damit eingebettet,
der Buchumfang bleibt bei 792 Seiten; alle HTML-Seiten sind byteidentisch geblieben.
---
## 8. Commit-Historie des V04-Strangs