LectureBuilder — PPTX 템플릿 설계 (슬라이드 마스터)
목적
Skills API (
skill_id: "pptx")가 사용할 PPTX 템플릿 파일의 설계 명세. 이 문서를 기반으로 python-pptx로 베이스 템플릿 2개를 생성한 뒤, Skills API에 전달해 TCELS 유형별 슬라이드를 자동 채운다.
1. 슬라이드 규격
| 항목 | 값 |
|---|---|
| 비율 | 16:9 |
| 해상도 | 1280 × 720 px (96 DPI) |
| 기본 언어 | 한국어 (ko-KR) |
| 파일 포맷 | .pptx (PowerPoint Open XML) |
| 슬라이드 마스터 | 테마별 1개 마스터 + TCELS 5종 레이아웃 |
2. 테마 A — 데이터분석 (파랑)
컬러 시스템
| 역할 | 이름 | HEX | 용도 |
|---|---|---|---|
| Primary | Navy | #1E3A6E | 헤더 바, Title 슬라이드 배경, 강조 테두리 |
| Secondary | Blue | #2E86C1 | 섹션 헤더, 아이콘 색상 |
| Accent | Amber | #F39C12 | 핵심 키워드 하이라이트, Lab 슬라이드 아이콘 |
| Background | Cloud | #F5F8FF | 일반 슬라이드 배경 |
| Surface | White | #FFFFFF | 콘텐츠 카드 배경 |
| Text-Primary | Dark Navy | #1A1A2E | 본문 주요 텍스트 |
| Text-Secondary | Gray | #4A5568 | 캡션, 보조 설명 |
| Code-BG | Ice | #EBF5FB | 코드 블록 배경 |
| Success | Teal | #1ABC9C | 체크리스트 완료 아이콘 |
폰트
| 용도 | 폰트 | 크기 | 굵기 |
|---|---|---|---|
| 슬라이드 대제목 | Pretendard | 40pt | Bold |
| 섹션 제목 | Pretendard | 28pt | SemiBold |
| 본문 | Pretendard | 18pt | Regular |
| 강조 | Pretendard | 18pt | Bold |
| 캡션·주석 | Pretendard | 13pt | Regular |
| 코드 | D2Coding | 16pt | Regular |
| Fallback | 나눔고딕 | (동일) |
3. 테마 B — 생성형 AI (보라)
컬러 시스템
| 역할 | 이름 | HEX | 용도 |
|---|---|---|---|
| Primary | Deep Purple | #4A0E8F | 헤더 바, Title 슬라이드 배경 |
| Secondary | Violet | #7B2FBE | 섹션 헤더, 아이콘 색상 |
| Accent | Magenta | #E91E8C | 핵심 키워드 하이라이트, Lab 슬라이드 아이콘 |
| Background | Lavender | #FAF8FF | 일반 슬라이드 배경 |
| Surface | White | #FFFFFF | 콘텐츠 카드 배경 |
| Text-Primary | Dark Indigo | #1A0A2E | 본문 주요 텍스트 |
| Text-Secondary | Slate | #553C7B | 캡션, 보조 설명 |
| Code-BG | Soft Purple | #F3E8FF | 코드 블록 배경 |
| Success | Emerald | #10B981 | 체크리스트 완료 아이콘 |
폰트
테마 A와 동일 (Pretendard + D2Coding + fallback 나눔고딕)
4. 공통 레이아웃 구조 (1280×720)
┌─────────────────────────────────────────────┐
│ [Header Bar] 40px — Primary색, 모듈명 + ObjID │
├─────────────────────────────────────────────┤
│ │
│ [Content Area] 580px │
│ (슬라이드 유형별 레이아웃) │
│ │
├─────────────────────────────────────────────┤
│ [Footer] 40px — Text-Secondary, 슬라이드 번호 │
└─────────────────────────────────────────────┘
| 영역 | Y 위치 | 높이 | 내용 |
|---|---|---|---|
| Header Bar | 0px | 40px | 왼쪽: 모듈명·Objective ID / 오른쪽: 테마 로고 |
| Content Area | 40px | 620px | TCELS 유형별 다름 |
| Footer | 680px | 40px | 왼쪽: 과목명 / 오른쪽: n/N |
5. TCELS 유형별 슬라이드 레이아웃
T (Title) — 학습목표 선언
배경: Primary 색상 Full-bleed (어두운 단색)
┌─────────────────────────────────────────────┐
│ [Objective Badge] Accent색 둥근 태그 │ 80px
│ e.g. "Objective 1-1" │
├─────────────────────────────────────────────┤
│ │
│ [슬라이드 대제목] 40pt Bold, 흰색 │ 180px
│ "Python 타입 힌트 이해 및 적용" │
│ │
├─────────────────────────────────────────────┤
│ [학습목표 박스] 반투명 흰색 카드 │ 200px
│ "이 강의를 마치면:" │
│ ✓ Python 3.7+ 타입 힌트를 적용하여 │
│ AI-native 코드를 작성할 수 있다. │
├─────────────────────────────────────────────┤
│ [메타 정보] 작게, 흰색 50% 투명도 │ 100px
│ 난이도: 중급 | 슬라이드: 8장 | 실습: 3시간 │
└─────────────────────────────────────────────┘
C (Concept) — 핵심 이론 설명
레이아웃 2가지 선택 (콘텐츠에 따라):
C-Full (텍스트 중심):
┌─────────────────────────────────────────────┐
│ Header Bar (슬라이드 제목, Secondary색) │ 60px
├─────────────────────────────────────────────┤
│ │
│ [본문 영역] 전체 너비 │ 500px
│ • 항목1 (18pt) │
│ • 항목2 │
│ • 항목3 │
│ │
│ [코드 or 박스 강조] Code-BG 배경 카드 │ (선택)
│ │
└─────────────────────────────────────────────┘
C-Split (텍스트 + 다이어그램):
┌────────────────────┬────────────────────────┐
│ Header Bar (전체 너비) │ 60px
├────────────────────┼────────────────────────┤
│ [왼쪽: 본문] 55% │ [오른쪽: 이미지/다이어그램] 45% │
│ • 개념 설명 │ Mermaid 다이어그램 │ 500px
│ • 핵심 포인트 │ 또는 비교표 │
│ │ 또는 스크린샷 │
└────────────────────┴────────────────────────┘
E (Example) — 코드·사례 예제
┌─────────────────────────────────────────────┐
│ Header Bar (Accent색 테두리 + "예제" 뱃지) │ 60px
├─────────────────────────────────────────────┤
│ [코드 블록] Code-BG 배경, D2Coding 16pt │ 360px
│ ┌─────────────────────────────────────────┐ │
│ │ def process(data: list[int]) -> float: │ │
│ │ ... │ │
│ └─────────────────────────────────────────┘ │
├─────────────────────────────────────────────┤
│ [설명 영역] 핵심 포인트 2-3개 (18pt) │ 160px
│ ① 타입 힌트로 list[int] 명시 │
│ ② 반환 타입 float 선언 │
└─────────────────────────────────────────────┘
L (Lab) — 실습 지시
배경: Background + 왼쪽 Accent색 세로 줄 (8px)
┌─────────────────────────────────────────────┐
│ 🔬 [실습 제목] Accent색 아이콘 + 굵은 제목 │ 80px
├──────────────────────┬──────────────────────┤
│ [단계별 지시] 60% │ [실습 정보] 40% │ 460px
│ Step 1. ... (20분) │ 난이도: 중급 │
│ Step 2. ... (30분) │ 시간: 180분 │
│ Step 3. ... (45분) │ 데이터: users.csv │
│ Step 4. ... (45분) │ (1,000행) │
│ │ │
│ │ 예상 결과: │
│ │ • 모든 함수에 타입 명시 │
│ │ • mypy 검증 통과 │
└──────────────────────┴──────────────────────┘
S (Summary) — 핵심 정리
배경: Primary색 10% 투명도 (연한 테마색)
┌─────────────────────────────────────────────┐
│ [섹션 제목] "핵심 정리" Secondary색 굵은 글씨 │ 60px
├────────────────────┬────────────────────────┤
│ [키워드 박스] 50% │ [체크리스트] 50% │ 300px
│ ┌──────────────┐ │ ✅ 타입 힌트 문법 적용 │
│ │ 타입 힌트 │ │ ✅ IDE 자동완성 활용 │
│ │ PEP 484 │ │ ✅ FastAPI 통합 이해 │
│ │ 제네릭 │ │ │
│ │ IDE 지원 │ │ │
│ └──────────────┘ │ │
├─────────────────────────────────────────────┤
│ [다음 연결] "다음 → Objective 1-2: 비동기" │ 80px
│ Accent색 화살표 + Secondary색 텍스트 │
└─────────────────────────────────────────────┘
6. Skills API 연동 Markdown 입력 포맷
Skills API에 전달할 Markdown 구조 (각 슬라이드 --- 구분):
<!-- TEMPLATE: data-analytics -->
<!-- THEME: blue -->
---
<!-- TYPE: T | OBJ: 1-1 | SLIDES: 8 -->
# Python 타입 힌트 이해 및 적용
**Objective 1-1** | 난이도: 중급 | 실습: 3시간
> 이 강의를 마치면: Python 3.7+ 타입 힌트와 제네릭을 활용하여 AI-native 데이터분석 코드를 작성할 수 있다.
---
<!-- TYPE: C | TITLE: Python 타입 시스템 진화 -->
## Python 타입 시스템의 역사
- **Python 2**: 타입 힌트 없음, 런타임 오류 다발
- **PEP 484 (2014)**: `typing` 모듈 도입 — 첫 공식 타입 힌트
- **PEP 526 (2016)**: 변수 어노테이션 (`x: int = 5`)
- **PEP 585 (2019)**: 내장 타입 제네릭 (`list[int]` 대신 `List[int]`)
- **PEP 604 (2020)**: 유니온 단축 (`int | None`)
> 트렌드: 타입 안전성 강화 ↑ — AI-native 코드에서 필수
---
<!-- TYPE: C | TITLE: 기본 타입 문법 | LAYOUT: split -->
## 기본 타입 힌트 문법
- `int`, `str`, `float`, `bool` — 기본 스칼라
- `list[int]`, `dict[str, int]` — 컨테이너 타입
- `Optional[str]` = `str | None` — 선택적 파라미터
- `tuple[int, str, float]` — 고정 길이 튜플
```python
def greet(name: str, age: int) -> str:
return f"안녕하세요, {name}님 ({age}세)"…
---
## 7. python-pptx 베이스 템플릿 생성 코드 (핵심 구조)
```python
from pptx import Presentation
from pptx.util import Pt, Emu
from pptx.dml.color import RGBColor
THEMES = {
"data-analytics": {
"primary": RGBColor(0x1E, 0x3A, 0x6E), # #1E3A6E Navy
"secondary": RGBColor(0x2E, 0x86, 0xC1), # #2E86C1 Blue
"accent": RGBColor(0xF3, 0x9C, 0x12), # #F39C12 Amber
"background": RGBColor(0xF5, 0xF8, 0xFF), # #F5F8FF Cloud
"text": RGBColor(0x1A, 0x1A, 0x2E), # #1A1A2E Dark Navy
"code_bg": RGBColor(0xEB, 0xF5, 0xFB), # #EBF5FB Ice
},
"generative-ai": {
"primary": RGBColor(0x4A, 0x0E, 0x8F), # #4A0E8F Deep Purple
"secondary": RGBColor(0x7B, 0x2F, 0xBE), # #7B2FBE Violet
"accent": RGBColor(0xE9, 0x1E, 0x8C), # #E91E8C Magenta
"background": RGBColor(0xFA, 0xF8, 0xFF), # #FAF8FF Lavender
"text": RGBColor(0x1A, 0x0A, 0x2E), # #1A0A2E Dark Indigo
"code_bg": RGBColor(0xF3, 0xE8, 0xFF), # #F3E8FF Soft Purple
},
}
SLIDE_SIZES = {"width": Emu(9144000), "height": Emu(5143500)} # 16:9
def create_base_template(theme_name: str, output_path: str):
"""TCELS 5종 레이아웃을 가진 베이스 PPTX 템플릿 생성."""
prs = Presentation()
prs.slide_width = SLIDE_SIZES["width"]
prs.slide_height = SLIDE_SIZES["height"]
theme = THEMES[theme_name]
# ... 슬라이드 마스터 & 레이아웃 정의
prs.save(output_path)
8. 파일 산출물 목록
| 파일 | 생성 방법 | 용도 |
|---|---|---|
templates/base-data-analytics.pptx | python-pptx | Skills API 입력 템플릿 (파랑) |
templates/base-generative-ai.pptx | python-pptx | Skills API 입력 템플릿 (보라) |
output/module-N-data-analytics.pptx | Skills API | 모듈별 생성 슬라이드 |
output/module-N-generative-ai.pptx | Skills API | 모듈별 생성 슬라이드 |
final/lecture-slides-data-analytics-180.pptx | python-pptx 병합 | 최종 납품물 |
final/lecture-slides-generative-ai-120.pptx | python-pptx 병합 | 최종 납품물 |
관련 페이지
- lecture-slides-2026 — LectureBuilder 개발 프로젝트 허브
- lecture-builder-slide-mapping — Objective→Slide 수 매핑 규칙 (Task 1)
- lecture-slides-automation-review-2026-04-27 — Skills API GA 확인 + 스택 결정
- instructional-design — ADDIE 기반 수업설계 (레이아웃 구조 근거)