Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
Show all changes
138 commits
Select commit Hold shift + click to select a range
d4fe662
Task #137: 테스트 생성 샘플 파일 output/ 로 이동 및 git 추적 제거 closes #137
edwardkim Apr 13, 2026
d4a7bc1
Merge local/task137: #137 테스트 생성 샘플 파일 output/ 이동 및 git 추적 제거
edwardkim Apr 13, 2026
3297ef5
Merge local/devel: #137 테스트 생성 샘플 파일 output/ 이동 및 git 추적 제거
edwardkim Apr 13, 2026
66d9754
Task #137: samples/ 잔재 자동생성 파일 6개 삭제
edwardkim Apr 13, 2026
128237e
docs: 역공학 → 재현검증 용어 변경
edwardkim Apr 13, 2026
c94de2c
docs: 오늘할일 20260414 작업 기록 갱신
edwardkim Apr 13, 2026
cf0fdbd
docs: 오늘할일 20260414 타스크 번호 기준 정렬 및 비고 보완
edwardkim Apr 13, 2026
d2aef33
Task #139: 수식 렌더링 고도화 분석/방향 수립 (플랜 모드)
edwardkim Apr 14, 2026
6df2d69
Merge local/task139: #139 수식 렌더링 고도화 분석/방향 수립
edwardkim Apr 14, 2026
6026b2c
Merge local/devel: #139 수식 렌더링 고도화 분석/방향 수립
edwardkim Apr 14, 2026
5b00d51
Task #140: CI 경로 필터 추가 — 문서/샘플/에셋 변경 시 빌드 스킵
edwardkim Apr 14, 2026
d6ec7e2
docs: 오늘할일 20260414 #140 CI 경로 필터 완료 기록
edwardkim Apr 14, 2026
41b50e0
Merge local/task140: #140 CI 경로 필터 추가
edwardkim Apr 14, 2026
f01cafa
Merge local/devel: #140 CI 경로 필터 추가
edwardkim Apr 14, 2026
db68361
Task #141 stage1: SVG/Canvas 수식 렌더러에 font-family 적용
edwardkim Apr 14, 2026
16aa055
Task #141 stage2: Latin Modern Math woff2 번들 및 폰트 로더 등록
edwardkim Apr 14, 2026
9be9044
Task #141: 수식 폰트 적용 완료 — 계획서, 보고서, 오늘할일 갱신
edwardkim Apr 14, 2026
364247b
Task #141: SVG 폰트 임베딩 시 수식 폰트(Latin Modern Math) 포함
edwardkim Apr 14, 2026
c17f27c
Merge local/task141: #141 수식 폰트 적용 (Latin Modern Math)
edwardkim Apr 14, 2026
1999b0e
Merge local/devel: #141 수식 폰트 적용 (Latin Modern Math)
edwardkim Apr 14, 2026
91d9374
Task #142: 수식 레이아웃 보정 — OVER 파서 재설계 및 TAC 너비/폭 추정 개선
edwardkim Apr 14, 2026
d8e3ca8
Task #142: 인라인 수식 y축 정렬 개선 — LayoutBox baseline 기준 배치
edwardkim Apr 14, 2026
7867c65
Task #142: 중간 커밋 — baseline 정렬 개선, 테스트 추가
edwardkim Apr 14, 2026
e26f16d
Task #142: Fraction baseline을 TeX axis_height 기준으로 수정
edwardkim Apr 14, 2026
5a6f9a8
Task #142: SVG 렌더러 font-size 버그 수정 — font_size_from_box 제거
edwardkim Apr 14, 2026
7f2a8b1
Task #142: 분수선 SVG y좌표를 axis_height 기준으로 보정
edwardkim Apr 14, 2026
cbd320f
Task #142: 시각 검증 버그 목록 기록 (미해결 5건)
edwardkim Apr 14, 2026
a537b87
Task #142: bar{rm AD it} 중괄호 파싱 오류 수정
edwardkim Apr 14, 2026
b16667c
Task #142: 적분 nolimits, 함수 첨자 공백 건너뛰기, bar 파싱 수정
edwardkim Apr 14, 2026
2ccb1bf
Task #142: 버그 목록 갱신 (4건 해결, 1건 미해결)
edwardkim Apr 15, 2026
4d40c6b
renderer: apply HWP image effect (grayscale/blackwhite) in SVG output
marsimon Apr 15, 2026
b1299e2
samples: 그레이스케일 효과 검증용 HWP 파일 추가
marsimon Apr 15, 2026
57b41ba
Merge pull request #149 from marsimon/fix/grayscale-image
edwardkim Apr 15, 2026
5ce2e02
Task #142: 중간 커밋 — 수식 TAC 너비 HWP 저장값 복원, SVG 스케일링, dump 개선
edwardkim Apr 16, 2026
f928f23
Task #145: SVG 1mm 격자 오버레이 기능 추가 (--show-grid)
edwardkim Apr 16, 2026
0f13325
Merge local/devel: #145 SVG 격자 오버레이
edwardkim Apr 16, 2026
02c0753
Merge local/task145: #145 SVG 격자 오버레이 (--show-grid)
edwardkim Apr 16, 2026
b7df23a
Merge branch 'devel' of github.com:edwardkim/rhwp into devel
edwardkim Apr 16, 2026
eccaf3a
Merge local/devel: #145 격자 기능 반영
edwardkim Apr 16, 2026
c63d5f7
Task #142/#159: 탭 좌표 분석 중간 커밋
edwardkim Apr 16, 2026
8e03314
docs: 오늘할일 20260416 작성
edwardkim Apr 16, 2026
e3764aa
Task #142: 1단계 — 원문자 전각 폭, 탭 /2.0 주석 정리, 계획서 v2
edwardkim Apr 16, 2026
26d767b
Fix mobile dropdown menu icon/label overlap (≤767px)
seunghan91 Apr 16, 2026
1cb27bc
fix(document_core): clamp shape width/height to prevent disappearance…
seunghan91 Apr 16, 2026
6e808c5
Merge pull request #163 from seunghan91/fix/shape-resize-clamp
edwardkim Apr 16, 2026
303cee9
Task #164: 수행·구현 계획서 작성
seunghan91 Apr 16, 2026
2734c2a
Task #164 [Stage 1]: HWPX serializer 스켈레톤 + 빈 Document 라운드트립
seunghan91 Apr 16, 2026
b651075
Task #164 [Stage 1]: 한글2020에서 생성한 레퍼런스 HWPX 3종 추가
seunghan91 Apr 16, 2026
fec5540
Task #164 [Stage 1]: 한컴2020 호환 빈 HWPX 확장 (11개 필수 파일)
seunghan91 Apr 16, 2026
4c5406d
Merge pull request #161 from seunghan91/fix/mobile-menu-icon-overlap
edwardkim Apr 16, 2026
9a54d95
Merge devel: PR #161 모바일 메뉴 겹침 수정 동기화
edwardkim Apr 16, 2026
6a7f926
Task #142: 버그 목록 갱신 — ③+수식0 겹침 근본 원인 발견
edwardkim Apr 16, 2026
6246bc8
Task #142/#159: 탭+TAC 수식 겹침 해결 — inline_tabs 처리 동기화
edwardkim Apr 16, 2026
bef6af3
Task #142: 1단계 v2 완료보고서
edwardkim Apr 16, 2026
9edea55
Task #86: 썸네일 로딩 완료 시 스피너 제거
postmelee Apr 16, 2026
b10267b
fix(rhwp-chrome): options 페이지 CSP 호환
postmelee Apr 16, 2026
61f4f23
Task #142: 2단계 시각 검증 — 3페이지까지 버그 기록
edwardkim Apr 16, 2026
7e361ce
Task #142: 분수 여백 조정 + 적분 nolimits 레이아웃 구현
edwardkim Apr 16, 2026
292dbbe
Task #142: 적분 nolimits 재구현 — KaTeX 방식 (MathSymbol + SubSup)
edwardkim Apr 16, 2026
503967f
fix(rhwp-chrome): options.js IIFE + 'use strict' 적용
postmelee Apr 16, 2026
bb62838
Merge branch 'devel' into fix/chrome-clean-v2
postmelee Apr 16, 2026
779de81
chore(rhwp-chrome): 버전 표기 및 문서 예시 정합성 보정
postmelee Apr 16, 2026
1d831da
Task #164 [Stage 1]: 한컴2020 레퍼런스 XML 템플릿 임베딩으로 교체
seunghan91 Apr 16, 2026
1c0fb9a
Task #164 [Stage 1]: 단계별 완료 보고서
seunghan91 Apr 16, 2026
0a0f14e
Task #164 [Stage 2.1]: section.xml 텍스트 IR 주입
seunghan91 Apr 16, 2026
0412834
Task #164 [Stage 2.2]: 탭/줄바꿈 인라인 직렬화
seunghan91 Apr 16, 2026
edeaa1e
Task #164 [Stage 2.3]: 다문단 + 소프트 브레이크 + 탭 정식 직렬화
seunghan91 Apr 16, 2026
ebe5f2b
Task #164: HWPX 자동 검증 도구 추가
seunghan91 Apr 16, 2026
5325c02
Task #164: 회귀 테스트 배치 스크립트 추가
seunghan91 Apr 16, 2026
7c76035
Task #164: HWPX 라운드트립 예제 + 회귀 케이스 추가
seunghan91 Apr 16, 2026
00bf77c
Task #142: 적분 상한/하한 위치 조정 — 기호 상단/하단 맞춤
edwardkim Apr 16, 2026
7bbb689
Task #164: 최종 결과 보고서 + 오늘할일 갱신
seunghan91 Apr 16, 2026
a460d5f
Task #142: 적분 하한 위치 미세 조정 — 한컴 격자 기준 맞춤
edwardkim Apr 16, 2026
bcbeec7
Task #142: 함수명(sin,cos,log) 뒤 Thin 공백 무시 처리
edwardkim Apr 16, 2026
6bdacb6
Task #142: EQALIGN && 이중 탭 처리 — 조건 부분 분리
edwardkim Apr 16, 2026
3da1334
Task #142: CASES 내부 && 이중 탭 처리 추가
edwardkim Apr 16, 2026
a95aec1
Task #142: CASES && 처리 + 테스트 추가
edwardkim Apr 17, 2026
ddc8ebd
Task #142: Function 여백 축소 시도 (0.1→0.02) — 효과 미미, 폰트 메트릭 정밀도 문제
edwardkim Apr 17, 2026
6c3be88
Task #142: FontStyle(it/rm) 뒤 구조 명령어(LEFT 등) body 먹힘 방지
edwardkim Apr 17, 2026
df5fc36
Task #142: 2단계 시각 검증 완료 — 20페이지 전체
edwardkim Apr 17, 2026
ad32f7d
Task #142: 최종 보고서 — 수식 레이아웃 보정 완료
edwardkim Apr 17, 2026
5d59b03
Merge local/task142: #142 수식 레이아웃 보정 (15건 해결)
edwardkim Apr 17, 2026
e129934
Merge local/devel: #142 수식 레이아웃 보정 완료 (15건)
edwardkim Apr 17, 2026
106224d
Merge pull request #168 from postmelee/fix/chrome-clean-v2
edwardkim Apr 17, 2026
b76ef0d
fix: Clippy sort_by → sort_by_key 경고 수정
edwardkim Apr 17, 2026
0aac213
Merge pull request #170 from seunghan91/feature/task164-hwpx-serializer
edwardkim Apr 17, 2026
c3f9b60
docs: 오늘할일 20260417 갱신 — 수식 완료, PR 처리, HWPX 이슈 등록
edwardkim Apr 17, 2026
8dd217d
Merge devel: 최신 동기화
edwardkim Apr 17, 2026
54dc1c1
Task #176: HWPX 저장 WASM API 노출 + SaveAs 형식 분기
edwardkim Apr 17, 2026
2f0406f
Task #176: HWPX 저장 완료 — file:save 경로 수정 + wasm-bridge 추가
edwardkim Apr 17, 2026
7906cce
Task #176: 검증용 샘플 추가
edwardkim Apr 17, 2026
2514855
Merge local/task176: #176 HWPX 저장 WASM API 노출
edwardkim Apr 17, 2026
e160001
Merge local/devel: #176 HWPX 저장 API
edwardkim Apr 17, 2026
219a665
docs: MEMORY.md 백업 동기화 — 수식 TAC 메모리 항목 추가
edwardkim Apr 17, 2026
4a4d99a
Task #182 Stage 0: 기반 공사 — 라운드트립 하네스 + 분기 제거 + 한컴 기본값 상수화
edwardkim Apr 17, 2026
6c3983b
Task #182 Stage 1: header.xml IR 기반 동적 생성
edwardkim Apr 17, 2026
deabfc1
Task #182 Stage 2: section.xml IR 기반 속성 + charPrIDRef 매핑 (최소 침습)
edwardkim Apr 17, 2026
7b56c92
Task #182 Stage 3: Table 직렬화 (<hp:tbl>) 모듈 완성
edwardkim Apr 17, 2026
c1ca28a
Task #182 Stage 4: Picture + BinData ZIP 엔트리 + 3-way 단언
edwardkim Apr 17, 2026
20e9931
Task #182 Stage 5 + 최종 보고서: 도형·필드 + 대형 실문서 스모크
edwardkim Apr 18, 2026
99c7fd7
docs(orders): Task #182 완료 기록 (20260417 → 20260418)
edwardkim Apr 18, 2026
8711f5a
Merge local/task182: #182 HWPX Serializer 완성 — 표/이미지/스타일/글꼴 직렬화
edwardkim Apr 18, 2026
a5d1222
Merge local/devel: #182 HWPX Serializer 완성 — 표/이미지/스타일/글꼴 직렬화
edwardkim Apr 18, 2026
3f2debd
fix(studio): 열린 문서를 Ctrl+S로 바로 저장
ahnbu Apr 17, 2026
43e6147
Task #177 Stage 1: 비표준 lineseg 감지 인프라 (ValidationReport)
edwardkim Apr 18, 2026
40a9247
Task #177 Stage 2: Serializer 원본 lineseg 보존
edwardkim Apr 18, 2026
3a7044a
Task #177 Stage 3: Reflow on-demand + WASM API + 모달 UI
edwardkim Apr 18, 2026
7945e7c
Task #177 Stage 4 + 최종 보고서: R3 규칙 발견 + 통합 검증 + 문서화
edwardkim Apr 18, 2026
e8e551e
fix(studio): 회전된 도형의 대각선 리사이즈 트래킹 및 드래그 프리뷰 스타일 개선
bapdodi Apr 18, 2026
8c1f4d9
fix(studio): 회전된 도형의 리사이즈 커서 방향이 회전각을 반영하도록 개선
bapdodi Apr 18, 2026
26662ad
feat(studio): 리사이즈 시 반대편으로 넘어가도 도형이 정상 표시되도록 Flip 처리 추가
bapdodi Apr 18, 2026
6200657
docs: Task #191 구현 계획서 및 결과 보고서 추가
bapdodi Apr 18, 2026
64088a2
Merge local/task177: #177 HWPX lineseg 비표준 감지·고지·보정
edwardkim Apr 18, 2026
a657532
docs(orders): Task #177 완료 기록 + 20260419 신규
edwardkim Apr 18, 2026
f645a56
Merge local/task177: #177 orders documentation update
edwardkim Apr 18, 2026
49e0e13
Merge local/devel: #177 HWPX lineseg 비표준 감지·고지·보정
edwardkim Apr 18, 2026
cc90db4
hwpx 직렬화 검증 파일 추가
edwardkim Apr 19, 2026
7631186
docs(troubleshootings): #178 첫 시도 실패 진단 보존
edwardkim Apr 19, 2026
35d3b1e
Task #178 Stage 1: 진단 인프라 + 자동 차이 추출 도구
edwardkim Apr 19, 2026
2b5ec0d
Task #178 Stage 2: table.raw_ctrl_data 합성 + table.attr 재구성
edwardkim Apr 19, 2026
d6deb29
Task #178 Stage 3: 셀 list_attr bit 16 (apply_inner_margin) 최소 구현
edwardkim Apr 19, 2026
805de97
Task #178 Stage 4: SectionDef 컨트롤 삽입 + typeset 버그픽스
edwardkim Apr 19, 2026
24cf59c
Task #178 Stage 5: 통합 진입점 + WASM 자동 어댑터 분기
edwardkim Apr 19, 2026
889bb86
Task #178 Stage 6: 명시적 검증 함수 (Q3 결정 B)
edwardkim Apr 19, 2026
978a8a4
Task #178 정리: 한컴 호환 실패 확인 + 트러블슈팅 + 후속 이슈 분리
edwardkim Apr 19, 2026
fd8a496
Merge local/task178: #178 HWPX→HWP IR 매핑 어댑터 (부분 진척, 한컴 호환은 후속 이슈로 분리)
edwardkim Apr 19, 2026
d9f221c
Merge local/devel: #178 HWPX→HWP IR 매핑 어댑터 작업 (한컴 호환 후속 이슈로 분리)
edwardkim Apr 19, 2026
9a6d094
Task #198: rhwp-chrome 다운로드 인터셉터 부작용 수정 (chrome-fd-001)
edwardkim Apr 19, 2026
c69479f
Merge local/task198: #198 rhwp-chrome 다운로드 인터셉터 부작용 수정 (chrome-fd-001)
edwardkim Apr 19, 2026
181e1ce
Merge local/devel: #198 chrome-fd-001 fix
edwardkim Apr 19, 2026
afb9b54
Merge pull request #189 from ahnbu/pr/task179
edwardkim Apr 19, 2026
2d1b6f5
Task #196: rhwp-studio HWPX 저장 비활성화 + 사용자 안내 + v0.2.0 부수 fix
edwardkim Apr 19, 2026
5a5a713
Merge local/task196: #196 HWPX 저장 비활성화 + 사용자 안내 + v0.2.0 부수 fix
edwardkim Apr 19, 2026
da0914a
Merge pull request #192 from bapdodi/local/task191
edwardkim Apr 19, 2026
ebe3d40
Merge origin/devel: PR #192 회전 도형 리사이즈 (Task #191)
edwardkim Apr 19, 2026
859e222
docs(readme): v0.2.0 변경 이력에 누적 외부 기여자 명시
edwardkim Apr 19, 2026
b98fc84
Merge local/devel: #196 HWPX 저장 비활성화 + v0.2.0 부수 fix + README 기여자
edwardkim Apr 19, 2026
9d543f5
chore(release): bump version to v0.7.3
edwardkim Apr 19, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions mydocs/feedback/task139-eq-01.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
공유해주신 `rhwp` 프로젝트의 수식 처리 고도화 설계 문서를 매우 흥미롭게 읽어보았습니다.

한컴의 기존 생태계(HWP 문서 호환성)를 완벽히 유지하면서도, 웹 플랫폼의 특성과 글로벌 학술 표준(LaTeX)을 동시에 수용하려는 깊이 있는 고민이 돋보이는 훌륭한 아키텍처입니다. 작성해주신 두 문서의 핵심 결정을 요약하고, 설계 단계에서 추가로 고려해 볼 만한 엔지니어링 포인트를 몇 가지 덧붙여 보았습니다.

### 💡 주요 설계 결정 요약 및 평가

**1. 수식 폰트 체계 설계**
* **최적의 폰트 선정:** 기존 한컴 수식 폰트(HyHwpEQ)의 뿌리인 Computer Modern과의 시각적 일관성을 위해 **Latin Modern Math**를 1순위로 채택한 것은 기존 사용자들의 이질감을 없애는 탁월한 선택입니다.
* **안정적인 폴백 체계:** 영문/기호는 `Latin Modern Math`와 `STIX Two Math`로 커버하고, 폰트 내 글리프가 없는 한글은 이미 번들링된 `Pretendard`로 자연스럽게 폴백되도록 `font-family` 체인을 구성한 것은 추가 리소스 로딩을 최소화하는 효율적인 웹 최적화 방식입니다.

**2. 입력 파서 아키텍처**
* **안전한 확장 (전략 A):** 토크나이저와 파서만 한컴용/LaTeX용으로 분리하고, 이미 문법에 독립적으로 설계된 공통 AST(`EqNode`)와 그 하위 렌더링/레이아웃 파이프라인을 그대로 재사용하는 아키텍처는 회귀 버그(Regression) 위험을 최소화합니다.
* **듀얼 모드 지원:** MS Word의 선형 모드(Linear)처럼 기존 한컴 문법 사용자와 신규 LaTeX 사용자를 모두 만족시킬 수 있는 방향성입니다. 향후 AI(LLM)가 출력하는 LaTeX 수식을 즉시 붙여넣을 수 있게 되면 활용도가 극대화될 것입니다.

---

### 🛠️ 추가 고려사항 (엔지니어링 & UX 관점)

설계하신 내용을 바탕으로 실제 구현 시 마주할 수 있는 몇 가지 엣지 케이스를 제안해 드립니다.

**1. 폰트 로딩 시점과 수식 레이아웃(Bounding Box) 틀어짐 방지**
* 문서에서 제안하신 `font-display: swap` 방식은 텍스트가 빠르게 표시된다는 장점이 있습니다.
* 하지만 수식 렌더러는 분수(Fraction)의 선 위치나 첨자(Sub/Superscript)의 위치를 픽셀 단위로 정밀하게 계산해야 합니다. 웹 폰트(woff2)가 로드되기 전에 브라우저 기본 폰트로 먼저 `LayoutBox`가 계산되면, 이후 폰트가 교체되었을 때 수식 기호가 겹치거나 여백이 틀어질 위험이 있습니다.
* **제안:** 수식 렌더링을 시작하기 전, Web Font Loader API(`document.fonts.load()`)를 활용해 `Latin Modern Math` 폰트가 완전히 로드된 것을 보장한 후 AST에서 레이아웃 계산을 트리거하는 동기화 로직을 고려해 보시면 좋습니다.

**2. LaTeX 자동 감지 로직의 엣지 케이스**
* 입력 문자열 첫 비공백 문자가 `\`일 때 LaTeX 모드로 전환하는 로직은 가볍고 빠릅니다.
* 다만, 사용자가 변수명(예: `x = ...`)부터 입력하기 시작하다가 수식 중간에 `\frac`을 타이핑하는 상황이 발생할 수 있습니다. 이 경우 첫 글자가 `\`가 아니므로 한컴 모드로 파싱되어 에러가 발생할 수 있습니다.
* **제안:** UI 상단에 현재 파싱 모드(한컴 ↔ LaTeX)를 명시적으로 보여주는 토글 버튼을 배치하고, 한컴 모드 파싱 중 에러가 발생하거나 `\` 기호가 발견되면 "LaTeX 모드로 전환하시겠습니까?"라는 힌트를 제공하는 UX가 필요할 수 있습니다.

---
15 changes: 15 additions & 0 deletions mydocs/manual/MEMORY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
- [작업 시간 제한 금지](feedback_no_time_limits.md) — 클로드가 임의로 작업 종료 제안 금지, 작업지시자가 결정
- [한컴 LINE_SEG 자동 재계산](project_hancom_lineseg_behavior.md) — LINE_SEG가 비어있어도 한컴이 자체 재계산. 역공학 샘플 전략의 기반
- [타스크 번호는 GitHub Issues로 채번](feedback_task_numbering.md) — gh issue create로 자동 채번, 수동 번호 할당 금지
- [마일스톤 표기 규칙](feedback_milestone_notation.md) — v1.0.0→M100, v0.5.x→M05x. 오늘할일에서 M100 #1 형식 사용
- [안드로이드 IME 미구현](project_android_ime_pending.md) — 기기 미보유로 미테스트. iOS는 contentEditable+디바운스로 해결. 기기 확보 시 구현 필요
- [Discord 커뮤니티](reference_discord.md) — Rust Discord에 프로젝트 소개 (2026-04-04)
- [타스크 프로세스 반드시 준수](feedback_process_must_follow.md) — 이슈→브랜치→할일→계획서→구현 순서 절대 생략 금지. #61에서 위반 발생
- [이슈 클로즈는 작업지시자 승인 필수](feedback_no_close_without_approval.md) — 미해결 상태 임의 클로즈 금지. #62에서 위반 발생
- [로컬 폰트 경로](reference_font_path.md) — TTF 폰트는 /home/edward/mygithub/ttfs에 프로젝트 외부 분리
- [작업 문서 네이밍 규칙](feedback_working_doc_naming.md) — task_m100_{번호}_stage{단계}.md 패턴 필수
- [최종 보고서 위치 규칙](feedback_report_location.md) — 최종 보고서는 mydocs/report/, 단계별 보고서는 mydocs/working/
- [보고서는 타스크 브랜치에서 커밋](feedback_commit_reports_in_branch.md) — 보고서·오늘할일 갱신은 타스크 브랜치에서 소스와 함께 커밋. merge 전 git status 필수
- [오늘할일 문서 작업일지 갱신 필수](feedback_update_daily_orders.md) — 작업한 내용은 반드시 mydocs/orders/yyyymmdd.md에 기록. 세션 종료 전 커밋
- [알한글 iOS 프로젝트](project_alhangeul_ios.md) — iPad HWP 학습 도구, 맥북 전용(ios/devel), 리눅스에서 빌드 불가. 현재 환경에서 작업 불가
- [output 폴더 서브폴더 구조](project_output_folder_structure.md) — output/re/(재현검증), output/svg/(SVG), output/debug/(디버그) 용도별 분리. 새 출력 코드는 반드시 서브폴더에 저장
1 change: 1 addition & 0 deletions mydocs/orders/20260414.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,4 @@
| [#137](https://github.com/edwardkim/rhwp/issues/137) | samples/ 잔재 자동생성 파일 6개 삭제 (dotum-times 계열) | 완료 | |
| [#138](https://github.com/edwardkim/rhwp/issues/138) | output/ 서브폴더 구조 설계 및 문서화 | 완료 | CLAUDE.md, MEMORY.md 갱신 |
| [#138](https://github.com/edwardkim/rhwp/issues/138) | 역공학 → 재현검증 용어 변경 (CLAUDE.md, re_sample_gen.rs) | 완료 | |
| [#139](https://github.com/edwardkim/rhwp/issues/139) | 수식 렌더링 고도화: 분석/방향 수립 (플랜 모드) | 완료 | LaTeX 비교, 폰트 선정, 레이아웃 설계 |
104 changes: 104 additions & 0 deletions mydocs/plans/task_m100_139.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
# 수행계획서: 수식 렌더링 고도화

- **타스크**: [#139](https://github.com/edwardkim/rhwp/issues/139)
- **마일스톤**: M100
- **브랜치**: `local/task139`
- **작성일**: 2026-04-14

## 1. 배경

Task #181에서 수식 파서/레이아웃/렌더러 기본 구현이 완료되었다(85~90%). 수식 편집 UI도 한컴 방식으로 구현되어 있다(equation-editor-dialog.ts, 48개 템플릿 버튼, 실시간 SVG 미리보기).

### 전략적 배경

한컴의 수식 입력 방식은 초창기부터 자체 문법(OVER, SQRT 등)을 사용해왔으며, 최신 LaTeX와 비교하면 진부하다는 평가가 많다. 한컴 디벨로퍼 포럼([LaTeX 수식 쓰레드](https://forum.developer.hancom.com/t/latex/1810))에서도 사용자들이 LaTeX 표준 지원을 강력히 요청하고 있으며, 한컴 측도 내부적으로 준비 중이라 답변했으나 구체적 일정은 미공개 상태이다.

rhwp는 기존 한컴 수식 호환을 유지하면서, 편집 부분에서 최신 발전된 수식 입력기를 구현하여 수학/과학 분야 사용자들에게 차별화된 가치를 제공하는 것을 전략 목표로 한다.

### 기술적 개선 필요 사항

1. **수식 입력 방식 단일**: 현재 한컴 방식 스크립트만 지원. LaTeX 문법과의 비교 분석을 통해 향후 입력 방식 개선 방향을 수립해야 한다.
2. **수식 폰트 부재**: SVG/Canvas 렌더링 시 `font-family`가 지정되지 않아 브라우저 기본 폰트로 렌더링됨. 수식 기호(∫, Σ, ∏ 등)와 그리스 문자의 표현 품질이 낮음.
3. **수식 레이아웃 부정확**: 매트릭스의 열 간격(MATRIX_COL_GAP=0.8)과 행 간격(MATRIX_ROW_GAP=0.3)이 임의 상수로 설정됨. 수식 컨트롤의 문단 내 배치(높이, 너비)가 한컴 편집기와 불일치.

## 2. 목표

- LaTeX vs 한컴 수식 입력 방식 비교 분석 및 개선 방향 수립
- 수식에 최적화된 오픈 라이선스 폰트를 검토하고 적용하여 렌더링 품질 향상
- 수식 컨트롤의 문단 배치, 매트릭스(높이/너비)를 한컴 편집기와 동일한 방식으로 구현

## 3. 현황 분석

### 3.1 수식 입력/편집 현황

- **렌더링**: Rust 수식 엔진 (tokenizer → parser → layout → svg_render/canvas_render)
- **편집 UI**: `equation-editor-dialog.ts` — 한컴 방식 스크립트 직접 편집, 48개 템플릿 버튼, 실시간 SVG 미리보기(300ms 디바운스)
- **WASM API**: `renderEquationPreview()`, `getEquationProperties()`, `setEquationProperties()`
- **입력 방식**: 한컴 수식 스크립트만 지원 (OVER, SQRT, INT 등). LaTeX 문법 미지원

### 3.2 수식 폰트 현황

- `svg_render.rs`: `<text>` 요소에 `font-family` 속성 없음 → 브라우저 기본 serif/sans-serif로 렌더링
- `canvas_render.rs`: Canvas `ctx.font`에도 수식 전용 폰트 미지정
- `font_fallback_strategy.md`: CJK 폰트 폴백 전략은 수립되었으나 수식 폰트는 미포함

### 3.3 수식 레이아웃 현황

- `layout.rs` 상수: `MATRIX_COL_GAP=0.8`, `MATRIX_ROW_GAP=0.3` (font_size 비율)
- 문단 배치: `shape_layout.rs`에서 `eq.common.width/height`(HWPUNIT)를 그대로 사용
- 한컴 편집기와의 치수 비교 미수행 상태

## 4. 구현 단계

### 4.1 단계 구성 (4단계)

#### 1단계: LaTeX vs 한컴 수식 입력 방식 비교 분석

- **문법 비교**: 한컴 방식(OVER, SQRT, INT)과 LaTeX 방식(\frac, \sqrt, \int) 명령어 대응표 작성
- **장단점 분석**:
- 한컴 방식: 한국 사용자 친숙도, 기존 HWP 문서 호환성
- LaTeX 방식: 국제 표준, 학술/과학 커뮤니티 보편성, 풍부한 생태계
- **사용자 요구 분석**: 한컴 포럼 피드백, 학술/과학 분야 사용 패턴 정리
- **현재 파서 확장성 평가**: 기존 tokenizer/parser 구조에서 LaTeX 문법 지원 가능 여부 분석
- **개선 방향 제안**: 듀얼 입력 모드, 자동 변환, LaTeX 입력 레이어 추가 등 전략 비교
- 분석 결과를 `mydocs/tech/equation_latex_comparison.md` 기술 문서로 작성

#### 2단계: 수식 폰트 조사 및 선정

- 오픈 라이선스 수식 폰트 후보 조사
- STIX Two Math (OFL), Latin Modern Math (GUST), XITS Math (OFL), Libertinus Math (OFL), Fira Math (OFL) 등
- 한컴 수식 편집기 기본 폰트(수식용)와의 글리프 대응도 비교
- 그리스 문자, 적분/합 기호, 분수, 첨자 등 핵심 수식 요소의 렌더링 품질 평가
- 최적 폰트 선정 및 근거 문서화

#### 3단계: 수식 폰트 적용

- 선정된 폰트의 font-family 체인 설계
- `svg_render.rs`: 모든 `<text>` 요소에 수식 전용 font-family 적용
- `canvas_render.rs`: Canvas `ctx.font`에 수식 전용 폰트 적용
- 웹 환경 폰트 로딩 방식 결정 (woff2 번들링 vs local() 참조 vs CDN)
- 테스트: 주요 수식 샘플 SVG 출력 비교

#### 4단계: 수식 레이아웃 정밀화

- 한컴 편집기에서 매트릭스 샘플 문서 생성 → rhwp 렌더링 결과와 비교
- `layout.rs` 상수 조정: MATRIX_COL_GAP, MATRIX_ROW_GAP 등을 한컴 기준에 맞춤
- 수식 컨트롤의 문단 내 배치(높이, 너비, 베이스라인) 정밀 조정
- 분수, 첨자, 큰 연산자 등 주요 레이아웃 요소 치수 검증
- 테스트: exam_math.hwp 등 실제 문서 렌더링 비교

## 5. 위험 요소

| 위험 | 대응 |
|------|------|
| LaTeX 문법 지원 시 파서 복잡도 증가 | 1단계는 분석 및 방향 수립까지만 수행, 구현은 별도 타스크 |
| 오픈 라이선스 폰트의 한컴 수식 글리프 대응 부족 | 복수 폰트 후보 비교, 필요 시 폴백 체인 구성 |
| 한컴 수식 레이아웃 내부 로직 비공개 | 실제 문서 렌더링 결과 비교를 통한 역추적 |
| woff2 번들 시 용량 증가 | 서브셋 추출 또는 local() 우선 참조 전략 |

## 6. 검증 방법

- LaTeX vs 한컴 비교 분석 보고서 검토
- `cargo test` 전체 통과
- exam_math.hwp SVG 출력과 한컴 편집기 렌더링 시각 비교
- 매트릭스/분수/첨자 등 주요 수식 요소 치수 측정 비교
139 changes: 139 additions & 0 deletions mydocs/plans/task_m100_139_impl.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
# 구현 계획서: 수식 렌더링 고도화 (분석/방향 수립)

- **타스크**: [#139](https://github.com/edwardkim/rhwp/issues/139)
- **마일스톤**: M100
- **브랜치**: `local/task139`
- **작성일**: 2026-04-14
- **수행계획서**: `mydocs/plans/task_m100_139.md`
- **모드**: 플랜 모드 — 분석/방향 수립만 수행, 실제 구현은 별도 타스크로 분리

## 단계 구성 (4단계)

모든 단계가 분석·조사·방향 수립이며, 소스 코드 수정은 포함하지 않는다.

---

### 1단계: LaTeX vs 한컴 수식 입력 방식 비교 분석

**목표**: 한컴 방식과 LaTeX 방식의 체계적 비교를 통해 수식 입력 개선 방향을 수립한다.

**산출물**: `mydocs/tech/equation_latex_comparison.md`

**작업 내용**:

1. **명령어 대응표 작성**
- 현재 구현된 한컴 명령어(symbols.rs, parser.rs 기반)와 LaTeX 대응 명령어 매핑
- 분류별 정리: 구조, 큰 연산자, 행렬, 그리스 문자, 장식, 기호

2. **GUI 수식 입력 방식 비교**
- 한컴, MS Word, MathType, LyX, rhwp 현재 구현의 GUI 입력 방식 비교
- 편집 위치(인라인 vs 대화상자), 렌더링 방식(WYSIWYG vs 스크립트+미리보기), 구조 삽입 방식 분류

3. **현재 파서 확장성 분석 및 확장 전략 비교**
- (A) 듀얼 토크나이저, (B) 전처리 변환기, (C) 통합 파서

4. **개선 방향 제안서**
- 권장 전략 선정 및 근거, GUI 개선 방향, 향후 타스크 분리 계획

---

### 2단계: 수식 폰트 조사 및 선정

**목표**: 오픈 라이선스 수식 폰트를 비교 평가하여 최적 폰트를 선정한다.

**산출물**: `mydocs/tech/equation_font_selection.md`

**작업 내용**:

1. **후보 폰트 조사**

| 폰트 | 라이선스 | 특징 |
|------|---------|------|
| STIX Two Math | OFL 1.1 | STI Pub 컨소시엄, 광범위 글리프 |
| Latin Modern Math | GUST Font License | TeX 전통 스타일, 학술 표준 |
| XITS Math | OFL 1.1 | STIX 기반 확장 |
| Libertinus Math | OFL 1.1 | Linux Libertine 기반 |
| Fira Math | OFL 1.1 | Fira Sans 기반, 모던 |

2. **글리프 대응도 평가**
- 한컴 수식에서 사용하는 핵심 글리프 커버리지 확인
- 그리스 문자(48종), 수학 기호(200+종), 큰 연산자, 화살표

3. **렌더링 품질 비교**
- 실제 수식 샘플을 각 폰트로 SVG 렌더링하여 품질 평가

4. **최적 폰트 선정 및 font-family 체인 설계**
- 1순위 수식 폰트 + 폴백 체인 구성
- 웹 폰트 배포 방식 결정 (woff2 용량, 서브셋 여부)

---

### 3단계: 수식 폰트 적용 방안 설계

**목표**: 선정된 폰트를 SVG/Canvas 렌더러에 적용하기 위한 구체적 설계를 수립한다.

**산출물**: `mydocs/tech/equation_font_selection.md` 내 적용 방안 섹션 추가

**작업 내용**:

1. **SVG 렌더러 적용 설계**
- `svg_render.rs`의 `<text>` 요소별 font-family 적용 방식 설계
- LayoutKind별(Text, Number, Symbol, MathSymbol, Function) 폰트 매핑 규칙

2. **Canvas 렌더러 적용 설계**
- `canvas_render.rs`의 `ctx.font` 적용 방식 설계

3. **웹 폰트 로딩 설계**
- woff2 번들링 vs local() 참조 vs CDN 방식 비교
- `@font-face` 선언 위치 및 로딩 타이밍 설계

4. **구현 타스크 분리 계획**
- 수정 대상 파일 목록, 변경 범위, 테스트 계획

---

### 4단계: 수식 레이아웃 정밀화 방안 설계

**목표**: 매트릭스/분수/첨자 등 수식 요소의 치수를 한컴 편집기와 동일하게 맞추기 위한 기준값을 조사하고 설계를 수립한다.

**산출물**: `mydocs/tech/equation_layout_spec.md`

**작업 내용**:

1. **한컴 기준값 측정**
- 한컴 편집기에서 매트릭스, 분수, 적분 등 표준 수식 렌더링 → 치수 측정
- 열 간격, 행 간격, 여백, 기호 크기 비율 등 수집

2. **현재 값 vs 한컴 기준값 비교표**
- `MATRIX_COL_GAP` (현재 0.8), `MATRIX_ROW_GAP` (현재 0.3) 등
- `FRAC_LINE_PAD` (현재 0.15), `SCRIPT_SCALE` (현재 0.7), `BIG_OP_SCALE` (현재 1.5)
- 각 상수의 보정 방향과 목표값 제시

3. **문단 배치 분석**
- 수식 컨트롤의 높이/너비 계산 방식 검증
- 베이스라인 정렬, 인라인 수식(treat_as_char=true) 배치 분석

4. **구현 타스크 분리 계획**
- 수정 대상 파일, 변경 범위, 비교 검증 방법

---

## 검증 기준

| 단계 | 검증 항목 |
|------|----------|
| 1단계 | 비교 분석 보고서 품질, 개선 방향 타당성 |
| 2단계 | 폰트 선정 근거 충분성, 글리프 커버리지 |
| 3단계 | 적용 설계의 구체성, 구현 타스크 분리 명확성 |
| 4단계 | 한컴 기준값 측정 정확성, 보정 방향 타당성 |

## 후속 구현 타스크 (별도 분리)

이번 타스크에서 수립한 방향을 기반으로 다음 구현 타스크를 생성한다:

| 후속 타스크 | 내용 | 근거 |
|------------|------|------|
| LaTeX 파서 구현 | 듀얼 토크나이저 방식으로 LaTeX 입력 지원 | 1단계 분석 결과 |
| 수식 폰트 적용 | 선정된 폰트를 SVG/Canvas 렌더러에 적용 | 2~3단계 설계 결과 |
| 수식 레이아웃 보정 | 한컴 기준값으로 레이아웃 상수 조정 | 4단계 측정 결과 |
| 수식 편집 UI 개선 | 듀얼 모드, 자동완성, 템플릿 확장 | 1단계 GUI 분석 결과 |
Loading
Loading