ppt — 코드로 전문 PPT 생성
코드로 PPT 그리기, 템플릿 끌어쓰기 없음: 재실행 가능(데이터 수정 후 스크립트 재실행), git 관리 가능, 좌표 0.01인치 정밀도; WYSIWYG 없음, Step 4 렌더링 검증으로 보완.
Step 1 · 취재 및 카피라이트 (허위 금지)
먼저 청중 3문에 답한 후 작성: 누가 볼 것인가(비전문가 / 전문가 / 고객)? 청중이 프로젝트에 대해 이미 알고 있는 것은? 보고 나서 무엇을 세 가지 말할 수 있어야 하는가? 답변을 카피라이트 헤더에 작성하고, 이후 모든 선택은 이를 기준으로 결정.
자료는 프로젝트 실제 자료(README / CLAUDE.md / docs / 데이터 백엔드, 유형별로 소스 선택)만 사용. 출처 없는 숫자는 PPT에 넣지 않음; 청중이 알 필요 없는 사실은 본문에 포함하지 않음 — 내부 지표(함수 개수, API 상수, 내부 코드명)는 기본적으로 제외, 청중이 전문가인 경우에만 유지.
내용 발굴, 명사 나열 금지: 숫자와 기능명만 수집하는 것은 취재가 아님. PPT 유형에 따라 발굴: 기술/제품: 설계 결정 + 효과 비교; 포트폴리오: 작품 세부 사항과 선택 이유; 데이터 보고서: 기준선과 측정 기준; 내러티브 브랜드: 인물, 장면, 반전.
개요가 페이지별 작업보다 우선: 취재 후 먼저 내러티브 개요 작성 — 하나의 주요 스토리라인(전체 PPT가 단 한 가지 주장만 논증) + 도입 3답(무엇인가 / 누구를 위한 것인가 / 무엇을 해결하는가) + 각 페이지가 논증 체인에서 차지하는 역할(이전 페이지에서 무엇을 이어받고, 다음 페이지를 위해 무엇을 준비하는가). 개념은 설명 후 사용, 순방향 참조 금지; 연속 두 페이지가 서로 이어지지 않으면 재배치. 페이지별 카피라이트(제목 + 핵심 포인트 + 구술 대본; 구술 대본 생성 시 notes() 발표자 노트에 입력, 최종 영상 작업의 카피라이트 소스이자 현장 발표 스크립트로 사용)를 개요 아래에 작성, 제목은 점진적인 논증에 참여해야 하며 각각 독립된 슬로건이 되어서는 안 됨.
두 번에 걸쳐 완성: 첫 번째는 충분히 씀 — 완전한 서술체, 청중이 기본 지식이 없다고 가정하고, 무엇인지, 누구를 위한 것인지, 무엇을 해결하는지 충분히 설명, 긴 것 허용; 두 번째에서야 다듬기 — 먼저 humanizer로 불필요한 부분 제거, 그런 다음 아래 네 가지 규칙에 따라 정리. humanizer는 다듬는 도구이지 초안 템플릿이 아님, 초안부터 humanizer 기준에 맞추면 내용이 얇고 건너뛰기만 하며, 제대로 설명하지 않고 슬로건을 외치게 됨.
- 빈 껍데기 금지: 핵심 포인트에 세부 사항 포함(기능에는 설계 이유나 효과 포함, 데이터에는 측정 기준 포함), 나열된 명사만 있는 경우 제거
- 숫자에 문맥 포함: 값 + 측정 기준 + 구성 또는 비교, 그리고 청중이 관심 있는 숫자여야 함; 문맥을 찾을 수 없는 숫자는 주요 시각 자료로 사용하지 않음
- 각 페이지에 추적 가능한 구체적 사실 3건 이상; 레이아웃을 가리고 텍스트만 읽었을 때, '나열'이 아닌 '설명'이어야 함
- 슬롯 규칙: 큰 글자 슬롯(표지 메인 제목 / 마지막 페이지 큰 글자 / 장 제목)에는 주장문이나 정체성 문장만 배치(관점이 있고, 소리내어 읽었을 때 슬로건처럼 들림); 도메인명, 버전 번호, 날짜, 통계 숫자는 모두 부제 / 메타 정보 위치로 이동
스타일 전문 용어 무관용, 두 계층으로 구분: 비즈니스 상투어(시너지 / 선순환 / 축적 / 매트릭스 / 에코시스템 / 올인원 / 엔드투엔드)는 직접 삭제; 기술 전문 용어(API 상수 / 내부 함수명 / 시스템 코드명 / 구현 세부 사항)는 청중에 따라 필터링, 비전문가용 PPT는 삭제하거나 해당 페이지에서 쉬운 말로 설명. 숫자가 형용사보다 우선; 제목은 관점을 쓰고 명사구를 쓰지 않음; 대시(한국어/중국어) 이중 금지. 중요한 프로젝트의 카피라이트는 먼저 사용자에게 보여주고 승인받은 후 레이아웃 진행.
Step 2 · 디자인 시스템 (코드 작성 전 확정, 과정 중 변경 금지)
| 차원 | 규칙 |
|---|---|
| 색상 팔레트 | 프로젝트 디자인 언어에서 추출(README 시각 섹션 / 사이트 메인 컬러 / 브랜드 VI); 없으면 use_theme('warm' / 'tech' / 'forest'). 7+1 폐쇄 시스템(7개 역할 + 종이 흰색), 중간에 색상 추가 금지; 작은 글자 대비 배경 대비 ≥4.5:1 |
| 그리드 | 16:9(13.333 × 7.5 in) · 여백 0.55 · 페이지 번호 (12.35, 7.02) · 상단 coral 짧은 막대 + 장 레이블 |
| 글자 크기 | 54 표지 / 40 큰 숫자 / 30 페이지 제목 / 19 카드 제목 / 13 본문 / 11 부차적 / 9 주석, 중간 값 사용 금지 |
| 글꼴 | 한글은 Microsoft YaHei; 코드 / 도메인명 / 숫자 / 버전 번호는 모두 Consolas |
| 밀도 | 페이지당 하나의 주장; 텍스트가 3줄 초과 시 페이지 분할, 표가 6행 초과 시 행 줄임 |
Step 3 · 생성
pip install python-pptx -i https://pypi.tuna.tsinghua.edu.cn/simple(최초 1회)templates/primitives.py+animate.py를 대상 프로젝트scripts/에 복사하고,gen-<name>-deck.py작성- 좌표는 표현식으로 계산(예:
Inches(0.55 + i * 3.13)), 매직 넘버 사용 금지; 텍스트를 넣기 전에check_fit()사전 검사,[FIT-WARN]발생 시 행 분할 / 페이지 분할
애니메이션 (선택 사항; Windows + MS Office + pywin32). 기본적으로 auto_deck()이 전부 대신 처리(표지 캐스케이드 / 카드 float_up / 숫자 zoom / 링크 wipe / 표 행 0.06s 빠른 캐스케이드 / 장 번호 wipe up), 수동은 미세 조정만:
anim = Anim(prs)
anim.auto_deck() # 전체 PPT 자동 편성
anim.fx(footer, 'fade', dur=0.4) # 특수 요소 한 번 더
anim.chart(gf, 'series') # 원시 차트를 시리즈별로 wipe
P.set_transition(prs, 'fade') # 통합 전환 효과(morph 페이지 자동 건너뜀)
P.auto_show(prs) # 구술 대본 추정 시간으로 자동 페이지 전환: 전체 PPT 자동 재생, 녹화 시 거친 영상
prs.save('deck.pptx')
anim.apply('deck.pptx') # save 후에만 실행; COM 쓰기 + 읽어오기 자체 검증
# 미세 조정: anim.stagger(P.shape_groups(s, 'card'), 'float_up', step=0.12)
# 성장 내러티브(morph 진정한 보간, 연속 두 페이지 차지, auto 자동 건너뜀; 적용 확인 EntryEffect==3954; 2019+, WPS는 fade로 다운그레이드):
P.growth_chart(prs, 6, 'Growth', '제목', cats, vals, highlight=2) # 막대
P.growth_line(prs, 8, 'Trend', '제목', cats, vals, highlight=5) # 꺾은선
P.growth_donut(prs, 10, 'Mix', '제목', cats, vals) # 비율 링
효과 단어 목록(COM 실제 측정): fade / wipe / appear / float_up / float_down / zoom / grow_turn / ease_in / split / wheel / stretch; 90년대 유행 효과는 수용하지 않음. 리듬이 화려함보다 우선: 지속 시간 0.40.6초, 캐스케이드 간격 0.10.2초, 페이지당 ≤2가지 효과, 페이지 고정 장식 요소(상단 짧은 막대 / 페이지 번호 / 하단선)는 애니메이션에서 제외; 데이터 차트는 모두 growth_*, 원시 chart는 전달 후 PowerPoint에서 데이터를 수정해야 할 때만 사용.
기존 pptx 수정(스크립트로 수정, 수동 편집 금지, 새 파일명으로 저장): P.deck_replace(prs, {'이전 이름': '새 이름'}) 전체 텍스트 대체(발표자 노트 포함); P.deck_recolor(prs, dict(zip(P.THEMES['warm'].values(), P.THEMES['tech'].values()))) 전체 PPT 테마 변경.
페이지 템플릿(딕셔너리이지 체크리스트가 아님: Step 1 내러티브 개요에 따라 템플릿 선택, 템플릿을 맞추기 위해 내용을 만들지 않음; 같은 템플릿 반복 사용해도 무방, 한 PPT에 9가지 템플릿을 각각 한 번씩 사용하는 것은 능력 전시일 뿐 내러티브가 아님; 밀도는 Step 1이 채워주며, 템플릿 자체에 의존하지 않음):
| 템플릿 | 함수 | 용도 |
|---|---|---|
| 표지 | slide_cover | 오프닝: 큰 제목 54 + 오른쪽 세로 색상 블록 |
| 장 페이지 | slide_section | 12페이지 이상 긴 자료 내비게이션, 매거진 스타일(프레임 라인 + 암호 일련 번호 + 항목) |
| 타임라인 | slide_timeline | 진화 / 로드맵, hi 강조 현재 위치 |
| 비교 페이지 | slide_versus | A/B, 전후 비교, 중앙 VS 원형 레이블 |
| 명언 페이지 | slide_quote | 한 페이지를 할 가치가 있는 한 문장(12페이지 이상 PPT) |
| 카드 배열 | slide_cards | 병렬 기능 / 모듈, 자동 줄 바꿈 |
| 숫자 벽 | slide_numbers | 동등 가중치 지표 한눈에 |
| 미디어 페이지 | slide_media | 스크린샷 + 핵심 포인트; sidebar= 큰 그림 60% + 원형 강조 + 각주 |
| 밀도 높은 구역 | slide_dense | 한 페이지로 하위 시스템 설명: 주 영역 60% + 측면 영역 그룹화 목록 |
| 표 | slide_table | API / 모델 / 목록 대조, 6~9행, 열 너비 계층 |
| 체인 다이어그램 | slide_chain | 아키텍처 흐름, hi 반전 색상 강조 + subs 카드 |
| 이중 컬럼 목록 | slide_rows | 기술 스택 / 구성 |
| 성장 차트 | growth_chart / line / donut | 데이터 성장 morph 진정한 보간 |
| 원시 차트 | bar / line / donut_chart | 전달 후 PowerPoint에서 데이터를 수정해야 할 때 사용 |
| 마지막 페이지 | slide_closing | 연락처 정보; slogan= 사용자 지정 큰 글자(주장문) |
Step 4 · 렌더링 검증 (필수, 생략 불가)
3단계 파이프라인, 자동화 우선, 수동은 최종 검토만:
① 프로그램 초기 검사: Office COM으로 PDF 변환(Presentations.Open 후 SaveAs("<출력>.pdf", 32)) → python <본 skill>/templates/verify.py <출력>.pdf. 페이지 오버플로, 플레이스홀더, 대비 WCAG 검사(≥72pt 장식 큰 글자 면제); 종료 코드 1 = 문제 있음, 스크립트 수정 후 재실행.
② 시각 블라인드 검사: pymupdf로 PNG 렌더링(fitz + get_pixmap(dpi=100)) → 생성 컨텍스트 없는 서브 에이전트에 전달하여 두 가지 질문: 첫째, 페이지별로 네 가지 항목 검사(오버플로 / 깨짐 / 정렬 / 대비); 둘째, 청중 복기 테스트 — 처음 1/3 페이지만 제공하고 '이것이 무엇인가, 누구를 위한 것인가, 무엇을 해결하는가' 질문, 답하지 못하면 Step 1 청중 설정 또는 도입부가 잘못된 것이므로 카피라이트를 다시 작성하고 생성 재실행. 블라인드 검사 안내에서는 사전 면제를 설정하지 않음('의도적임'이라고 말하지 않음): 페이지 가장자리로 잘린 요소, 지나치게 크고 대비가 낮은 장식 글자 등 의심스러운 형태도 신선한 시선으로 이상 징후로 보고해야 함. 문제 발견 시 스크립트 수정 후 재실행, pptx 수동 편집 금지.
시각 검사는 실제 이미지의 절대 경로를 사용하고, 현재 버전 또는 해시를 재확인; 특정 도구의 경로 제한이 발생할 때만 호환 경로를 선택하고, 디렉터리 복사를 고정적으로 요구하지 않음.
③ 사용자 최종 검토: 앞 두 단계에서 기계적 문제 제거 후, 사용자는 완성된 결과물만 검토.
Step 5 · 전달
보고: 페이지 수 + 페이지 목록 / 파일 경로 및 크기 / 3단계 검증 결과 / 구술 대본 페이지 수 / 자동 재생 총 시간 / 생성 스크립트 위치(재실행 가능). git 저장소 내에 스크립트 제출(pptx 결과물은 git에 포함하지 않음).
경계 및 함정
- MS Office 없음 → Step 4에서 LibreOffice
soffice --convert-to pdf로 다운그레이드; 둘 다 없음 → 명확히 '시각 검사 수행 불가' 보고 - GBK 콘솔: print에서 비ASCII 문자 사용 금지,
OK사용 - pptx 원시 표 열 너비 제어 불가 → 항상 직접 그린 표 행 사용(box + text로 행별 조립)
- 한글 글리프 누락 → run 수준에서 Microsoft YaHei 설정(primitives에서 이미 처리)
- shape_id는 페이지별로 독립적으로 번호가 매겨져 유일하지 않음, animate.py는 XML 트리로 위치를 찾으므로, 2차 개발 시 전역 ID 검색 금지; pywin32:
pip install pywin32 -i https://pypi.tuna.tsinghua.edu.cn/simple - docx / xlsx는 primitives 개념을 재사용할 수 있지만, 페이지 템플릿 표는 pptx에만 적용
현재 워크플로우 및 아카이브
content-director가 청중, 자료 출처 및 내러티브 초안을 담당하고, PPT는 편집 가능한 슬라이드를 전달 목표로 유지. 디자인 확인 후 생성; 동영상 스틸 프레임 규칙은 PPT에 적용되지 않음. 생성 스크립트, 입력 데이터, 필요한 자료 및 해시를 recipe와 함께 보관, 전달 목록에는 PPT/PDF/표지를 명시; 아카이브 복원 검증 전에 정리하지 않음. 시각 검사와 사용자 최종 검토는 각각 보고.
Copyright (c) 2024 TimeCraker. 이 스킬은 AI 에이전트(Claude Code, Cursor, Codex 등)에서 사용하도록 설계되었습니다.