Communitygithub.com

anatems1/tidyfigs

학술 논문용 편집 가능한 publication-grade draw.io / diagrams.net 그림을 세 가지 모드로 제작: (A) 이미지 → 래스터 그림을 네이티브 draw.io 객체로 변환; (B) 텍스트 → 세 가지 그림 프로토타입 생성; (C) 향상 → 기존 .drawio 파일을 대상 학술지에 맞게 다듬고 내보내기.

tidyfigs란 무엇인가요?

tidyfigs는 학술 논문과 같은 출판물에 사용할 고품질의 편집 가능한 draw.io/diagrams.net 그림을 만드는 AI 어시스턴트 기술입니다. 세 가지 주요 모드를 제공합니다: (A) 이미지 모드는 PNG, JPG, WebP 같은 래스터 그림(순서도, 인포그래픽, 개념도, 과학적 그림)을 분석하여 네이티브 draw.io 객체로 재구성하고, (B) 텍스트 모드는 논문의 단락, 방법론, 이론 등을 입력하면 세 가지 다른 그림 프로토타입을 생성하여 사용자가 선택할 수 있게 하며, (C) 향상 모드는 기존 .drawio 파일을 가져와 사용자와의 인터뷰를 통해 대상 학술지의 인쇄 규격(크기, 폰트, 컬러/흑백, LaTeX, 연결선, 캡션 등)에 맞게 다듬고 PDF/SVG/PNG로 내보냅니다. 모든 모드는 Python 빌드 스크립트를 생성하여 그림의 모든 좌표와 역할을 코드로 관리하므로 쉽게 재생성 및 테마 변경이 가능합니다. 픽셀 단위 복사나 텍스트 래스터화를 피하고, YAML/TOML/JSON 테마를 사용하여 색상과 폰트를 역할 기반으로 관리하여 일관성을 유지합니다. 코드 에이전트(Claude Code, Cursor 등)와 함께 사용하도록 설계되었으며, 사용자가 직접 코드를 실행할 수 없는 경우에도 빌드 스크립트를 제공하여 사용자가 로컬에서 실행하도록 안내합니다.

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

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

학술 논문용 편집 가능한 draw.io 그림

Python 빌드 스크립트(기록의 아티팩트: 모든 좌표, 역할, 크기가 여기에 있으므로 그림을 재생성하고 테마를 변경할 수 있음)를 통해 그림을 네이티브 draw.io 객체로 구축합니다. 픽셀을 추적하거나 텍스트를 래스터화하지 마십시오. 모든 호출 및 규칙에 대한 자세한 내용은 REFERENCE.md를 참조하십시오. 복사할 패턴: EXAMPLES.md.

도구 실행

모든 코드는 하나의 파일로 제공됩니다. 아래 T는 python drawio_toolkit.py를 의미합니다:

T <tool> [args]        # 예: T lint_drawio fig.drawio --theme theme.yaml   (모든 도구: --help)
T unpack ./tidyfigs        # 선택 사항: 일반 폴더 scripts/ assets/ examples/; 그런 다음 python scripts/<tool>.py

Python에서: import drawio_toolkit; drawio_toolkit.setup() → from drawio_kit import Diagram, from figlib import *, from drawio_doc import Doc. 생성된 빌드 스크립트는 라이브러리를 자동으로 찾습니다.

코드 실행이 불가능합니까? 동일한 방법을 따르십시오: 빌드 스크립트(또는 작은 그림의 경우 draw.io XML 직접 작성 — REFERENCE §14)를 사용자가 실행할 수 있도록 작성하고, 직접 보는 대신 미리보기/린트 출력 또는 스크린샷을 요청하십시오.

모드 선택

입력모드출력
래스터 이미지를 재현A 이미지<img>.drawio + <img>#drawio.png (300 dpi) 이미지 옆
산문 / 논문 섹션 / 방정식B 텍스트3개의 프로토타입 → 사용자 선택 → <name>.drawio
기존 .drawio 파일을 출판 가능하게 만들기C 향상<name>#ENHANCED.drawio + PDF/SVG/PNG 내보내기

A 또는 B 다음에 C가 자주 수행됩니다. 요청이 명확하게 모호한 경우에만 모드를 물어보십시오.

공통 규칙 (모든 모드)

  • 테마 역할만 사용. 색상, 폰트, 크기, 선 두께, 투명도는 YAML/TOML/JSON 테마에서 가져옵니다 (fill="primary", size="body", sw="thick", fill_opacity="tint"). 틴트 = 기존 역할 + 투명도 역할이며, 새로운 16진수 색상이 아닙니다. 새 색상이 필요한가요? 의미론적 역할(highlight, chunk_b)을 추가하고 사용자에게 알리십시오. 린트는 모든 테마 외 값을 보고하며, 최종 결과에는 없어야 합니다.
  • 의도에 따라 정규화: 동일한 수준의 요소는 동일한 크기, 행/열은 하나의 간격(row, row_widths, fit_row, column, grid_boxes), 공유 가장자리는 하나의 좌표; 레이블이 지정하는 대상의 중앙에 정렬(x + w/2). ±1 픽셀 노이즈는 무시하십시오.
  • 연결선 연결 src/tgt (+ exit/entry 분수)를 사용하여 선이 모양에 닿을 때마다 연결; pts는 draw.io가 계산할 수 없는 것(자유 시작점, 중간점, 자유 끝점)만 나열합니다. 자유 점은 구분선, 플롯 축, 연결되지 않은 벡터에만 사용합니다.
  • 곡선 가장자리 (route="curved", flex_arrow, cycle): 중간점은 제어점입니다; 곡선은 연속된 중간점 사이의 중간점을 통과합니다.
  • Z-순서 = 생성 순서(나중에 생성된 것이 위에): 캔버스 → 패널 → 채우기 → 모양 → 연결선 → 텍스트 → 주석. 함께 움직이는 요소는 그룹화하십시오 (with d.group("tile")).
  • 안정적인 ID 중요한 정점에 대해(가장자리에 필요, 읽기 쉬운 린트).
  • 텍스트 마크업: **bold** *italic* __underline__ {role|colored} \n \*; 인라인 LaTeX \( … \); 표시 수학은 d.equation(r"...")(네이티브 MathJax, 편집 가능)를 통해. raw=True는 HTML을 전달합니다.
  • 보면서 확인: 빌드할 때마다 이미지 도구로 PNG 미리보기를 확인하십시오; 숫자(린트, 점수, 감사)는 안내하고, 시각적 검사가 결정합니다. 미리보기는 draw.io를 근사합니다: 이모지는 회색 사각형, 원통/문서는 사각형, 작은 대문자는 없음, 수학은 mathtext를 통해.
  • 작업 공간 위생: 스크래치 스크립트, 프로브 및 크롭은 <workdir>/scratch/에 넣고, 사용자 파일 옆에 두지 마십시오.
  • 학술 기본값: 흰색 배경, 그림 내 제목 없음(대신 캡션 초안 작성), ≤ 3가지 색조 + 틴트, 색상이 유일한 인코딩이 아님, 하나의 글꼴 패밀리, ≤ 6-7 크기 역할, ≤ ~25 텍스트 항목.

모드 A — 이미지 → 편집 가능한 draw.io

방법: 측정 → 계획 → 테마 → 빌드 스크립트 → 렌더링 → 비교 → 수정, 미리보기가 레이아웃에서 원본과 일치할 때까지 반복합니다. 좌표는 실제 그리드에서 측정된 소스 이미지 픽셀입니다(크기 조정된 보기를 눈대중으로 맞추는 것이 잘못된 변환의 가장 큰 원인입니다).

A0 분류 (노력 설정; EXAMPLES.md에서 가장 가까운 예제를 먼저 읽으십시오):

단계모양주요 기술반복 횟수최종 점수
1 단순상자, 레이블, 직선/꺾은선 화살표, 1-3 패널rect, text, 연결된 edge, row2-3≥ 0.88
2 그리드/대시보드아이콘이 있는 타일, 열, 미니 흐름, 글머리 기호panel, 그룹, fit_row/grid_boxes, icon, 직각 가장자리3-5≥ 0.88
3 플롯/기하축, 벡터, 점, 원, 물결 화살표, 회전된 레이블dot, circle, 앵커, flex_arrow, 곡선 가장자리, rotation3-6≥ 0.85
4 복잡3D 표면, 메시, 사진, 밀집 산점도, 설명선surface_mesh, polygon, image_crop, scatter_*, callout, Z-레이어링5-10≥ 0.78

A1 스캐폴드 + 검사: T new_build images/fig.png [--theme user.yaml] [--scale 1] 명령어는 images/fig_drawio_work/ 디렉토리(build.py, theme.yaml, NOTES.md, inspect/, iterations/, scratch/, history.json; 유지)를 생성합니다. inspect/summary.md를 읽고 보기 source.grid*.png (위치), source.boxes.png/.json (정확한 경계 상자 + 중간 색상 — 직접 사용), source.ocr.png/.json (텍스트 + 글꼴 크기: 너비 맞춤 est_px_if_regular/bold 사용, 보고 선택), source.palette.png (색상 → 가장 가까운 역할, ΔE). 스캐폴드는 build.py에서 감지된 상자를 미리 채웁니다 — 이를 다듬으십시오. 영역 확대: T inspect_image zoom SRC --box x0 y0 x1 y1 --factor 3 --step 10; 얇고/밝은 특징을 수치적으로 프로브 (T inspect_image probe SRC --box … 또는 numpy, REFERENCE §6.1). OCR이 잘못 읽거나 감지기가 접촉하는 모양을 병합할 수 있습니다 — 항상 시각적으로 확인하십시오.

A2 NOTES.md에 계획: Z-순서로 영역별로 인벤토리를 작성하십시오. 요소별로 결정: 네이티브 정점(상자, 패널, 알약, 원, 마름모, 원통) · 네이티브 텍스트(모든 텍스트, 항상) · 연결된 edge (연결) · 자유 edge (축, 구분선) · flex_arrow (넓음/물결) · 그룹의 dot (산점도 ≤ ~400) · polygon/svg_layer/surface_mesh (블롭, 빔, 메시, 3-D) · image_crop (사진, 텍스처, 로고만 — 위에 네이티브 레이블 재구축) · 라이브러리 모양 또는 이모지 icon (아이콘; 어떤 것인지 말하십시오). 보고서를 위해 모든 비네이티브 결정을 기록하십시오.

A3 테마: 사용자 색상/폰트 → 역할, 각 소스 색상을 가장 가까운 역할에 매핑; 그렇지 않으면 소스의 주요 색상을 ≤ 6-8 역할로 중복 제거. OCR 크기를 ≤ 6-7 크기 역할로 클러스터링(동일한 시각적 수준 ⇒ 동일한 역할). 가장 가까운 웹 안전 패밀리(Helvetica/Arial; LaTeX 스타일 세리프의 경우 Times New Roman); Roboto/Inter의 경우 google: true. 확대하여 선 두께를 측정하십시오.

A4 build.py 작성 (Diagram.from_source는 미리 연결되어 있음; 전체 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))                     # 자유 시작점, 연결된 끝점
d.text("Dimension 2", 365, 144, size="small", rotation=-90)
d.image_crop((49, 199, 143, 309), border="text")                   # 원본에서 복사한 사진

무작위화된 콘텐츠(산점도)는 고정된 seed와 레이블 주변의 유지 금지 사각형을 사용합니다. > ~600 정점 → 장식적인 마크를 하나의 svg_layer로 병합합니다. 작은 소스 → --scale 2로 텍스트가 10px 이상이 되도록 합니다.

A5 반복: T iterate images/fig_drawio_work --note "변경 사항" = 빌드 → 렌더링 → 비교 → 린트 → 스냅샷 + 기록. iter_NN_side.png (모든 것: 문구, 크기, 두께, 줄바꿈), iter_NN_edges.png (빨간색 = 소스만, 청록색 = 미리보기만; 쌍이 병합될 때까지 이동), iter_NN_heat.png + 최악의 셀 (다음에 확대). 패스로 작업: (1) 캔버스, 패널, 그리드 → (2) 감지된 경계 상자에 스냅되고 정규화된 모양 → (3) 모든 연결선을 포트로 연결 → (4) 폰트 역할, 두께, 가운데 정렬, valign → (5) 가장자리 차이 다듬기. 반복당 몇 가지 관련 항목을 변경하십시오; 점수가 떨어지면 되돌리십시오. 중지 조건: 모든 인벤토리 요소가 존재하고(원본을 영역별로 다시 읽음), 린트 오류 0개, 오버플로/겹침/테마 외 경고 없음, 나란히 보기에서 잘못된 배치나 잘못된 텍스트가 없음, 점수가 정체됨(2회 반복 동안 < 0.005 증가). draw.io CLI가 있는 경우: 최종 한 번 T render_preview OUT --engine drawio.

A6 최종화: images/fig.drawio는 최신 빌드입니다; 내보내기 T render_preview images/fig.drawio -o "images/fig#drawio.png" --dpi 300. 이미지 폴더에는 소스, .drawio, #drawio.png만 포함됩니다(+ 작업 디렉토리). 보고서: 경로; 네이티브 vs 포함(사진, SVG 레이어, 이모지 플레이스홀더); 사용된/추가된 역할; 알려진 편차; 유지된 소스 오타; 다시 테마를 변경하는 방법(theme.yaml 편집 → python build.py) 및 크기 조정.


모드 B — 텍스트 → 세 가지 편집 가능한 그림 프로토타입

구절을 읽고, 그 주장을 인벤토리화하고, 세 가지 다른 그림 계열을 구축하고, 확인하고, 나란히 비교 시트를 제공하십시오; 사용자가 선택하면 최종화합니다.

출력 위치: 파일 drafts/methods.md → drafts/methods_figures/; 붙여넣은 텍스트 → ./figures/<slug>/; 여러 섹션/긴 입력 → 구절당 하나의 하위 폴더 p1_<slug>/ …; 사용자가 이름을 지정한 폴더 → 정확히 그 위치 (--out-dir). 사용자에게 경로를 알리십시오. 모든 구절이 하나의 테마를 공유합니다 (--theme 또는 출력 루트에서 theme.yaml 편집).

B1 스캐폴드 + 분석: T new_figures drafts/methods.md [--theme t.yaml] [--split|--whole] [--passages 1,3] 또는 T new_figures --text "<passage>" --name rag_pipeline. 구절당 출력: 단어 수, 방정식, 구조 신호, 제안된 세 가지 계열. 제목이 없는 350단어 이하 = 하나의 구절. 그림에 적합한 구조가 없음(순수 서사)? 그림을 강요하는 대신 그렇게 말하십시오.

B2 인벤토리 (NOTES.md): 엔티티, 정렬된 단계(동사 포함), 관계(방향 + 동사), 수량(단위 포함), 한정사, 결론 — 각각 짧은 인용문과 함께. 계열을 확인하십시오 (REFERENCE §7): 기본값 = 지배적인 구조의 세 가지 레이아웃 (상세 / 간결한 개요 / 대안적 관점); 강력한 두 번째 구조 → 2개 + 1개; 방정식 → 방정식 삼중창(우연이 아닌 경우). 세 가지는 토폴로지(레인 / 스택 / 방사형 / 행렬 / 차트 / 플레이트)에서 달라야 하며, 스타일링이 아닙니다. 수학, 과학, 알고리즘 구절의 경우 정적 글머리 기호 카드보다는 능동적인 데모(채워진 행렬 계산, 연속 좌표/메트릭 공간, 베이지안 플레이트, 인과 DAG)를 선호합니다.

B3 build.py 작성 — 세 개의 빌더, 각각 고유한 캔버스 크기의 새 Diagram을 얻습니다:

from figlib import *
INFERRED = ["v1: 서수 평가는 구절의 정성적 표현을 해석합니다"]   # 사용자에게 보고됨
ALLOWED_TERMS = ["layer"]                # 구조적 단어, 주장이 아님
LINT_IGNORE = []                         # 의도적으로 허용된 경고 (부분 문자열)
def v1(d):                               # 수영 레인 파이프라인
    lane(d, 20, 20, 1060, 175, "오프라인 인덱싱")
    chain(d, ["검사 보고서\n(스캔)", "OCR\nto 텍스트", "의미론적\n청킹"], 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="시트용 한 줄", caption="구절의 단어로 된 초안 캡션."), ...]

규칙: 테마 역할만 사용, 동일한 범주 = 세 가지 모두에서 동일한 스타일; 동일한 수준의 요소는 동일한 크기와 하나의 간격(도우미 사용, 수동 조정 숫자 금지); 연결선 연결, 피드백은 점선/보조; ≤ ~25 텍스트 항목, < ~150 정점(그렇지 않으면 두 개의 그림으로 분할); 그림 내 제목 없음 — caption 작성; 레이블은 구절의 표현으로 작성(삭제로 단축, 동의어 사용 금지; 한정사, 숫자, 단위, 약어는 그대로 유지). 해석적 장치(평가, 프런티어, "최적 적합", 축 순서, 텍스트에 없는 수학 사실)는 INFERRED에 나열된 경우에만 사용합니다.

B4 프로토타입, 검사, 수정 (≥ 2회): T prototype <passage dir> [--only v2] --note "…" 명령어는 세 가지를 모두 빌드하고, 렌더링하고, 린트하고, 충실도 검사를 실행하고, prototypes.png/.md를 작성하고, err/warn/miss를 기록합니다. 각 PNG와 시트를 보십시오. 모든 린트 경고를 수정하거나 의도적인 LINT_IGNORE를 추가하십시오; 각 NOT-IN-PASSAGE 단어를 해결하십시오(구절의 용어로 다시 표현 · 구조적이면 ALLOWED_TERMS · 해석이면 INFERRED). 린트가 감지할 수 없는 것을 확인하십시오: 레이블을 가로지르는 화살표, 비좁은 코너, 약한 계층, 불균형한 여백, 두 개의 프로토타입이 너무 유사함, 인벤토리와 비교한 각 화살표의 방향. 0/0/0(또는 허용된 경고)에서 완료하고 전체 크기에서 깨끗한지 확인하십시오.

B5 제시: prototypes.png를 보여주십시오; 프로토타입당 한 줄로 강조점, 초안 캡션, INFERRED 항목을 설명하십시오; 소스의 특이점(오타, 일관되지 않은 이름)을 조용히 수정하지 말고 지적하십시오. 사용자에게 선택(또는 변경 요청 / 조합 → build.py 편집, 재실행)을 요청하십시오.

B6 최종화: T finalize <passage dir> --pick v2 [--name rag_pipeline] [--clean] → <name>.drawio (+ .png) 및 CHOSEN.md (캡션, 추론). --clean은 다른 프로토타입을 삭제하지만 _work/는 유지합니다. 대상 학술지별 다듬기를 위해 모드 C를 제안하십시오.


모드 C — .drawio 파일을 출판용으로 향상

하나의 신중한 패스: 그림의 역할 이해 → 인쇄 크기에서 측정 → 그 역할을 수행하도록 변경 → 확인 → 내보내기. 인터뷰 전에는 절대 편집하지 마십시오.

C1 시작: T start_enhance path/FIG.drawio [--source-image] [--text] [--artifacts DIR] [--theme]. 컨텍스트를 발견합니다(모드-A 작업 디렉토리: 소스 이미지, build.py, 테마, NOTES; 모드-B 구절 폴더: passage.md, build.py VARIANTS, CHOSEN.md, 캡션, INFERRED), 생성 후 수동 편집을 감지하고, 경로를 권장하고, "이전"을 감사하고, <stem>_enhance_work/ (context.md, before_audit.md, brief.yaml, questions.md, theme.yaml, build_enhanced.py, 아마도 새로운 build.py 및 build_original.py)를 작성하고, 질문을 합니다.

... (이후 내용은 번역되지 않았지만 동일한 방식으로 번역될 수 있음) ...


이 기술은 원본 문서의 구조와 규칙을 유지하며 번역되었습니다.

관련 스킬