Communitygithub.com

tidyfigs

Crie e edite figuras acadêmicas publicáveis no draw.io / diagrams.net a partir de imagens raster, texto descritivo ou equações LaTeX, com três modos de operação: imagem para drawio editável, texto para protótipos de figuras, e aprimoramento de diagramas existentes para publicação.

O que é tidyfigs?

Este skill profissional transforma qualquer figura acadêmica – seja rasterizada (PNG/JPG/WebP), descrita em prosa ou com equações LaTeX – em diagramas draw.io editáveis e nativos, prontos para submissão em periódicos. Ele opera em três modos: (A) IMAGE reconstrói fielmente uma figura raster em objetos draw.io, com detecção de caixas, OCR e paleta de cores, gerando um script Python de construção; (B) TEXT cria três protótipos diferentes de figuras a partir de texto, permitindo ao usuário escolher o melhor layout; (C) ENHANCE entrevista o usuário para entender o contexto e então polir um diagrama.drawio existente para um veículo específico (tamanho de impressão, fontes, cores, LaTeX, conectores). Suporta os principais editores de agente (Claude Code, Cursor, Codex) e plataformas sem execução de código, onde o agente escreve o script de construção para o usuário executar localmente. O skill usa temas YAML/TOML/JSON com papéis semânticos (cores, fontes, traços) e garante que todas as figuras sejam regulares e prontas para publicação, com exportação em PNG, SVG e PDF. Ideal para pesquisadores, cientistas da computação e autores acadêmicos que precisam criar ou adaptar diagramas de alta qualidade para artigos, teses e apresentações.

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

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Figuras draw.io editáveis para artigos acadêmicos

Você constrói figuras como objetos draw.io nativos a partir de um script de construção em Python (o artefato de registro: cada coordenada, função e tamanho vive lá, para que a figura possa ser regenerada e re-tematizada). Nunca trace pixels, nunca rasterize texto. Detalhes para cada chamada e regra: REFERENCE.md. Padrões para copiar: EXAMPLES.md.

Executando as ferramentas

Todo o código vem em um único arquivo. A abaixo significa python drawio_toolkit.py:

A <ferramenta> [args]        # ex.: A lint_drawio fig.drawio --theme tema.yaml   (qualquer ferramenta: --help)
A desempacotar ./tidyfigs        # opcional: pasta normal scripts/ assets/ examples/; então python scripts/<ferramenta>.py

Em Python: import drawio_toolkit; drawio_toolkit.setup() → from drawio_kit import Diagram, from figlib import *, from drawio_doc import Doc. Scripts de construção gerados encontram a biblioteca por conta própria.

Nenhuma execução de código disponível? Ainda assim siga o mesmo método: escreva o script de construção (ou, para figuras pequenas, o XML draw.io diretamente — REFERÊNCIA §14) para o usuário executar, e peça a eles a pré-visualização/saída do lint ou capturas de tela em vez de visualizá-las você mesmo.

Escolha o modo

EntradaModoSaída
imagem raster para recriarA imagem<img>.drawio + <img>#drawio.png (300 dpi) ao lado da imagem
prosa / seção de artigo / equaçãoB texto3 protótipos → usuário escolhe → <nome>.drawio
um .drawio existente para deixar pronto para publicaçãoC aprimorar<nome>#APRIMORADO.drawio + exportações PDF/SVG/PNG

A ou B é frequentemente seguido por C. Pergunte qual modo apenas se o pedido for genuinamente ambíguo.

Regras compartilhadas (todos os modos)

  • Apenas papéis de tema. Cores, fontes, tamanhos, traços, opacidades vêm de um tema YAML/TOML/JSON (fill="primario", size="corpo", sw="grosso", fill_opacity="tom"). Tons = papel existente + papel de opacidade, não novo hex. Precisa de uma nova cor? Adicione um papel semântico (destaque, bloco_b) e informe o usuário. O lint relata todos os valores fora do tema; os finais não têm nenhum.
  • Regularizar para intenção: pares recebem tamanhos idênticos, linhas/colunas um único espaço (linha, larguras_linha, ajustar_linha, coluna, caixas_grid), bordas compartilhadas uma coordenada; centralizar rótulos no que eles rotulam (x + l/2). Ignore ruído de ±1 px.
  • Anexar conectores com src/tgt (+ frações saida/entrada) sempre que uma linha tocar uma forma; pts lista apenas o que o draw.io não pode calcular (início livre, pontos de passagem, fim livre). Pontos livres apenas para divisores, eixos de gráficos, vetores não anexados.
  • Bordas curvas (rota="curva", flecha_flex, ciclo): pontos de passagem são pontos de controle; a curva passa pelos pontos médios entre pontos de passagem consecutivos.
  • Ordem Z = ordem de criação (mais recente no topo): tela → painéis → preenchimentos → formas → conectores → texto → anotações. Agrupe coisas que se movem juntas (com d.grupo("laje")).
  • Ids estáveis em vértices importantes (necessários para bordas, lint legível).
  • Marcação de texto: **negrito** *itálico* __sublinhado__ {papel|colorido} \n \*; LaTeX inline \( … \); matemática exibida via d.equacao(r"...") (MathJax nativo, editável). raw=True passa HTML.
  • Verificar olhando: após cada construção, veja a(s) pré-visualização(ões) PNG com sua ferramenta de imagem; os números (lint, pontuações, auditorias) guiam, a verificação visual decide. A pré-visualização aproxima o draw.io: emoji = quadrados cinzas, cilindros/documentos = retângulos, sem versaletes, matemática via mathtext.
  • Higiene do espaço de trabalho: scripts de rascunho, sondas e recortes vão em <dir_de_trabalho>/rascunho/, nunca ao lado dos arquivos do usuário.
  • Padrões acadêmicos: fundo branco, sem título na figura (esboce uma legenda), ≤ 3 matizes + tons, cor nunca a única codificação, uma família de fontes, ≤ 6–7 papéis de tamanho, ≤ ~25 itens de texto.

Modo A — imagem → draw.io editável

Método: medir → planejar → tema → script de construção → renderizar → comparar → corrigir, até que a pré-visualização corresponda à fonte no layout. Coordenadas são pixels da imagem fonte medidos na grade real (olhar para uma visualização redimensionada é a #1 causa de conversões ruins).

A0 Triagem (define esforço; leia o exemplo mais próximo em EXAMPLES.md primeiro):

NívelParece comTécnicas principaisIteraçõesPontuação final
1 simplescaixas, rótulos, setas retas/cotovelo, 1–3 painéisrect, texto, borda anexada, linha2–3≥ 0.88
2 grade/dashboardlajes com ícones, colunas, mini fluxos, marcadorespainel, grupos, ajustar_linha/caixas_grid, icone, bordas ortogonais3–5≥ 0.88
3 gráfico/geométricoeixos, vetores, pontos, círculos, setas onduladas, rótulos rotacionadosponto, círculo, âncoras, flecha_flex, bordas curvas, rotação3–6≥ 0.85
4 complexosuperfícies 3-D, malhas, fotos, dispersão densa, chamadasmalha_superficie, polígono, recorte_imagem, dispersão_*, chamada, camadas z5–10≥ 0.78

A1 Andaime + inspecionar: A novo_edificio imagens/fig.png [--theme usuario.yaml] [--escala 1] cria imagens/fig_drawio_trabalho/ (construcao.py, tema.yaml, NOTAS.md, inspecao/, iteracoes/, rascunho/, historico.json; mantenha). Leia inspecao/resumo.md e veja fonte.grid*.png (posições), fonte.caixas.png/.json (caixas delimitadoras exatas + cores medianas — use diretamente), fonte.ocr.png/.json (texto + tamanho da fonte: use est_px_se_regular/negrito ajustado por largura, escolha olhando), fonte.paleta.png (cores → papel mais próximo, ΔE). O andaime pré-preenche caixas detectadas em construcao.py — refine-as. Amplie qualquer região: A inspecionar_imagem zoom SRC --caixa x0 y0 x1 y1 --fator 3 --passo 10; examine características finas/claras numericamente (A inspecionar_imagem sonda SRC --caixa … ou numpy, REFERÊNCIA §6.1). OCR lê errado e o detector mescla formas tocantes — sempre verifique visualmente.

A2 Planejar em NOTAS.md: inventário região por região em ordem Z. Decida por elemento: vértice nativo (caixas, painéis, pílulas, círculos, losangos, cilindros) · texto nativo (todo texto, sempre) · borda anexada (conexões) · borda livre (eixos, divisores) · flecha_flex (larga/ondulada) · pontos em um grupo (dispersão ≤ ~400) · polígono/camada_svg/malha_superficie (manchas, vigas, malhas, 3-D) · recorte_imagem (fotos, texturas, logos apenas — reconstrua seus rótulos nativamente por cima) · forma de biblioteca ou ícone emoji icone (ícones; diga qual). Registre toda decisão não nativa para o relatório.

A3 Tema: cores/fontes do usuário → papéis, mapeie cada cor fonte para o papel mais próximo; caso contrário, as cores dominantes da fonte desduplicadas para ≤ 6–8 papéis. Agrupe tamanhos OCR em ≤ 6–7 papéis de tamanho (mesmo nível visual ⇒ mesmo papel). Família mais próxima segura para web (Helvetica/Arial; Times New Roman para serifa estilo LaTeX); google: true para Roboto/Inter. Meça a espessura do traço em um zoom.

A4 Escreva construcao.py (Diagram.de_fonte está pré-configurado; API completa REFERÊNCIA §2):

pid, (cx, cy, cw, ch) = d.painel(52, 110, 620, 570, "**AUTO-CODIFICAÇÃO**", cabecalho_a=70, cabecalho_preenchimento="primario",
                                cabecalho_cor="fundo", titulo_tamanho="cabecalho")
for (x, y, w, h), t in zip(d.larguras_linha(182, 336, [97, 138, 97, 97], 62, espaco=13), ["[A]", "[MASK]", "[C]", "[D]"]):
    d.rect(x, y, w, h, t, preenchimento="token", traco="texto", arredondado=4, tamanho="corpo", id="tok_" + t.strip("[]"))
d.rect(275, 455, 170, 62, "**Codificador**", preenchimento="primario", cor="fundo", arredondado=4, id="cod")
d.borda([], src="cod", tgt="tok_MASK", sw="grosso", saida=(.5, 0), entrada=(.5, 1))
d.borda([(108, 486)], tgt="cod", entrada=(0, .5))                     # início livre, fim anexado
d.texto("Dimensão 2", 365, 144, tamanho="pequeno", rotacao=-90)
d.recorte_imagem((49, 199, 143, 309), borda="texto")                   # foto copiada da fonte

Conteúdo aleatório (dispersão) usa uma seed fixa e retângulos de exclusão ao redor dos rótulos. > ~600 vértices → mescle marcas decorativas em uma camada_svg. Fontes pequenas → --escala 2 para que texto ≥ 10 px.

A5 Iterar: A iterar imagens/fig_drawio_trabalho --nota "o que mudou" = construir → renderizar → comparar → lint → instantâneo + histórico. Veja iter_NN_lado.png (tudo: redação, tamanhos, pesos, quebra de linha), iter_NN_bordas.png (vermelho = apenas fonte, ciano = apenas pré-visualização; mova até que pares se fundam), iter_NN_calor.png + piores células (amplie essas em seguida). Trabalhe em passadas: (1) tela, painéis, grades → (2) formas ajustadas às caixas delimitadoras detectadas e regularizadas → (3) cada conector anexado com portas → (4) papéis de fonte, pesos, centralização, valign → (5) polimento de diferença de borda. Mude algumas coisas relacionadas por iteração; se a pontuação cair, reverta. Pare quando: cada elemento do inventário estiver presente (re-leia a fonte região por região), lint 0 erros e sem avisos de overflow/sobreposição/fora do tema, lado a lado mostra nenhum deslocamento ou texto errado, pontuação estabilizada (< 0.005 de ganho em 2 iterações). Se o CLI draw.io existir: uma final A renderizar_previsao SAIDA --engine drawio.

A6 Finalizar: imagens/fig.drawio é a última construção; exporte A renderizar_previsao imagens/fig.drawio -o "imagens/fig#drawio.png" --dpi 300. A pasta de imagem contém apenas fonte, .drawio, #drawio.png (+ o diretório de trabalho). Relatório: caminhos; nativo vs embutido (fotos, camadas SVG, placeholders de emoji); papéis usados/adicionados; desvios conhecidos; erros de digitação da fonte mantidos; como re-tematizar (editar tema.yaml → python construcao.py) e redimensionar.


Modo B — texto → três protótipos de figuras editáveis

Leia a passagem, inventarie suas afirmações, construa três famílias de figuras diferentes, verifique-as, apresente uma folha lado a lado; o usuário escolhe; você finaliza.

Local de saída: arquivo rascunhos/metodos.md → rascunhos/metodos_figuras/; texto colado → ./figuras/<slug>/; entrada longa/multisseção → uma subpasta por passagem p1_<slug>/ …; uma pasta nomeada pelo usuário → exatamente essa (--dir-saida). Informe o usuário o caminho. Um tema compartilhado por todas as passagens (--tema ou edite tema.yaml na raiz de saída).

B1 Andaime + analisar: A novas_figuras rascunhos/metodos.md [--theme t.yaml] [--dividir|--inteiro] [--passagens 1,3] ou A novas_figuras --texto "<passagem>" --nome pipeline_rag. Imprime por passagem: contagem de palavras, equações, pistas de estrutura, três famílias sugeridas. ≤ 350 palavras sem cabeçalhos = uma passagem. Nenhuma estrutura digna de figura (narrativa pura)? Diga isso em vez de forçar figuras.

B2 Inventário (NOTAS.md): entidades, passos ordenados (com seus verbos), relações (direção + verbo), quantidades com unidades, qualificadores, conclusões — cada um com uma citação curta. Confirme as famílias (REFERÊNCIA §7): padrão = três layouts da estrutura dominante (detalhado / visão geral compacta / lente alternativa); segunda estrutura forte → dois + um; equações → o trio de equações a menos que incidental. Os três devem diferir em topologia (pistas / pilha / radial / matriz / gráfico / placa), não em estilo. Para passagens matemáticas, científicas, algorítmicas, prefira demonstrações ativas (computação de matriz preenchida, espaços contínuos de coordenadas/métricas, placas Bayesianas, DAGs causais) sobre cartões de marcadores estáticos.

B3 Escreva construcao.py — três construtores, cada um recebe um Diagram novo do seu tamanho de tela:

from figlib import *
INFERIDAS = ["v1: classificações ordinais interpretam a redação qualitativa da passagem"]   # relatado ao usuário
TERMOS_PERMITIDOS = ["camada"]                # palavras estruturais, não afirmações
IGNORAR_LINT = []                         # avisos aceitos de propósito (substring)
def v1(d):                               # pipeline de pista
    pista(d, 20, 20, 1060, 175, "Indexação offline")
    cadeia(d, ["Relatórios de inspeção\n(digitalizados)", "OCR\nem texto", "Fragmentação\nsemântica"], 80, 78, 140, 60,
          formas=["documento", None, None], ids=["rep", "ocr", "frg"])
VARIANTS = [dict(chave="v1", nome="pipeline_pista", tamanho=(1100, 400), construir=v1,
                 sobre="uma linha para a folha", legenda="Legenda de rascunho nas palavras da passagem."), ...]

Regras: apenas papéis de tema, mesma categoria = mesmo estilo nos três; pares compartilham tamanhos e um espaço (ajudantes, não números ajustados manualmente); conectores anexados, realimentação tracejada/secundária; ≤ ~25 itens de texto, < ~150 vértices (senão divida em duas figuras); sem título na figura — escreva legenda; rótulos na redação da passagem (encurte por exclusão, não por sinônimo; mantenha qualificadores, dígitos, unidades, acrônimos como escrito). Dispositivos interpretativos (classificações, fronteiras, "melhor ajuste", ordenações de eixo, fatos matemáticos não no texto) apenas se listados em INFERIDAS.

B4 Protótipo, inspecionar, corrigir (≥ 2 rodadas): A prototipo <dir passagem> [--apenas v2] --nota "…" constrói todos os três, renderiza, faz lint, executa a verificação de fidelidade, escreve prototipos.png/.md, registra err/aviso/perda. Veja cada PNG e a folha. Corrija cada aviso de lint ou adicione um IGNORAR_LINT deliberado; resolva cada palavra NÃO NA PASSAGEM (reformule com o termo da passagem · TERMOS_PERMITIDOS se estrutural · INFERIDAS se interpretação). Verifique o que o lint não pode: setas cruzando rótulos, cantos lotados, hierarquia fraca, espaço em branco desbalanceado, dois protótipos muito semelhantes, direção de cada seta contra o inventário. Feito com 0/0/0 (ou avisos aceitos) e limpo em tamanho real.

B5 Apresentar: mostre prototipos.png; por protótipo uma linha sobre sua ênfase, sua legenda de rascunho, seus itens INFERIDAS; aponte peculiaridades da fonte (erros de digitação, nomes inconsistentes) em vez de corrigir silenciosamente. Peça ao usuário para escolher (ou solicitar alterações / uma combinação → edite construcao.py, re-execute).

B6 Finalizar: A finalizar <dir passagem> --escolher v2 [--nome pipeline_rag] [--limpar] → <nome>.drawio (+ .png) e ESCOLHIDO.md (legenda, inferidas). --limpar descarta os outros protótipos mas mantém _trabalho/. Ofereça o modo C para polimento específico do veículo.


Modo C — aprimorar um .drawio para publicação

Uma passagem deliberada: entender o trabalho da figura → medir no tamanho de impressão → mudá-la para servir a esse trabalho → verificar → exportar. Nunca edite antes da entrevista.

C1 Iniciar: A iniciar_aprimoramento caminho/FIG.drawio [--imagem-fonte] [--texto] [--artefatos DIR] [--tema]. Ele descobre o contexto (diretório de trabalho do modo A: imagem fonte, construcao.py, tema, NOTAS; pasta de passagem do modo B: passagem.md, construcao.py VARIANTS, ESCOLHIDO.md, legenda, INFERIDAS), detecta edições manuais após a geração, recomenda uma rota, audita "antes", escreve <stem>_aprimorar_trabalho/ (contexto.md, auditoria_antes.md, resumo.yaml, perguntas.md, tema.yaml, construir_aprimorado.py se

Habilidades Relacionadas