- README knapp: Zweck, Schnellstart, Stand, Abschnitt "Documentation", Lizenz - FUNKTIONSWEISE.md neu: Aufbau, Datenfluss (Mermaid), Entscheidungsregel, Normalform, elastischer Bildvergleich, Quellen, Sicherheit, Messungen, Designentscheidungen, Grenzen - BEDIENUNGSANLEITUNG gegliedert: Installation, Modellserver, Benutzung, Konfiguration (Umgebungsvariablen, workspace.json), Betrieb, Werkzeuge, Fehlersuche mit echten Meldungen und Rückgabecodes - CHANGELOG im Format Keep a Changelog mit "Beim Update zu tun" - LICENSE (MIT) - cli.py: Hilfetexte beschreiben die Regel p2t und z-ai/glm-4.6v statt des Pixelvergleichs und gemini-2.5-flash - requirements.txt: requests ergänzt Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
8.8 KiB
Änderungsprotokoll
Alle nennenswerten Änderungen an formula_img2latex. Format nach Keep a Changelog, Versionen nach Semantic Versioning (vor 1.0: Nebenversion = möglicher Bruch). Messergebnisse im Einzelnen: FUNKTIONSWEISE.md, Messungen.
[Unreleased]
Alle Formeln eines PDF-Buchs, auch im Fließtext, und etwa dreimal schneller.
Neu
- Formeln im Fließtext über
pdf2md --formulas(Nachbarprojekt): Die Formelerkennung von pix2text (MFD) findet jede Formel auf der Seite, auch in Merkkästen; pdf2md schneidet sie zeichengenau aus (300 dpi) und vermerkt Seite, Rechteck und PDF-Text informulas-*.json. formula_img2latex liest die Liste (sources/pdf2md.listed). Corral, Stichprobe 10 % von 9239 Formeln: 79 % automatisch (im Text 83 %). - Ein Satzzeichen am Ende einer Formel im Text wird vor dem Vergleich abgetrennt und als Text hinter die
Formel gesetzt (
final_suffix). - Normalform:
\underset{…}{\lim}=\lim_{…}, Gleichungsnummer am Ende =\tag,\textbfals Fettdruck,\cfrac=\frac, wörtliches\naus Modellantworten entfällt. - Schalter
pdftext(aus): Die PDF-Textebene einer flachen Formel darf pix2text bestätigen. LICENSE(MIT) undFUNKTIONSWEISE.md(Aufbau, Datenfluss, Designentscheidungen, Grenzen).
Geändert
- Tempo (Pilot 869 Formeln: 70 → ~24 Minuten): Markdown-Verweise und Ausschnitte nur einmal lesen
(
crops/); pix2text gebündelt nach Pixelbudget auf der freiesten GPU, einmal geladen; Lesen und Prüfen überlappen, die Prüfprozesse starten perforkserver; Qwen mit 8 parallelen Anfragen; pdflatex beim Entscheiden nur, wenn gleiche Bilder möglich sind; kein neuer Scan beim Fortsetzen; je Paket nur dessen Datensätze laden; Zeiten je Stufe in der Statuszeile. - Bildprüfung: Originale höchstens 1600 px breit, über 2,5 MP nicht verglichen, Lesarten mit mehr als 2,5-fach falschen Proportionen sofort abgelehnt (einzelne Formeln hielten den Lauf über 10 Minuten auf).
- Dokumentation nach dem Projektstandard gegliedert: README knapp mit Abschnitt „Documentation“,
Bedienungsanleitung mit Konfiguration, Betrieb und Fehlersuche, Hintergrund und Messungen in
FUNKTIONSWEISE.md. - Hilfetexte der Kommandozeile beschreiben die Regel
p2tstatt des Pixelvergleichs; Cloud-Standardz-ai/glm-4.6vstattgoogle/gemini-2.5-flash.
Behoben
requirements.txtenthältrequests(von den Modell-Engines benötigt).
Gemessen und verworfen: PDF-Textebene als Bestätigung (12 von 319 widersprachen Qwen), pix2texts eigene Sicherheit (Fehler auch bei 1,0), Qwen3-VL-8B (nicht schneller, etwas schlechter).
Beim Update zu tun
pip install -r requirements.txt.- Qwen-Server mit
--parallel 8 -c 32768neu starten (BEDIENUNGSANLEITUNG, Abschnitt 2). - Für Formeln im Fließtext: aktuelles pdf2md verwenden und das Buch mit
--formulasneu umwandeln. - Bestehende Arbeitsordner bleiben gültig; Lesarten werden nicht neu gefragt.
[0.4.0] – 2026-10-09
Bessere Normalform: Lesarten, die sich nur in der Schreibweise unterscheiden, gelten als gleich. Göllmann (400 Formeln mit bekannter Lösung, gleiche Lesarten): +17 automatisch, weiterhin 0 falsch.
Neu
- Mehrzeilige Formeln sind gleich bei gleichen Zeilen mit gleichen Zeichen, egal in welchem Rahmen
(
aligned/gathered/splitmit&oder nur\\;cases=\left\{array\right.=\left\{aligned\right.); eine leere letzte Zeile zählt nicht. In Matrizen trennt&weiter Spalten. - Weitere Gleichsetzungen:
\cdot\cdot\cdotund...=\dots,\root3\of{x}=\sqrt[3]{x},\left./\right.entfallen. - Strukturvergleich mit sympy (
structure.py, optional, aus): gleicher unausgewerteter Ausdrucksbaum. Einschalten mitstructural= 1 bzw.FORMULA_STRUCTURAL=1. - Bild-Schiedsrichter (
verify.image_arbiter, aus): bei „Qwen = Gemma gegen pix2text“ entscheidet der Bildbeleg. Einstellungenarbiter,arbiter_margin. - Werkzeuge:
tools/vergleich_bericht.py(Vorher/Nachher-Seite),tools/buch_bericht.py(Ergebnisseite eines ganzen Buchs),regeltest.py --refreshund--arbiter.
Geändert
- Eine Klammergruppe ist nur Argument, wenn der Befehl noch eines erwartet (
t^{2}\,{\sqrt{2}}=t^2\sqrt{2},\Delta{x_{n}}=\Delta x_n). - Der Wahrheitsvergleich der Messung nutzt dieselbe Normalform (richtige mehrzeilige Lesarten zählten bisher als falsch).
- Bilder für die Modelle höchstens 1600 Pixel lang.
Behoben
- pix2texts
\cfracwird beim Bereinigen zu\dfrac(Pandoc kennt\cfracnicht und ließ die Formel als TeX-Text stehen). - Wörtliches
\nin Antworten von Qwen und Gemma wird zu Leerraum (tex.fix_literal_newlines). - Sehr große Ausschnitte: Qwen lehnte sie ab („400 Bad Request“), eine ganzseitige Abbildung brachte den Bildvergleich zum Absturz.
- Fehlgeschlagene Modellanfragen werden beim nächsten Lauf wiederholt (zählten als „schon gefragt“).
Gemessen und verworfen: Strukturvergleich (nach der neuen Normalform kein Gewinn), Bild-Schiedsrichter
(der gemeinsame Fehler \mathcal{E}_r bekam Beleg 7,2), Prompt-Stilvorgabe (keine Verbesserung).
Erstes ganzes PDF-Buch: Corral, Elementary Calculus, 1150 Ausschnitte, 429 automatisch (37 %).
Beim Update zu tun
- Nichts Pflichtiges. Prompt-Version bleibt 2, gespeicherte Lesarten bleiben gültig;
runrechnet die Entscheidungen mit der neuen Normalform neu. - Optional für den Strukturvergleich:
pip install sympy lark.
[0.3.0] – 2026-10-09
Neue Standardregel p2t: pix2text liest zuerst, Qwen bestätigt, Gemma nur bei Uneinigkeit; GLM (Cloud) wird
nicht mehr benutzt. Göllmann Band 1: 86 % / 85 % automatisch, 0 falsch (bisher 78 % / 70 %).
Neu
- pix2text (Formel-OCR MFR 1.5, ONNX) als Engine
p2t, im Prozess, auf der GPU mitonnxruntime-gpu(FORMULA_P2T_DEVICE:auto,cpu,cuda:N). - Regel
p2t: übernommen wird pix2texts Lesart, wenn Qwen sie bestätigt oder – nur bei Uneinigkeit gefragt – Gemma. Qwen und Gemma gemeinsam gegen pix2text gehen an einen Menschen. calibrate: beliebig viele Engines (--engines), Regel-Tabelle,--reuseohne Modellabfragen.- Werkzeuge:
tools/zeittest.py,tools/regeltest.py.
Geändert
- pix2text-Ausgabe bereinigt: Leerzeichen mit
post_processaus pix2tex, Fettschreibweisen\mathrm{\boldmath~ x ~}→\boldsymbol{x}. An 400 Lesarten geprüft: gleiches gesetztes Bild. - Normalform:
\operatorname{l i m}=\lim,\ddot{u}in Text = ü,^{\prime}=', abschließendes\\vor\end,\begin{array}[t],\mathop{…}.
Beim Update zu tun
- pix2text installieren:
pip install "pix2text[multilingual]",pip install --no-deps pix2tex munch, für die GPUpip uninstall -y onnxruntime && pip install onnxruntime-gpu. - Bestehende Arbeitsordner:
runerneut aufrufen; pix2text liest nach, Qwen-Lesarten bleiben gültig. - Wer die Regel mit GLM behalten will:
"consensus_rule": "vlm3"inworkspace.json.
[0.2.0] – 2026-10-07
Entscheider ist der Konsens dreier Bildmodelle statt eines Pixelvergleichs. Gehrke-Brückenkurs: 942 von 1505 automatisch (63 %), 62 von 62 geprüften korrekt.
Neu
- Konsens: Qwen3-VL-30B-A3B (lokal) = Gemma-4-26B-A4B (lokal) = GLM-4.6V (OpenRouter); Pandoc muss die Formel umsetzen; grobes Bild-Veto (elastischer Vergleich, Ähnlichkeit ≥ 0,65).
consensus.py: Normalform auf Baumbasis und Render-Gleichheit als Rückfallebene.- Zweite lokale Engine
local2; Token-Wahrscheinlichkeiten aus Logprobs. runin Paketen zu 50 mit Statuszeile;calibrate --consensus;tools/vergleich.py,tools/konsens_bericht.py.apply: deutsches Dezimalkomma3{,}6.
Geändert
- Nachdenken der Modelle abgeschaltet (Gemma ~10× schneller, GLM besser und ~25× billiger); Antworten auf 800 Tokens begrenzt; Prompt fragt ausdrücklich nach Fettdruck.
- Elastischer Bildvergleich (DTW über Spalten und Zeilen, Dehnen kostet proportional zur Tinte).
- Geprüft wird nur die übernommene Lesart; Prüfergebnisse tragen eine Verfahrensversion.
Behoben
- Gleichungsnummern wurden aus alten, verworfenen Lesarten übernommen (erfundene „(3.7)“).
- Gleichzeitiges Speichern zweier Engines; Absturz bei Formeln ohne aktuelle Lesart.
Beim Update zu tun
- Zwei llama.cpp-Server starten (Qwen auf Port 8011, Gemma auf Port 8012) und Gemma laden
(BEDIENUNGSANLEITUNG, Abschnitte 1 und 2);
OPENROUTER_API_KEYsetzen. - Arbeitsordner aus 0.1.0: Standard ist jetzt der Konsens; den alten Entscheider behält
"decide": "pixel"inworkspace.json.
[0.1.0] – 2026-10-07
Erstveröffentlichung: scan, recognize (ein Bildmodell), verify mit Pixelvergleich und Kontrasttest gegen Verwechslungsvarianten, Review-Galerie, apply/revert, calibrate. Sicher (0 Falsch-Annahmen), aber an echten Büchern nur 1–2 % automatisch.