Bearbeitbare draw.io-Abbildungen für wissenschaftliche Arbeiten
Sie erstellen Abbildungen als native draw.io-Objekte aus einem Python-Build-Skript (dem maßgeblichen Artefakt: jede Koordinate, Rolle und Größe lebt darin, sodass die Figur neu generiert und neu eingefärbt werden kann). Verfolgen Sie niemals Pixel, rastern Sie niemals Text. Details zu jedem Aufruf und jeder Regel: REFERENCE.md. Vorlagen zum Kopieren: EXAMPLES.md.
Ausführen der Werkzeuge
Der gesamte Code wird in einer Datei ausgeliefert. T unten bedeutet python drawio_toolkit.py:
T <werkzeug> [argumente] # z.B. T lint_drawio fig.drawio --theme theme.yaml (jedes Werkzeug: --help)
T unpack ./tidyfigs # optional: normaler Ordner scripts/ assets/ examples/; dann python scripts/<werkzeug>.py
In Python: import drawio_toolkit; drawio_toolkit.setup() → from drawio_kit import Diagram,
from figlib import *, from drawio_doc import Doc. Generierte Build-Skripte finden die Bibliothek selbstständig.
Keine Codeausführung verfügbar? Folgen Sie trotzdem der gleichen Methode: Schreiben Sie das Build-Skript (oder, für kleine Abbildungen, direkt das draw.io-XML — REFERENCE §14) für den Benutzer, der es ausführen soll, und bitten Sie ihn um die Vorschau-/Lint-Ausgabe oder Screenshots anstatt sie selbst anzusehen.
Modus auswählen
| Eingabe | Modus | Ausgabe |
|---|---|---|
| Rasterbild zur Neuerstellung | A Bild | <bild>.drawio + <bild>#drawio.png (300 dpi) neben dem Bild |
| Prosa / Paper-Abschnitt / Gleichung | B Text | 3 Prototypen → Benutzer wählt → <name>.drawio |
| eine vorhandene .drawio-Datei publikationsreif machen | C Verbessern | <name>#ENHANCED.drawio + PDF/SVG/PNG-Exporte |
A oder B wird oft von C gefolgt. Fragen Sie nach dem Modus nur, wenn die Anfrage wirklich mehrdeutig ist.
Gemeinsame Regeln (alle Modi)
- Nur Themen-Rollen. Farben, Schriftarten, Größen, Striche, Deckkraft stammen aus einem YAML/TOML/JSON-Theme
(
fill="primary",size="body",sw="thick",fill_opacity="tint"). Tönungen = vorhandene Rolle + Deckkraftrolle, kein neuer Hex-Code. Benötigen Sie eine neue Farbe? Fügen Sie eine semantische Rolle hinzu (highlight,chunk_b) und teilen Sie sie dem Benutzer mit. Lint meldet jeden Nicht-Theme-Wert; die Endfassung hat keine. - Vereinheitlichen nach Absicht: Gleichartige Elemente erhalten identische Größen, Zeilen/Spalten einen Abstand (
row,row_widths,fit_row,column,grid_boxes), gemeinsame Kanten eine Koordinate; Beschriftungen auf das zentrieren, was sie beschriften (x + w/2). Ignorieren Sie ±1 px Rauschen. - Verbinder anhängen mit
src/tgt(+exit/entry-Brüchen) immer dann, wenn eine Linie eine Form berührt;ptslistet nur das auf, was draw.io nicht berechnen kann (freier Start, Wegpunkte, freies Ende). Freie Punkte nur für Trennlinien, Plotachsen, nicht verbundene Vektoren. - Kurvige Kanten (
route="curved",flex_arrow,cycle): Wegpunkte sind Kontrollpunkte; die Kurve verläuft durch die Mittelpunkte zwischen aufeinanderfolgenden Wegpunkten. - Z-Reihenfolge = Erstellungsreihenfolge (später oben): Leinwand → Panels → Füllungen → Formen → Verbinder → Text
→ Anmerkungen. Gruppieren Sie Dinge, die sich zusammen bewegen (
with d.group("kachel")). - Stabile IDs auf wichtigen Knoten (für Kanten benötigt, lesbare Lint-Ausgabe).
- Textauszeichnung:
**fett***kursiv*__unterstrichen__{rolle|farbig}\n\*; Inline-LaTeX\( … \); Display-Mathe viad.equation(r"…")(natives MathJax, bearbeitbar).raw=Trueübergibt HTML. - Durch Hinsehen überprüfen: Nach jedem Build die PNG-Vorschau(en) mit Ihrem Bildbetrachter ansehen; die Zahlen (Lint, Bewertungen, Prüfungen) leiten, der visuelle Check entscheidet. Die Vorschau approximiert draw.io: Emojis = graue Quadrate, Zylinder/Dokumente = Rechtecke, keine Kapitälchen, Mathe via mathtext.
- Arbeitsbereichs-Hygiene: Skizzen-Skripte, Tests und Zuschnitte kommen in
<workdir>/scratch/, niemals neben die Benutzerdateien. - Akademische Standardeinstellungen: weißer Hintergrund, kein Titel innerhalb der Abbildung (stattdessen eine Bildunterschrift entwerfen), ≤ 3 Farbtöne + Tönungen, Farbe niemals die einzige Codierung, eine Schriftfamilie, ≤ 6–7 Größenrollen, ≤ ~25 Textelemente.
Modus A — Bild → bearbeitbares draw.io
Methode: messen → planen → thematisieren → Build-Skript → rendern → vergleichen → korrigieren, bis die Vorschau in der Anordnung mit der Quelle übereinstimmt. Koordinaten sind Quellbild-Pixel, gemessen auf dem echten Raster (der Blick auf eine skalierte Ansicht ist die häufigste Ursache für schlechte Konvertierungen).
A0 Triage (bestimmt den Aufwand; lesen Sie zuerst das nächste Beispiel in EXAMPLES.md):
| Stufe | Sieht aus wie | Haupttechniken | Iterationen | Endbewertung |
|---|---|---|---|---|
| 1 einfach | Kästen, Beschriftungen, gerade/abgewinkelte Pfeile, 1–3 Felder | rect, text, angehängte edge, row | 2–3 | ≥ 0,88 |
| 2 Raster/Dashboard | Kacheln mit Symbolen, Spalten, Mini-Flows, Aufzählungszeichen | panel, Gruppen, fit_row/grid_boxes, icon, orthogonale Kanten | 3–5 | ≥ 0,88 |
| 3 Plot/geometrisch | Achsen, Vektoren, Punkte, Kreise, wellenförmige Pfeile, gedrehte Beschriftungen | dot, circle, Anker, flex_arrow, kurvige Kanten, rotation | 3–6 | ≥ 0,85 |
| 4 komplex | 3-D-Oberflächen, Netze, Fotos, dichte Punktwolken, Callouts | surface_mesh, polygon, image_crop, scatter_*, callout, Z-Schichtung | 5–10 | ≥ 0,78 |
A1 Gerüst + Inspektion: T new_build images/fig.png [--theme user.yaml] [--scale 1] erstellt
images/fig_drawio_work/ (build.py, theme.yaml, NOTES.md, inspect/, iterations/, scratch/,
history.json; behalten). Lesen Sie inspect/summary.md und sehen Sie source.grid*.png (Positionen),
source.boxes.png/.json (exakte Begrenzungsrahmen + Medianfarben — direkt verwenden), source.ocr.png/.json (Text +
Schriftgröße: verwenden Sie die breitenangepassten est_px_if_regular/bold, wählen Sie durch Hinsehen), source.palette.png
(Farben → nächste Rolle, ΔE). Das Gerüst füllt erkannte Begrenzungsrahmen in build.py voraus — verfeinern Sie sie.
Zoomen Sie jeden Bereich: T inspect_image zoom QUELLE --box x0 y0 x1 y1 --factor 3 --step 10; dünne/helle
Merkmale numerisch abtasten (T inspect_image probe QUELLE --box … oder numpy, REFERENCE §6.1). OCR-Lesefehler und der
Detektor verbindet sich berührende Formen — immer visuell prüfen.
A2 Plan in NOTES.md: Inventarisieren Sie Bereich für Bereich in Z-Reihenfolge. Entscheiden Sie pro Element:
native Knoten (Kästen, Panels, Pillen, Kreise, Rauten, Zylinder) · nativer Text (jeder Text, immer) ·
angehängte edge (Verbindungen) · freie edge (Achsen, Trennlinien) · flex_arrow (breit/wellenförmig) · dots in einer
Gruppe (Streudiagramm ≤ ~400) · polygon/svg_layer/surface_mesh (Kleckse, Balken, Netze, 3-D) ·
image_crop (nur Fotos, Texturen, Logos — ihre Beschriftungen nativ darüber neu erstellen) · Bibliotheksform oder Emoji
icon (Symbole; sagen Sie welche). Notieren Sie jede nicht-native Entscheidung für den Bericht.
A3 Thema: Benutzerfarben/Schriftarten → Rollen, ordnen Sie jede Quellfarbe der nächsten Rolle zu; andernfalls die
dominanten Farben der Quelle dedupliziert auf ≤ 6–8 Rollen. Gruppieren Sie OCR-Größen in ≤ 6–7 Größenrollen (gleiche visuelle
Ebene ⇒ gleiche Rolle). Nächste websichere Familie (Helvetica/Arial; Times New Roman für LaTeX-artige Serife);
google: true für Roboto/Inter. Messen Sie die Strichstärke bei Zoom.
A4 build.py schreiben (Diagram.from_source ist vorverkabelt; vollständige API REFERENCE §2):
pid, (cx, cy, cw, ch) = d.panel(52, 110, 620, 570, "**AUTO-ENCODING**", header_h=70, header_fill="primary",
header_color="background", title_size="heading")
for (x, y, w, h), t in zip(d.row_widths(182, 336, [97, 138, 97, 97], 62, gap=13), ["[A]", "[MASK]", "[C]", "[D]"]):
d.rect(x, y, w, h, t, fill="token", stroke="text", rounded=4, size="body", id="tok_" + t.strip("[]"))
d.rect(275, 455, 170, 62, "**Encoder**", fill="primary", color="background", rounded=4, id="enc")
d.edge([], src="enc", tgt="tok_MASK", sw="thick", exit=(.5, 0), entry=(.5, 1))
d.edge([(108, 486)], tgt="enc", entry=(0, .5)) # freier Start, angehängtes Ende
d.text("Dimension 2", 365, 144, size="small", rotation=-90)
d.image_crop((49, 199, 143, 309), border="text") # Foto aus der Quelle kopiert
Zufallsgenerierte Inhalte (Streudiagramm) verwenden einen festen seed und Abstandsrechtecke um Beschriftungen. > ~600 Knoten →
dekorative Markierungen zu einer svg_layer zusammenführen. Kleine Quellen → --scale 2 damit Text ≥ 10 px.
A5 Iterieren: T iterate images/fig_drawio_work --note "was geändert" = Build → Rendern → Vergleichen → Lint →
Schnappschuss + Historie. Ansehen: iter_NN_side.png (alles: Wortlaut, Größen, Gewichtungen, Umbrüche),
iter_NN_edges.png (rot = nur Quelle, cyan = nur Vorschau; verschieben, bis die Paare verschmelzen),
iter_NN_heat.png + schlechteste Zellen (diese als nächstes zoomen). In Durchgängen arbeiten: (1) Leinwand, Panels, Raster →
(2) Formen an erkannte Begrenzungsrahmen angepasst und vereinheitlicht → (3) jeder Verbinder mit Anschlüssen angehängt →
(4) Schriftrollen, Gewichtungen, Zentrierung, valign → (5) Kantendifferenz-Politur. Pro Iteration ein paar
zusammenhängende Dinge ändern; wenn die Bewertung sinkt, rückgängig machen. Anhalten, wenn: jedes Inventarelement vorhanden ist (Quelle Bereich für Bereich erneut lesen), Lint 0 Fehler und keine Überlauf-/Überlappungs-/Nicht-Theme-Warnungen, Seite an Seite
zeigt keine Fehlplatzierung oder falschen Text, Bewertung stagniert (< 0,005 Gewinn über 2 Iterationen). Falls die draw.io-CLI
existiert: eine finale T render_preview OUT --engine drawio.
A6 Finalisieren: images/fig.drawio ist der neueste Build; exportieren
T render_preview images/fig.drawio -o "images/fig#drawio.png" --dpi 300. Der Bildordner enthält nur
Quelle, .drawio, #drawio.png (+ das Arbeitsverzeichnis). Bericht: Pfade; nativ vs. eingebettet (Fotos,
SVG-Ebenen, Emoji-Platzhalter); verwendete/hinzugefügte Rollen; bekannte Abweichungen; beibehaltene Tippfehler der Quelle; wie
neu eingefärbt wird (theme.yaml bearbeiten → python build.py) und neu skaliert.
Modus B — Text → drei bearbeitbare Figurenprototypen
Lesen Sie den Text, inventarisieren Sie seine Aussagen, bauen Sie drei verschiedene Figurenfamilien, prüfen Sie sie, präsentieren Sie ein Seite-an-Seite-Blatt; der Benutzer wählt; Sie finalisieren.
Ausgabeort: Datei drafts/methods.md → drafts/methods_figures/; eingefügter Text →
./figures/<slug>/; mehrteilige/lange Eingabe → ein Unterordner pro Abschnitt p1_<slug>/ …; ein
vom Benutzer benannter Ordner → genau dieser (--out-dir). Teilen Sie dem Benutzer den Pfad mit. Ein Thema für alle
Abschnitte gemeinsam (--theme oder theme.yaml im Ausgabestammverzeichnis bearbeiten).
B1 Gerüst + analysieren: T new_figures drafts/methods.md [--theme t.yaml] [--split|--whole] [--passages 1,3] oder T new_figures --text "<absatz>" --name rag_pipeline. Gibt pro Abschnitt aus: Wortanzahl, Gleichungen, Strukturhinweise, drei vorgeschlagene Familien. ≤ 350 Wörter ohne Überschriften = ein
Abschnitt. Keine figurenwürdige Struktur (reine Erzählung)? Sagen Sie es, anstatt Figuren zu erzwingen.
B2 Inventar (NOTES.md): Entitäten, geordnete Schritte (mit ihren Verben), Beziehungen (Richtung + Verb), Mengen mit Einheiten, Qualifikatoren, Schlussfolgerungen — jede mit einem kurzen Zitat. Bestätigen Sie die Familien (REFERENCE §7): Standard = drei Layouts der dominanten Struktur (detailliert / kompakte Übersicht / alternative Perspektive); starke zweite Struktur → zwei + eine; Gleichungen → das Gleichungs-Trio, es sei denn beiläufig. Die drei müssen sich in der Topologie unterscheiden (Spuren / Stapel / radial / Matrix / Diagramm / Platte), nicht im Stil. Für mathematische, naturwissenschaftliche, algorithmische Texte bevorzugen Sie aktive Demonstrationen (ausgefüllte Matrixberechnung, kontinuierliche Koordinaten-/Metrikräume, Bayes-Platten, kausale DAGs) gegenüber statischen Aufzählungskarten.
B3 build.py schreiben — drei Builder, jeder erhält ein frisches Diagram seiner Leinwandgröße:
from figlib import *
INFERRED = ["v1: ordinale Bewertungen interpretieren den qualitativen Wortlaut des Textes"] # dem Benutzer mitgeteilt
ALLOWED_TERMS = ["layer"] # strukturelle Wörter, keine Behauptungen
LINT_IGNORE = [] # absichtlich akzeptierte Warnungen (Teilzeichenfolge)
def v1(d): # Swimlane-Pipeline
lane(d, 20, 20, 1060, 175, "Offline-Indizierung")
chain(d, ["Inspektionsberichte\n(gescannt)", "OCR\nzu Text", "Semantisches\nChunking"], 80, 78, 140, 60,
shapes=["document", None, None], ids=["rep", "ocr", "chk"])
VARIANTS = [dict(key="v1", name="swimlane_pipeline", size=(1100, 400), build=v1,
about="eine Zeile für das Blatt", caption="Entwurf einer Bildunterschrift in den Worten des Textes."), ...]
Regeln: nur Themen-Rollen, gleiche Kategorie = gleicher Stil in allen drei; Gleichartige teilen Größen und einen Abstand (Helfer, keine handabgestimmten Zahlen); Verbinder angehängt, Rückmeldung gestrichelt/sekundär; ≤ ~25 Textelemente,
< ~150 Knoten (sonst in zwei Figuren aufteilen); kein Titel innerhalb der Abbildung — caption schreiben; Beschriftungen im
Wortlaut des Textes (durch Streichung kürzen, nicht durch Synonyme; Qualifikatoren, Ziffern, Einheiten, Akronyme wie geschrieben beibehalten). Interpretative Mittel (Bewertungen, Grenzen, "beste Passung", Achsenanordnungen, mathematische Fakten nicht im Text)
nur, wenn in INFERRED aufgeführt.
B4 Prototyp, prüfen, korrigieren (≥ 2 Runden): T prototype <absatz verzeichnis> [--only v2] --note "…" baut
alle drei, rendert, lint, führt den Treuecheck aus, schreibt prototypes.png/.md, protokolliert err/warn/miss.
Jedes PNG ansehen und das Blatt. Jede Lint-Warnung beheben oder ein bewusstes LINT_IGNORE hinzufügen; jedes
NICHT-IM-TEXT-Wort auflösen (durch den Begriff des Textes ersetzen · ALLOWED_TERMS wenn strukturell · INFERRED
wenn Interpretation). Prüfen, was Lint nicht kann: Pfeile kreuzen Beschriftungen, überfüllte Ecken, schwache Hierarchie,
unausgeglichene weiße Fläche, zwei Prototypen zu ähnlich, jede Pfeilrichtung gegen das Inventar.
Fertig bei 0/0/0 (oder akzeptierten Warnungen) und sauber in voller Größe.
B5 Präsentieren: prototypes.png zeigen; pro Prototyp eine Zeile zu seinem Schwerpunkt, seiner Bildunterschrift im Entwurf, seinen
INFERRED-Elementen; auf Besonderheiten der Quelle hinweisen (Tippfehler, inkonsistente Namen), anstatt sie stillschweigend zu korrigieren. Den Benutzer bitten, auszuwählen (oder Änderungen / eine Kombination anzufordern → build.py bearbeiten, erneut ausführen).
B6 Finalisieren: T finalize <absatz verzeichnis> --pick v2 [--name rag_pipeline] [--clean] → <name>.drawio
(+ .png) und CHOSEN.md (Bildunterschrift, abgeleitet). --clean verwirft die anderen Prototypen, behält aber _work/.
Modus C für venuespezifische Politur anbieten.
Modus C — eine .drawio-Datei für die Publikation verbessern
Ein bewusster Durchgang: die Aufgabe der Abbildung verstehen → in Druckgröße messen → ändern, um diese Aufgabe zu erfüllen → verifizieren → exportieren. Nie vor dem Gespräch bearbeiten.
C1 Start: T start_enhance pfad/FIG.drawio [--source-image] [--text] [--artifacts VERZEICHNIS] [--theme].
Erkennt Kontext (Modus-A-Arbeitsverzeichnis: Quellbild, build.py, Thema, NOTES; Modus-B-Text-Ordner:
passage.md, build.py VARIANTS, CHOSEN.md, Bildunterschrift, INFERRED), erkennt manuelle Bearbeitungen nach der Generierung,
empfiehlt eine Route, prüft "vorher", schreibt <stamm>_enhance_work/ (context.md, before_audit.md,
brief.yaml, questions.md, theme.yaml, build_enhanced.py falls
…
[gekürzt zur Übersetzung]