Communitygithub.com

tidyfigs

Erstellen Sie BEARBEITBARE, publikationsreife draw.io / diagrams.net Abbildungen für wissenschaftliche Arbeiten.

Was ist tidyfigs?

tidyfigs (von anatems1) ist eine KI-gestützte Fähigkeit, die es Entwicklern und Forschern ermöglicht, publikationsreife, bearbeitbare Diagramme für wissenschaftliche Arbeiten direkt im draw.io-Format zu erstellen. Die Fähigkeit arbeitet in drei Hauptmodi: (A) Bild → Konvertiert Rasterbilder (PNG/JPG/WebP) wie Flussdiagramme oder Infografiken in native draw.io-Objekte; (B) Text → Erzeugt aus Prosa, Methodenbeschreibungen oder LaTeX-Gleichungen drei verschiedene Figurenprototypen zur Auswahl; (C) Verbessern → Optimiert bestehende .drawio-Dateien für eine Zielpublikation (Druckgröße, Schriftarten, Farbe/SW, LaTeX, Verbinder, Beschriftungen). Das System erzeugt keine Pixelgrafiken, sondern ein Python-Build-Skript, das jede Koordinate, Rolle und Größe definiert, sodass die Figur jederzeit neu generiert und neu eingefärbt werden kann. Es verwendet Rollen-basierte Themen (YAML/TOML/JSON), um Farben, Schriftgrößen und Striche konsistent zu halten, und überprüft jede Ausgabe durch Linting und visuelle Vergleiche. Unterstützt werden Claude Code, Cursor, Codex und andere KI-Assistenten für die Softwareentwicklung.

Funktioniert mit✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/anatems1/tidyfigs/tree/HEAD/skills/tidyfigs

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

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

EingabeModusAusgabe
Rasterbild zur NeuerstellungA Bild<bild>.drawio + <bild>#drawio.png (300 dpi) neben dem Bild
Prosa / Paper-Abschnitt / GleichungB Text3 Prototypen → Benutzer wählt → <name>.drawio
eine vorhandene .drawio-Datei publikationsreif machenC 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; pts listet 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 via d.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):

StufeSieht aus wieHaupttechnikenIterationenEndbewertung
1 einfachKästen, Beschriftungen, gerade/abgewinkelte Pfeile, 1–3 Felderrect, text, angehängte edge, row2–3≥ 0,88
2 Raster/DashboardKacheln mit Symbolen, Spalten, Mini-Flows, Aufzählungszeichenpanel, Gruppen, fit_row/grid_boxes, icon, orthogonale Kanten3–5≥ 0,88
3 Plot/geometrischAchsen, Vektoren, Punkte, Kreise, wellenförmige Pfeile, gedrehte Beschriftungendot, circle, Anker, flex_arrow, kurvige Kanten, rotation3–6≥ 0,85
4 komplex3-D-Oberflächen, Netze, Fotos, dichte Punktwolken, Calloutssurface_mesh, polygon, image_crop, scatter_*, callout, Z-Schichtung5–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]

Verwandte Skills