오렌지 계열 제안서
회원 hanwhappt
주황 BI 발주처용입니다. 오렌지 덱에서 본문을 검정으로 두면 차갑게 떠 보이기 때문에 딥브라운을 씁니다.
- 12종 레이아웃 · 강조 그라데이션 4종
- 오렌지·코랄·골드 계조를 차트 계조로 그대로 사용
- 표·도넛 인포그래픽·사진 레이아웃 포함
- HTML 미리보기 생성기 포함
Codex 는 $hanwhappt, Claude Code 와 Antigravity 는 /hanwhappt 로 부릅니다.
그냥 "제안서 만들어줘" 라고 해도 설명문을 보고 알아서 붙습니다.
지시문 전문
아래가 SKILL.md 의 전부입니다. 에이전트가 읽는 것과 같은 글입니다.
hanwhappt — 한화 스타일 제안서
소관 — 먼저 읽는다
이 스킬은 발주처가 지정됐을 때만 붙는다. 룩이 특정 발주처에 묶여 있기 때문이다.
| 요청 | 담당 |
|---|---|
| "한화 스타일 제안서 만들어줘" | 이 스킬 |
| 발주처가 한화 계열로 확정된 건 | 이 스킬 |
| "제안서 만들어줘" · "PPT 만들어줘" | elite-powerpoint-designer |
| "교육과정 제안서" · "RFP 대응" | elite-powerpoint-designer |
| 목차부터 막막할 때 | multi-proposal-ppt → 확정 후 이쪽 |
| 워크숍 활동지·내부 자료 | handdraw-slides-kr |
호출어가 없으면 이 스킬을 부르지 않는다. 원본 dodorippt는 "제안서 만들어줘"까지 트리거로 잡고 있었는데, 그러면 발주처와 무관하게 특정 발주처 룩이 나온다. 트리거를 좁힌 이유가 이것이다.
산출물은 .pptx다
원본은 Claude Design 캔버스용 .dc.html 한 파일을 만들었다. 이 배포판은 실제 파워포인트 파일을 낸다. 발주처에 나가는 물건은 파일이어야 하고, 받는 쪽이 열어서 고칠 수 있어야 한다.
디자인 규격(색·타이포·레이아웃·시그니처)은 원본을 그대로 옮겼다. 원본 SKILL.md의 px 값을 코드에 그대로 써서 대조할 수 있게 했다 — 슬라이드가 1920×1080px이고 13.333×7.5in이므로 1px = 1/144 in, 1px = 0.5pt로 정확히 떨어진다.
시작 절차
스타일은 묻지 않는다. 색·폰트·톤은 확정된 것으로 취급하고, 내용만 한 번에 묶어서 확인한다.
주제 / 발주처와 보고 대상 / 분량(장수 또는 발표 시간) / 목차 구성(없으면 5챕터 기본안 제시) / 실제 데이터와 이미지 자산 유무 / 발표자·부서·날짜.
목차를 먼저 확정한다. 제목만 읽어도 흐름이 보이는 상태가 되면 그때 장을 채운다.
목차가 서면 사진을 함께 정한다. 실사 사진이 들어간 장 두세 개가 덱의 격을 바꾼다. 자리표시자로 미루면 끝까지 안 채워지고, 나중에 넣으면 이미 짜인 레이아웃과 안 맞는다.
절차는 references/open-photos.md의 "초기 제작 때 함께 한다"에 있다. 요약하면 ① 사진 들어갈 장 2~3개를 고르고 ② 맥락별 키워드로 검색해 ③ 이미지 URL을 명세에 그대로 넣는다. 빌드 스크립트가 받아 캐시하고 출처 장부를 만든다.
12장 기준 사진 두세 장이 상한이다. 그 이상은 제안서가 아니라 브로슈어가 된다.
발주처 표기 — 사고가 나는 지점
원본은 표지와 아웃트로에 발주처 문자열이 하드코딩되어 있었다. 발주처가 바뀌면 그대로 나간다.
이 배포판은 client 변수로 뺐고, 비우면 아예 그리지 않는다.
{"client": "Hanwha"} → 표지·아웃트로에 HANWHA 표기
{"client": ""} → 표기 없음 (기본값)
발주처 워드마크를 우리 제안서에 얹기 전에 확인할 것이 있다. 발주처 BI를 제안서에 쓰는 것은 계약·CI 가이드 문제다. 확실하지 않으면 client를 비우고, 오렌지 톤만으로 간다. 룩은 색과 레이아웃에서 나오지 워드마크에서 나오지 않는다.
디자인 규칙 (변경 금지)
색
| 역할 | 값 |
|---|---|
| Hanwha Orange — 액센트·강조 숫자·반전 카드 | #F37321 |
| 딥브라운 본문 | #3A1D0B |
| 서브 텍스트 | #7A4A2A |
| 캡션 | #9B6B4A |
| 라벨 | #C29B7E |
| 카드 / 구분선 | #FFFFFF / #F6DCC8 |
| 차트 계조 | #F37321 → #F89B6C → #FBB584 → #FDE3D0 |
#F37321은 공개 자료에서 확인한 값이다. 한화 공식 브랜드 페이지는 심볼을 "세 개의 역동적인 원"으로만 설명하고 HEX를 공개하지 않는다. 이 세 값(#F37321·#F89B6C·#FBB584)은 로고 아카이브에서 확인한 것이라 근사값으로 취급한다. 발주처 BI 가이드를 받으면 이 값부터 교체한다.
차트 계조는 한화 심볼에서 나왔다. 세 개의 원(Three Circles)이 오렌지·코랄·골드 계조로 되어 있어, 그 세 값을 순서대로 쓰면 계조가 브랜드 자산과 그대로 맞는다.
본문 잉크가 검정이 아니라 딥브라운인 이유. 오렌지 덱에서 순검정 본문은 차갑게 떠서 배경과 다른 온도로 읽힌다. 채도를 죽인 갈색이 오렌지와 같은 온도에 있으면서 대비는 충분하다.
배경 그라데이션은 3계열뿐이다. 표지·아웃트로(135°, 흰→연오렌지), 본문(160°, 흰→#FFF9F5), 간지(120°, #FFF1E6→#F6C9A6). 이 밖의 배경색은 추가하지 않는다.
타이포 — Noto Sans KR
표지 제목 108px / 900, 본문 제목 64~68px / 900, 목차·간지 제목 80~84px / 900, 강조 숫자 88px / 900(단위 44px), 소제목 36~40px / 700~900, 본문 30~34px / 400~500, 캡션·라벨 최소 24px — 그 이하 금지. 영문 라벨(HANWHA, CONTENTS)은 700 + 자간 0.2~0.24em.
한글은 <a:ea> 슬롯에 들어가야 한다. run.font.name은 <a:latin>만 쓰므로 한글이 조용히 폴백된다. 빌드 스크립트의 _font()가 latin/ea/cs 세 슬롯을 모두 채운다.
폰트는 프리셋 이름으로 고른다.
| 이름 | 폰트 | 성격 |
|---|---|---|
noto (기본) | Noto Sans KR | 원본 dodorippt 규격 |
pretendard | Pretendard | 획이 곧고 숫자 폭이 고르다. KPI와 표에서 자릿수가 흔들리지 않는다. SIL OFL |
nanumsquare | 나눔스퀘어 네오 | 발주처 규격이 이쪽일 때 |
{"font": "pretendard"}
{"font": {"ko": "맑은 고딕", "latin": "Arial"}}
여는 PC에 그 폰트가 없으면 글자가 폴백돼 무너진다. 이게 "PPT가 깨져 보인다"의 가장 흔한 원인이다. Noto Sans KR도 Pretendard도 윈도우 기본 폰트가 아니다. 다음 중 하나를 택한다.
- 만드는 PC와 보는 PC에 폰트를 설치한다 (권장)
- 발주처 PC를 모르면
{"font": {"ko": "맑은 고딕", "latin": "Arial"}}— 윈도우 어디서나 나온다 - PDF로 내보내 제출한다 — 폰트가 파일에 박히므로 어디서 열어도 같다
포인트 컬러 — 강조 카피 전용 2컬러 그라데이션
Hanwha Orange 하나로는 강조할 자리가 없다. 전부 같은 주황이면 어디가 결론인지 안 보인다. 헤드카피 안에서만 쓰는 그라데이션을 하나 둔다.
| 이름 | 값 | 성격 |
|---|---|---|
ember (기본·확정) | #C2410C → #F37321 | 번트오렌지에서 한화 오렌지로. 계열 안에서 명도로 푼다 |
gold | #A85B0A → #FBB584 | 심볼의 골드 계조를 그대로. 가장 부드럽다 |
crimson | #A32218 → #F37321 | 벽돌에서 오렌지로. 위기·전환을 말하는 장 |
teal | #0F766E → #F37321 | 보색 대비. 가장 세게 끊고 갈 때만 |
{"point": "ember"} // 생략하면 ember
ember가 기본인 이유. 삼성·LG U+ 판은 메인 컬러가 어두워서 밝은 보색으로 빠질 수 있었지만, 오렌지는 이미 밝다. 여기서 더 밝은 쪽으로 가면 흰 배경에서 글자가 읽히지 않고, 보색인 청록으로 빠지면 한화 덱이 아니라 다른 회사 덱이 된다. 그래서 반대로 어두운 쪽에서 시작해 브랜드 오렌지로 올라온다. 시작점이 충분히 진해 흰 배경에서 첫 글자부터 읽히고, 끝점이 정확히 #F37321이라 강조 자체가 브랜드 컬러를 가리킨다.
흰 배경에 순오렌지 본문은 쓰지 않는다. #F37321은 명도가 높아 32px 본문에서는 대비가 모자란다. 오렌지가 글자로 나오는 자리는 52px/900 헤드카피 강조와 88px 강조 숫자, 그리고 28px/700 목차 라벨까지다.
쓰는 자리는 헤드카피 한 곳뿐이다. 제목·본문·카드·표에는 쓰지 않는다. 한 덱에서 그라데이션이 여러 곳에 나오면 강조가 아니라 장식이 된다.
LibreOffice는 그라데이션 글자를 첫 스톱 단색으로 렌더한다. PDF 미리보기로 색을 판단하지 않는다. 파워포인트·키노트에서는 정상이다.
그런데 강조가 파워포인트에서 통째로 안 나오면 XML 자식 순서를 의심한다. spPr의 자식은 스키마가 순서를 강제한다 — xfrm → prstGeom → [fill] → ln → effectLst. lxml의 append로 끝에 붙이면 fill이 ln 뒤로 가고 effectLst가 두 개가 된다. LibreOffice는 넘어가지만 파워포인트는 "복구가 필요합니다"를 띄우고, 복구하면서 런 단위 서식까지 지운다. 빌드 스크립트의 _place()가 순서를 잡으므로 새 도형 속성을 넣을 때 반드시 이걸 거친다.
검사는 이렇게 한다.
SO = ["xfrm","custGeom","prstGeom","noFill","solidFill","gradFill",
"blipFill","pattFill","grpFill","ln","effectLst"]
# 각 spPr의 자식 이름을 SO 인덱스로 바꿔 정렬 상태인지 본다
공통 시그니처
모든 제목 위에 56×5px 오렌지 바. 슬라이드 패딩 110px 120px 90px. 카드는 radius 20px + 흰 배경 + 그림자 0 18px 44px rgba(243,115,33,0.10)(반전 카드는 0.22). 배경 장식은 원형 블롭만, 슬라이드당 최대 2개, 68% 지점에서 완전 투명해진다.
금지
손글씨체(제안서 공통 금지선). Inter·Roboto 등 대체 폰트. 어두운 배경(인용 장은 예외). 이모지. 직접 그린 SVG 일러스트. 한 슬라이드에 텍스트 과다 — 표·큰 숫자·인용으로 분해한다.
한 장의 층 구조
본문 장은 층이 넷이다. 이 순서가 읽는 순서다.
━ 목차명 · 상단 라벨 ← title (28px, 오렌지, 자간 0.1em)
헤드카피 두 줄까지 ← head (52px/900) ★ 무엇을 주장하는가
부가 설명 한 줄 ← note (28px, 캡션) 기준·산출 방식·추정 여부
─────────────────────────── ← 구분선. 왼쪽 120px만 포인트색
[표 1] 자료 제목 ← caption (26px/700, 오렌지)
┌──────────────────┐
│ 본문 자료 │ ← 무엇으로 증명하는가
└──────────────────┘
출처: 기관명·보고서명(2025) ← source (22px, 라벨) 어디서 왔는가
Copyright by … ← footer (20px) 전 장 공통
구분선이 없으면 헤드카피와 자료가 한 덩어리로 붙는다. 왼쪽 120px 구간만 포인트색으로 두어 시작점을 잡아 준다.
출처는 슬라이드 하단에 고정된다. 자료 크기에 따라 위아래로 떠다니면 장마다 위치가 달라져 눈이 매번 찾아야 한다. 하단에서 104px 위, 푸터 바로 위 한 줄이다. 본문 블록도 이 자리를 침범하지 않도록 하단 여백을 확보한다.
출처와 푸터는 다른 층이다. 출처는 그 장의 자료가 어디서 왔는지고, 푸터는 문서 전체의 저작권이다.
caption과 source는 metrics·chart·infographic·process·split·table 여섯이 받는다. 비우면 그 줄이 아예 없어지고 자료가 그만큼 커진다.
템플릿 — 빈 껍데기로 시작하기
template_spec.json은 모든 레이아웃을 자리표시자로 채운 12장이다. 무엇을 어디에 넣는지가 슬라이드 안에 적혀 있다.
cp template_spec.json 우리제안.json # 복사해서 내용만 갈아 끼운다
python3 scripts/preview_html.py 우리제안.json preview.html
python3 scripts/build_hanwhappt.py 우리제안.json 제안서.pptx
자리표시자를 지우지 말고 덮어쓴다. "지표명", "출처: 기관명·보고서명(2025)" 같은 문구가 남아 있으면 안 채운 자리가 눈에 띈다. 비워 두면 그 줄이 사라져 빠뜨린 걸 알 수 없다.
표지 — 한 장의 면으로 만든다
[로고 자리] ░░▒▒▓▓ ← 같은 사진이 전면에 깔려 있고
오른쪽으로 갈수록 드러난다
━ 프로젝트명
제안서명 (한 줄)
부제 한 문장
──────────────
회사명 / 부서명 2026. 00. 00 이미지: Unsplash
사진을 오른쪽에만 두면 아무리 가장자리를 녹여도 두 판으로 읽힌다. 경계가 없으려면 경계가 없어야 한다. 사진을 슬라이드 전체에 깔고, 배경색 한 겹을 왼쪽에서 거의 불투명하게 시작해 오른쪽으로 가면서 걷어 낸다. 같은 한 장의 표면 위에서 오른쪽만 드러나는 그림이 된다.
| 겹 | 하는 일 |
|---|---|
| 사진 | 슬라이드 전면. 짧은 변에 맞춰 채우고 넘치는 쪽을 잘라 낸다 |
| 가로 베일 | 7스톱. 왼쪽 98.5% → 오른쪽 14%. 스톱을 촘촘히 둬야 중간에 띠가 안 생긴다 |
| 세로 베일 | 위는 흰색 30%, 아래는 딥브라운 10%. 면에 깊이를 준다 |
띠나 블롭을 더 얹지 않는다. 사각형이나 원을 하나 더 그리면 그게 또 하나의 면이 되어 다시 나뉘어 보인다. 출처 표기도 띠 없이 밝은 글자만 쓴다 — 세로 베일이 아래쪽을 이미 눌러 두었다.
어두운 사진이 맞다. 표지 사진은 오렌지 계열로 색을 돌려 둔다. 파란 네트워크 사진을 그대로 쓰면 즉시 무너진다 — 오른쪽 어두운 면이 왼쪽 밝은 면과 다른 색상 계열이 되어, 같은 면의 깊이 차이가 아니라 두 판의 대립으로 읽힌다. assets/net.jpg는 이미 돌려 놓았다. 밝은 실내 사진은 오른쪽이 살지 않는다.
제목은 한 줄에 떨어지는 가장 큰 크기로 자동 조절된다. 88 → 76 → 64 → 56px 중에서 고른다. 한글은 글자 폭이 글자 크기와 같고 공백은 훨씬 좁으며 영문·숫자는 절반쯤이라, 글자 수만 세면 "2026 AI 전환" 같은 제목에서 빗나간다. \n을 넣어 억지로 두 줄을 만들지 않는다.
project와 title을 나눈다. 프로젝트명(사업명)과 제안서명(문서명)은 다른 것인데 한 덩어리로 쓰면 읽는 쪽이 구분하지 못한다.
logo를 비우면 점선 자리가 남는다. 로고를 안 넣고 납품하는 사고를 막기 위해서다. 파일을 주면 높이 58px로 비율을 지켜 들어간다.
헤드카피 — 본문 장의 문법
본문 슬라이드 제목이 주제만 말하면 읽는 사람이 결론을 스스로 찾아야 한다. "핵심 성과 지표"는 그 장에 무엇이 있는지만 알려주고, 무엇을 주장하는지는 말하지 않는다.
head를 주면 배치 문법이 바뀐다.
━ (오렌지 바)
시장 진단 ← title이 여기로 내려온다 (28px/700, 오렌지, 자간 0.1em)
템플릿 시장은 커졌지만
**제안 통과율은 그대로**입니다. ← 헤드카피 (52px/900) ★ 주인공
2024년 국내 검색·구매 데이터 기준 ← note (28px/400, 캡션)
head가 없으면 기존 배치(제목 68px → 캡션) 그대로다. 기존 명세는 그대로 돌아간다.
**강조**로 감싼 부분에만 포인트 그라데이션이 들어간다. 한 문장에 한 곳이다. 두 곳을 강조하면 둘 다 안 보인다.
강조 구절은 여섯 자 이상으로 잡는다. 그라데이션은 그 런의 폭 안에서 색이 흐르므로, "증명" 같은 두 글자를 감싸면 시작색만 보이고 그린까지 가지 못한다. "네 단계로 증명합니다"보다 "네 단계로 컨셉을 증명해 보이겠습니다"가 색이 산다.
헤드카피는 명사구로 끝내지 않는다. "통과율 정체 현상"이 아니라 "제안 통과율은 그대로입니다"다. 장표에서 문장으로 끝나는 것이 주장이고, 명사로 끝나는 것은 목차다.
본문 블록 위치는 자동으로 계산된다. 헤드카피가 두 줄이면 머리가 길어지므로, 카드·차트·표는 머리 아래 남는 공간에 세로 중앙으로 앉는다. top을 상수로 박아 두면 두 줄 헤드카피에서 겹친다.
레이아웃 10종
원본 9종에 표를 하나 더했다. 차수 계획·비용·역할 분담처럼 제안서에 반드시 들어가는 것을 카드로 우겨넣으면 밀도가 무너진다.
| 함수 | 용도 | 필수 인자 |
|---|---|---|
cover | 표지. 좌 글자 / 우 사진 | project(프로젝트명), title(제안서명, \n으로 줄바꿈), subtitle, presenter, date, image, logo, credit |
agenda | 목차. 우측 2열, 최대 6항목 | items = [[제목, 설명], …] |
section | 간지. 거대 번호 + 챕터명 | num, title, desc |
metrics | KPI 카드. 마지막 카드만 오렌지 반전 | title, items = [[라벨, 값, 단위, 설명], …] |
chart | 좌 막대 + 우 구성비 바 | title, bars = [[라벨, 값], …], donut = 같은 형식 |
infographic | 도넛 인포그래픽 + 우측 항목 | title, parts = [[라벨, 값], …], center, center_note |
photo | 풀블리드 사진 + 딥브라운 보호막 + 헤드라인 | headline, support, image, credit, license_note |
process | 단계 카드. 뒤로 갈수록 진해지고 마지막만 반전 | title, steps = [[단계명, 설명], …] |
split | 좌 텍스트 + 우 이미지 + 하단 01·02·03 | title, body, points(3개), image(선택) |
table | 표 | title, headers, rows |
quote | 딥브라운→벽돌 인용 장 | headline, support, credit |
outro | 마무리 | presenter |
본문 여섯(metrics·chart·infographic·process·split·table)은 head·note·caption·source를 함께 받는다. cover·agenda·section·quote·outro는 받지 않는다 — 그 장들은 이미 한 문장이 주인공이다.
챕터가 늘어나면 section을 복제해 번호와 챕터명만 바꾸고, 본문은 metrics~table을 재사용한다. 새 레이아웃을 발명하지 않는다.
chart와 infographic을 구분한다. chart는 지표 두 개를 나란히 놓는 자리고, infographic은 구성비 하나에 화면을 다 쓴다. 비중 자체가 논지일 때(예: 문의의 44%가 사례 요청) infographic을 쓴다. 도넛은 BLOCK_ARC 조각을 12시부터 시계방향으로 이어 붙여 그린다.
도넛 각도에 함정이 있다. python-pptx의 adjustments는 값을 100000배로 기록하는데 OOXML 각도 단위는 1/60000도다. 그대로 넣으면 각도가 5/3배로 부풀어 조각이 전부 한 바퀴를 돈다. 각도에 0.6을 곱해야 한다.
photo의 보호막은 왼쪽에만 진하게 건다. 글자가 놓인 왼쪽은 82%, 오른쪽 끝은 0%다. 전면을 고르게 덮으면 사진을 넣은 의미가 없어진다. 더 어둡게 하려면 dim을 1보다 크게, 사진을 더 살리려면 1보다 작게 준다.
photo는 사진 없이도 완성된다. 비우면 딥브라운 자리표시자와 "이미지 교체 위치" 문구가 들어가므로 빈 채로 납품될 수 없다. 사진을 구하고 표기하는 절차는 references/open-photos.md에 있다 — 넣기 전에 읽는다.
어두운 장에서는 강조 그라데이션이 자동으로 바뀐다. 밝은 배경용은 시작색이 짙은 번트오렌지라 딥브라운 위에서 안 읽힌다. photo와 quote에서는 흰색에서 시작하는 변형이 쓰인다.
막대 색은 자동이다. 계조를 순서대로 깔면 가장 큰 막대가 가장 연해져 강조가 죽는다. 최댓값만 Hanwha Orange로, 나머지는 #FBB584로 통일한다.
실행
명세를 JSON으로 쓰고 스크립트에 넘긴다.
python3 scripts/build_hanwhappt.py spec.json 제안서.pptx
{
"client": "",
"point": "ember",
"footer": "Copyright by 회사명. All rights reserved.",
"font": {"ko": "Noto Sans KR", "latin": "Noto Sans KR"},
"slides": [
{"layout": "cover", "title": "2026 직무역량\n강화 과정", "subtitle": "블렌디드 러닝 설계안",
"presenter": "회사명 / 부서명", "date": "2026. 09. 05"},
{"layout": "agenda", "items": [["추진 배경", "시장 환경과 현황 진단"]]},
{"layout": "section", "num": 1, "title": "추진 배경", "desc": "한 문장."},
{"layout": "metrics", "title": "시장 진단",
"head": "템플릿 시장은 커졌지만\n**제안 통과율은 그대로**입니다.",
"note": "기준 시점 · 단위",
"items": [["과정 수료율", "94", ".2%", "목표 대비 +6.2%p"]]},
{"layout": "outro", "presenter": "회사명 / 부서명"}
]
}
footer는 표지를 뺀 전 장 하단에 들어가고, 어두운 인용 장에서는 색이 자동으로 바뀐다.
미리보기 — 디자인 확인은 HTML로 한다
.pptx로 색을 판단하지 않는다. 두 가지가 어긋난다. 여는 PC에 폰트가 없으면 글자가 폴백되고, LibreOffice·구글 슬라이드·미리보기 앱은 그라데이션 글자를 첫 스톱 단색으로 떨어뜨린다.
같은 명세로 브라우저 미리보기를 만든다.
python3 scripts/preview_html.py spec.json preview.html "제목"
웹폰트를 스스로 불러오고 CSS 그라데이션을 그대로 그리므로, 여기서 보이는 것이 파워포인트에서 나올 모습이다.
로컬 사진은 data: URI로 파일 안에 박힌다. 미리보기 창·메일 클라이언트·오프라인 환경은 외부 이미지를 막는다. HTML 한 파일만 있으면 어디서 열어도 사진까지 보인다. http URL은 그대로 두므로, 그 경우에는 여는 쪽 망에 달렸다. 1920×1080 고정 좌표로 그린 뒤 화면 폭에 맞춰 통째로 축소하므로 어느 화면에서 열어도 비율이 유지된다.
.pptx가 납품물이고 HTML은 검수용이다. 발주처에 HTML을 보내지 않는다.
이미지
직접 생성하지 않는다. 발주처나 자사 자산이 우선이고, 없으면 오픈 라이선스 사진을 쓴다.
image는 로컬 경로와 URL을 모두 받는다. URL이면 빌드할 때 _photos/에 받아 캐시한다.
가능하면 로컬 경로를 쓴다. 스킬의 assets/에 사진 두 장(빈 회의실·사무실 내부, 둘 다 Unsplash·인물 없음)이 들어 있어 망 없이도 템플릿이 그림까지 나온다. URL은 빌드하는 PC에 망이 있어야 하고, 사내망이 이미지 CDN을 막아 두면 자리표시자로 떨어진다.
{"image": "https://images.unsplash.com/photo-XXXX?w=1920&q=80"}
{"image": "./assets/공장라인.jpg"}
{"image": ""}
비우면 자리표시자가 "이미지 교체 위치" 문구와 함께 들어가므로 빠뜨릴 수 없다. 망이 막혀 있어도 자리표시자로 넘어가고 빌드는 죽지 않는다.
빌드가 끝나면 <파일명>_사진출처.md가 자동으로 생긴다. 슬라이드·촬영자·라이선스·원본 URL·확보 여부가 표로 남는다.
고르고 확인하고 표기하는 절차는 references/open-photos.md에 있다. 사진을 넣기 전에 읽는다. 특히 초상권 — 무료 사진 사이트의 라이선스는 사진가의 저작권만 다루고 찍힌 사람의 권리는 다루지 않는다.
검수
렌더해서 눈으로 본다. 한글은 영문보다 폭이 넓어 넘치기 쉽다.
- 한글이 네모로 나오지 않는가 — 나오면
font.ko이름이 그 PC에 없는 것이다 - 제목 줄바꿈(
\n) 뒤 부제가 겹치지 않는가 - 목차 2열이 오른쪽 패딩을 먹지 않았는가
metrics·process의 반전 카드가 마지막 하나뿐인가
4-1. 헤드카피가 명사구로 끝나지 않는가. **강조**가 한 문장에 한 곳뿐인가
- 캡션이 24px 미만으로 내려가지 않았는가
- 배경 블롭이 슬라이드당 2개를 넘지 않는가
client에 발주처 워드마크를 쓸 권한이 확인됐는가- 파워포인트가 "복구가 필요합니다"를 띄우지 않는가 — 뜨면
spPr자식 순서를 검사한다 - HTML 미리보기와 .pptx가 같아 보이는가 — 다르면 폰트가 없는 것이다
- 출처와 푸터가 붙어 보이지 않는가
- 자리표시자 문구가 남아 있지 않은가 — "지표명", "기관명·보고서명"
photo의credit을 채웠는가- pptx 안에 사진이 실제로 들어갔는가 —
unzip -l 제안서.pptx | grep media로 확인한다. 빌드 로그에 "사진 실패"가 있으면 자리표시자만 들어간 것이다 —references/open-photos.md의 확인 목록을 통과했는가
soffice --headless --convert-to pdf 제안서.pptx && pdftoppm -png -r 70 제안서.pdf s
출처
디자인 규격(색 팔레트·타이포 스케일·9종 레이아웃 구성·시그니처 요소)의 원저작자는 dodori이며 원본 스킬명은 dodorippt, MIT로 공개되어 있다.
고친 곳은 넷이다. ① 산출물을 .dc.html에서 .pptx로 바꾸고 python-pptx 구현을 새로 썼다. ② SAMSUNG 하드코딩을 client 변수로 뺐다. ③ 트리거에서 일반 제안서 요청 5종을 제거해 elite-powerpoint-designer와의 충돌을 없앴다. ④ 표·도넛 인포그래픽·사진 레이아웃, 헤드카피 문법, 강조용 2컬러 그라데이션, 폰트 프리셋, HTML 미리보기 생성기를 추가했다. 색·타이포·시그니처 수치는 원본 그대로다.