Task #143: LaTeX 명령어 호환 확장 (2차)#729
Conversation
PR edwardkim#563 (1차: \frac, \sqrt) 이후 추가 LaTeX 명령어 지원: - \dfrac, \tfrac → Fraction (display/text 스타일 분수) - \text{...} → FontStyle(Roman) (본문 텍스트) - \mathrm, \mathit, \mathbf → 기존 FontStyleKind 매핑 - \mathbb, \mathcal, \mathfrak, \mathsf, \mathtt → 신규 FontStyleKind 5종 - \overline, \underline, \not → 소문자 DECORATIONS 별칭 (대소문자 호환) - \widehat, \widetilde, \overrightarrow → 기존 DecoKind 매핑 - \textbf, \textrm, \textit → FontStyleKind 매핑 Refs edwardkim#143 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
This PR extends the equation LaTeX-compat layer (following #563) by mapping additional LaTeX commands onto the existing equation AST, plus minimal renderer support for the expanded font-style set.
Changes:
- Map
\dfrac/\tfractoEqNode::Fraction, and add\text{...}handling in the parser. - Expand font-style support with new
FontStyleKindvariants and map common\math*/\text*commands to those styles. - Add lowercase decoration aliases (e.g.,
\overline,\underline,\not,\widehat, etc.) and update SVG/Canvas renderers to handle the new styles.
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated 3 comments.
| File | Description |
|---|---|
src/renderer/equation/symbols.rs |
Adds LaTeX aliases for decorations and font-style command mappings; extends FontStyleKind; updates structure-command set. |
src/renderer/equation/parser.rs |
Adds parsing hooks for \dfrac/\tfrac and \text{...}; introduces LaTeX compatibility test module. |
src/renderer/equation/svg_render.rs |
Adds placeholder rendering behavior for new FontStyleKind variants via italic/bold flag mapping. |
src/renderer/equation/canvas_render.rs |
Mirrors SVG renderer’s new FontStyleKind italic/bold mapping for Canvas output. |
Comments suppressed due to low confidence (1)
src/renderer/equation/symbols.rs:213
is_structure_command()is currently matched against a mix of uppercase and lowercase strings (e.g.,"lim" | "Lim"), but the only call site (parser.rs) passes an uppercased command (to_ascii_uppercase()), so theselimcases can never match. Consider normalizing case insideis_structure_command(or updating the match set to the normalized form, e.g., includeLIM) so the function’s behavior is consistent with its usage.
pub fn is_structure_command(cmd: &str) -> bool {
matches!(cmd,
"OVER" | "ATOP" | "SQRT" | "ROOT" | "FRAC" | "DFRAC" | "TFRAC" | "TEXT" |
"LEFT" | "RIGHT" | "BIGG" |
"MATRIX" | "PMATRIX" | "BMATRIX" | "DMATRIX" |
"CASES" | "PILE" | "LPILE" | "RPILE" |
"CHOOSE" | "BINOM" |
"lim" | "Lim" |
"REL" | "BUILDREL" |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| FontStyleKind::Roman | FontStyleKind::SansSerif | FontStyleKind::Monospace => (false, false), | ||
| FontStyleKind::Italic => (true, bold), | ||
| FontStyleKind::Bold => (italic, true), | ||
| FontStyleKind::Bold | FontStyleKind::Blackboard => (false, true), |
| FontStyleKind::Roman | FontStyleKind::SansSerif | FontStyleKind::Monospace => (false, false), | ||
| FontStyleKind::Italic => (true, bold), | ||
| FontStyleKind::Bold => (italic, true), | ||
| FontStyleKind::Bold | FontStyleKind::Blackboard => (false, true), |
| // LaTeX \text{...} — 로만체 텍스트 | ||
| if cu == "TEXT" { | ||
| let body = self.parse_single_or_group(); | ||
| return EqNode::FontStyle { | ||
| style: FontStyleKind::Roman, | ||
| body: Box::new(body), | ||
| }; | ||
| } |
LaTeX 환경(environment) 구문을 기존 수식 AST로 매핑:
- \begin{pmatrix}...\end{pmatrix} → Matrix(Paren)
- \begin{bmatrix}...\end{bmatrix} → Matrix(Bracket)
- \begin{vmatrix}...\end{vmatrix} → Matrix(Vert)
- \begin{matrix}...\end{matrix} → Matrix(Plain)
- \begin{cases}...\end{cases} → Cases
- \begin{aligned}...\end{aligned} → EqAlign
- \begin{align}...\end{align} → EqAlign
토크나이저: \\ (이중 백슬래시) → Whitespace("#") 변환으로 hwpeq의 # (행 구분)과 동일하게 처리.
Refs edwardkim#143
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
LaTeX 환경(environment) 구문 파싱 추가 커밋 (d53b7ac):
|
native-skia feature 활성화 시 equation_conv.rs의 FontStyleKind 매치에 Blackboard/Calligraphy/Fraktur/SansSerif/Monospace 분기가 누락되어 CI 빌드 실패. svg_render.rs/canvas_render.rs와 동일한 패턴으로 수정. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- FontStyleKind::Bold: 기존 동작 (italic, true) 복원. Blackboard만 upright+bold.
→ bold+italic 중첩 (it {bold {...}}) 정상 동작 보장
- \text{...} 주석에 공백 제한사항 문서화 (토크나이저 skip_spaces)
3개 렌더러 (svg_render, canvas_render, skia/equation_conv) 모두 동일 수정.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
Copilot 리뷰 반영 (0264fe1):
|
LaTeX 수식 입력 호환성을 넓히기 위한 명령어 추가:
기호 별칭 (~60개):
- 관계/논리: \leq, \geq, \neq, \approx, \equiv, \subset, \forall, \exists 등
- 화살표: \rightarrow, \leftarrow, \implies, \iff, \mapsto, \to, \gets 등
- 연산자: \cdot, \times, \div, \pm, \cup, \cap, \oplus, \otimes 등
- 기호: \infty, \nabla, \partial, \emptyset, \dots, \perp 등
- 큰 연산자: \sum, \prod, \int, \iint, \iiint, \oint, \bigcup, \bigcap 등
구조 명령어 (5개):
- \operatorname{...} → 로만체 연산자명 (hwpeq rm 매핑)
- \phantom{...}, \vphantom, \hphantom → 보이지 않는 공간
- \overbrace, \underbrace → hwpeq arch/under 장식 매핑
간격 명령어 (7개):
- \quad, \qquad → em/2em 공백
- \, \: \; \! → thin/medium/thick/negative 공백
- 토크나이저 레벨에서 \+기호 → THINSPACE 등 명령어 변환
함수명 (6개): \sup, \inf, \lim, \limsup, \liminf, \Pr
테스트: latex_compat_tests 모듈에 11개 추가 (총 29개)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
LaTeX 호환 명령어 대폭 확장 (45fdb33): 기호 별칭 ~60개: 관계(\leq, \geq, \equiv), 화살표(\rightarrow, \implies), 연산자(\cdot, \times, \cup), 기호(\infty, \nabla, \partial, \emptyset), 큰 연산자(\sum, \prod, \int) 등 LaTeX에서 자주 사용하는 소문자 명령어를 hwpeq 기호 테이블에 매핑. 구조 명령어 5개: \operatorname, \phantom/\vphantom/\hphantom, \overbrace/\underbrace 간격 명령어 7개: \quad, \qquad, , : ; ! — 토크나이저 레벨에서 테스트 11개 추가 (총 29개 LaTeX 호환 테스트). 전체 1310 테스트 통과, clippy 경고 0건. |
구조 명령어 추가:
- \overset{over}{base} → Superscript AST (위 첨자로 매핑)
- \underset{under}{base} → Subscript AST (아래 첨자로 매핑)
- \stackrel{over}{base} → Superscript AST
LaTeX 환경 추가:
- \begin{array}...\end{array} → Plain Matrix
- \begin{smallmatrix}...\end{smallmatrix} → Plain Matrix
- \begin{Bvmatrix}...\end{Bvmatrix} → Vert Matrix (이중 세로선)
- \begin{split}, \begin{gather}, \begin{gathered} → EqAlign
테스트 6개 추가 (총 35개 LaTeX 호환 테스트)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
토크나이저:
- \{ → LBrace, \} → RBrace (LaTeX 이스케이프 중괄호)
- \| → Symbol(|), \# → Whitespace(#)
괄호 별칭 추가:
- \langle/\rangle → ⟨/⟩ (각도 괄호)
- \lbrace/\rbrace → {/} (소문자 별칭)
- \lceil/\rceil, \lfloor/\rfloor (소문자 별칭)
- \lvert/\rvert → |, \lVert/\rVert → ‖
테스트 2개 추가 (총 37개 LaTeX 호환 테스트)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
추가 커밋 2건: d672f95 — \overset/\underset/\stackrel + 환경 확장
0418751 — LaTeX 이스케이프 중괄호 + 각도 괄호
현재 LaTeX 호환 테스트 37개, 전체 1204+ 테스트 통과. |
|
@edwardkim 안녕하세요, assign 해주셔서 감사합니다. 이슈 #143의 원래 설계는 현재 커버리지: LaTeX 구조 명령어 8개 + 기호 별칭 80+ + 환경 9종 + 간격/괄호 지원, 테스트 37개. 혹시 듀얼 토크나이저 방식을 그대로 가져가시고 싶으시면 말씀 부탁드립니다 — 기존 파서 확장 방식이 괜찮으시다면 이 방향으로 계속 커버리지를 넓혀가겠습니다. 감사합니다. |
기존 파서 확장 방식으로 진행하시는 것을 권고드립니다. |
|
감사합니다! 기존 파서 확장 방식으로 확정하고 PR description을 `Closes #143`으로 업데이트했습니다. 한 가지 남은 항목: 이슈 스펙의 "UI 명시적 모드 토글"은 rhwp-studio 프론트엔드 범위라 이 PR 스코프 밖입니다. 필요하시면 별도 이슈로 분리해주시면 작업하겠습니다. |
PR #729 (@oksure) 영역 7 commits 영역 영역 squash cherry-pick (개별 cherry-pick 영역 영역 commit 영역 영역 의 부분 변경 누적 영역 영역 충돌 발생 영역 영역 영역 PR HEAD 영역 영역 squash 채택 — devel HEAD 영역 영역 PR HEAD 영역 영역 최종 diff 영역 영역 단일 commit 영역 적용 영역). 원본 commits: - 0418751 feat: LaTeX 이스케이프 중괄호 + 각도 괄호 지원 - d672f95 feat: \overset/\underset/\stackrel + 환경 확장 - 45fdb33 feat: LaTeX 호환 명령어 대폭 확장 - 0264fe1 fix: Copilot 리뷰 반영 — Bold italic 보존 + \text 공백 제한 문서화 - 69b0b84 fix: Skia renderer FontStyleKind 매치 누락 수정 (CI 빌드 실패 수정) - d96ddcc Task #143: LaTeX 명령어 호환 확장 (2차) - d53b7ac Task #143: LaTeX \begin{env}...\end{env} 환경 파싱 (3차) 본질 (6 files, +735/-11): - symbols.rs (+87/-5): FontStyleKind 5개 추가 (Blackboard/Calligraphy/Fraktur/SansSerif/Monospace) + 기호 별칭 ~80개 - parser.rs (+599/-3): 구조 명령어 (\frac/\dfrac/\tfrac/\text/\operatorname/\binom/\overset/\underset/\stackrel/\phantom) + 환경 파싱 (pmatrix/bmatrix/cases/aligned/array/smallmatrix/split) + LaTeX 호환 테스트 41건 신규 - tokenizer.rs (+40): \\, \, \: \; \!, \{, \}, \|, \# 영역 영역 LaTeX 이스케이프 토큰화 - canvas_render.rs / svg_render.rs / skia/equation_conv.rs (+9/-3): FontStyleKind 5개 영역 exhaustive match 동기 정정 회귀 가드: - test_hwpeq_not_regressed (hwpeq 회귀 가드) — 신규 - 기존 hwpeq 문법 영역 영역 회귀 부재 보장 closes #143
PR #729 (@oksure) 옵션 A 처리 — 7 commits squash cherry-pick (개별 cherry-pick 영역 영역 commit 영역 영역 의 부분 변경 누적 영역 영역 충돌 발생 영역 영역 영역 PR HEAD 영역 squash 채택) + no-ff merge. 본질 정정 (6 files, +735/-11): - src/renderer/equation/symbols.rs (+87/-5): FontStyleKind 5개 추가 (Blackboard/Calligraphy/Fraktur/SansSerif/Monospace) + 기호 별칭 ~80개 (관계/논리/화살표/연산자/큰 연산자/기호/함수/장식/괄호) - src/renderer/equation/parser.rs (+599/-3): 구조 명령어 (\frac/\dfrac/\tfrac/\text/\operatorname/\binom/\overset/\underset/\stackrel/\phantom) + 환경 파싱 (pmatrix/bmatrix/cases/aligned/array/smallmatrix/split) + LaTeX 호환 테스트 41건 신규 - src/renderer/equation/tokenizer.rs (+40): \\, \, \: \; \!, \{, \}, \|, \# 영역 LaTeX 이스케이프 토큰화 - src/renderer/equation/canvas_render.rs / svg_render.rs / skia/equation_conv.rs (+9/-3): FontStyleKind 5개 영역 exhaustive match 동기 정정 채택 접근: - 메인테이너 권고 영역 영역 듀얼 토크나이저 (별도 파일) → 기존 파서 확장 채택 — 신규 인프라 도입 부재 영역 영역 위험 좁힘 회귀 가드: - test_hwpeq_not_regressed (hwpeq 회귀 가드) — 신규 - equation 모듈 114 PASS (43 → 84 신규 41건 + tokenizer/symbols 영역) 자기 검증: - cargo build/test --release ✅ ALL GREEN - cargo test --lib renderer::equation ✅ 114 PASS - cherry-pick: 개별 영역 영역 충돌 발생 영역 영역 영역 PR HEAD squash 영역 영역 단일 commit 영역 영역 적용 영역 (충돌 0건) - 광범위 sweep: 7 fixture / 170 페이지 / **168 same / 2 diff** (exam_math_014/016.svg) → 회귀 본질: `inf`/`sup`/`lim` 영역 영역 FUNCTIONS HashMap 영역 영역 추가 영역 영역 영역 lookup 우선 매칭 영역 영역 회귀 영역 영역 — exam_math.hwp 영역 영역 hwpeq script 영역 영역 영역 `inf` 영역 영역 ∞ 기호 영역 영역 영역 의미 영역 영역 영역 영역 LaTeX 영역 영역 영역 inf (infimum 함수) 영역 영역 영역 의미 영역 영역 충돌 - WASM 빌드 4.61 MB - 작업지시자 시각 검증: ⓐ LaTeX 입력 (samples/equation-lim.hwp 영역) ✅ 통과 ⓑ exam_math p14/16 회귀 확인⚠️ 처리 결정 (PR #723 영역 영역 (c) 패턴 정합): - PR #729 머지 유지 (LaTeX 본질 확장 영역 영역 보존 영역 영역 본질 통과 영역) - exam_math 회귀 정정 영역 영역 후속 PR 영역 영역 통합 처리 영역 으로 묶음 (`feedback_pr_supersede_chain` 영역 영역 (c) 패턴) 후속 분리 (PR 본문 명시): - UI 명시적 모드 토글 — rhwp-studio (프론트엔드) 범위 영역 별건 이슈 closes #143
- mydocs/pr/archives/pr_729_review.md: 검토 문서 archives 이동 - mydocs/pr/archives/pr_729_report.md: 처리 보고서 작성 · LaTeX 명령어 호환 확장 (FontStyleKind 5개 + 구조 명령어 + 환경 파싱 + 기호 별칭 ~80개) · PR HEAD squash cherry-pick (7 commits → 1 commit `f65ffd03`) · equation 모듈 114 PASS · 작업지시자 시각 검증: LaTeX 입력 ✅ + exam_math p14/16 회귀⚠️ · 처리 결정: 머지 유지 + Issue #762 후속 PR 통합 (PR #723 영역 (c) 패턴) - mydocs/orders/20260510.md: PR #729 항목 추가 (5/10 사이클 영역 영역 5건 처리)
|
@oksure 님, 검토 + 머지 완료했습니다. 처리 결과옵션 A (PR HEAD squash cherry-pick + no-ff merge `eb3f9fd4`) 로 처리. 본 환경 영역 영역 영역 7 commits 영역 영역 개별 cherry-pick 영역 영역 commits 영역 영역 누적 변경 영역 영역 충돌 발생 영역 영역 영역 PR HEAD squash cherry-pick (`f65ffd03`) 영역 영역 단일 commit 영역 영역 적용 (충돌 0건). 7 commits 영역 영역 의 의미 (feat 3 + fix 2 + Task 2) 영역 영역 squash commit message 영역 영역 보존. 자기 검증
작업지시자 시각 검증✅ LaTeX 본질 — 통과`samples/equation-lim.hwp` 예제 영역 LaTeX 형식 수식 입력 테스트 ✅ 통과 — PR 본질 정합 입증.
|
듀얼모드 구현을 위한 UI 명시적 모드 토글은 별도 이슈로 등록하겠습니다. |
|
@oksure 님, UI 명시적 모드 토글 영역 별도 이슈 등록 완료했습니다. → #763 rhwp-studio 영역 LaTeX 입력 모드 영역 UI 명시적 모드 토글 (#143 듀얼 모드 후속) 작업 진행 시 assignee 지정 부탁드립니다. |
PR #730 (@oksure) 영역 5 commits 영역 squash cherry-pick (개별 cherry-pick 영역 영역 commits 영역 영역 누적 변경 영역 영역 충돌 발생 영역 영역 PR HEAD 영역 squash 채택 — PR #729 영역 영역 동일 패턴). 원본 commits: - 7a54437 Task #172: section.xml 컨트롤 디스패처 — 표/그림/도형 직렬화 연결 - 99c8ac6 Task #172: 각주/미주 디스패처 연결 — Footnote/Endnote subList 문단 직렬화 - 328b00e fix: Copilot 리뷰 반영 — 에러 로깅, Cursor 제거, ShapeObject::Picture 위임 - 815759b fix: 인라인 컨트롤 직렬화 게이트 수정 + 라운드트립 테스트 추가 - ec0b509 feat: drawText 글상자 직렬화 + 실문서 라운드트립 검증 테스트 본질 (5 files, +619/-37): - src/serializer/hwpx/section.rs (+159/-33): render_run_content / render_control_slot 디스패처 확장 — Equation-only 게이트 영역 → slots.is_empty() 영역 영역 Table/Picture/Shape/Footnote/Endnote 모두 직렬화. 각주/미주 영역 <hp:ctrl> 래퍼 + <hp:subList> 재귀 문단. is_hwpx_inline_slot 영역 Footnote/Endnote 추가 - src/serializer/hwpx/mod.rs (+210/-2): 라운드트립 테스트 4건 신규 (picture_bindata / table_control / footnote_endnote / tac_img_sample) - src/serializer/hwpx/shape.rs (+122/-2): drawText 글상자 직렬화 + Rectangle 영역 영역 의 Writer-based serializer - src/serializer/hwpx/context.rs (+19): collect_from_document 영역 인라인 Table 영역 borderFillIDRef 1-pass 사전 등록 - tests/hwpx_roundtrip_integration.rs (+109): stage5_table_control / stage5_picture_bindata / stage5_footnote_endnote / stage5_tac_img_sample 영역 4건 신규 Issue #172 체크리스트 6 항목 모두 커버: - [x] 표 (Control::Table) → <hp:tbl> - [x] 그림 (Control::Picture) → <hp:pic> + BinData - [x] 도형 (Control::Shape) → 변형별 공통 속성 - [x] 각주/미주 → <hp:footNote/endNote> + <hp:subList> - [x] BinData ZIP 엔트리 (mod.rs 기존 활용) - [x] content.hpf manifest 자동 등록 (mod.rs 기존 활용) Copilot 리뷰 반영 (commit 328b00e): - 에러 로깅 (eprintln 영역 조용한 누락 방지) - Cursor 제거 (Writer<Vec<u8>> 직접) - ShapeObject::Picture 위임 (picture::write_picture)⚠️ 한컴 호환 검증 한계: - 자기 라운드트립 영역 영역 만 입증 (parse → serialize → parse) - 한컴 호환 영역 영역 입증 부재 — 작업지시자 한컴2020/2022 검증 게이트 권장 - feedback_self_verification_not_hancom 정합 closes #172
PR #730 (@oksure) 옵션 A 처리 — PR HEAD squash cherry-pick + no-ff merge. 본질 정정 (5 files, +619/-37): - src/serializer/hwpx/section.rs (+159/-33): render_run_content / render_control_slot 디스패처 확장 — Equation-only 게이트 영역 → slots.is_empty() 영역 영역 Table/Picture/Shape/Footnote/Endnote 모두 직렬화. 각주/미주 영역 <hp:ctrl> 래퍼 + <hp:subList> 재귀 문단. is_hwpx_inline_slot 영역 Footnote/Endnote 추가 - src/serializer/hwpx/mod.rs (+210/-2): 라운드트립 테스트 4건 신규 - src/serializer/hwpx/shape.rs (+122/-2): drawText 글상자 직렬화 + Rectangle 영역 영역 의 Writer-based serializer - src/serializer/hwpx/context.rs (+19): collect_from_document 영역 인라인 Table 영역 borderFillIDRef 1-pass 사전 등록 - tests/hwpx_roundtrip_integration.rs (+109): stage5_table_control / stage5_picture_bindata / stage5_footnote_endnote / stage5_tac_img_sample 영역 4건 신규 Issue #172 체크리스트 6 항목 모두 커버: - [x] 표 (Control::Table) → <hp:tbl> - [x] 그림 (Control::Picture) → <hp:pic> + BinData - [x] 도형 (Control::Shape) → 변형별 공통 속성 - [x] 각주/미주 → <hp:footNote/endNote> + <hp:subList> - [x] BinData ZIP 엔트리 (mod.rs 기존 활용) - [x] content.hpf manifest 자동 등록 (mod.rs 기존 활용) Copilot 리뷰 반영 (commit 328b00e): 에러 로깅 + Cursor 제거 + ShapeObject::Picture 위임. 자기 검증: - cherry-pick: PR HEAD squash 채택 (개별 commits 영역 영역 누적 변경 충돌 영역 영역 squash, PR #729 동일 패턴) - cargo build/test --release ✅ ALL GREEN - cargo test hwpx_roundtrip_integration ✅ **17 PASS** (신규 4건 + 기존 13건) - 광범위 sweep 7 fixture / 170 페이지 / **회귀 0** ✅ - WASM 빌드 4.61 MB 판정 게이트: - **라운드트립 테스트 17 PASS** ✅ 영역 영역 본 PR 영역 영역 의 판정 게이트 (작업지시자 결정) - 한컴 호환 영역 영역 영역 영역 후속 작업 영역 영역 (작업지시자 한컴 검증 영역 영역 별건 진행 가능) - feedback_self_verification_not_hancom 영역 영역 본 PR 영역 영역 영역 자기 검증 영역 영역 게이트 채택 영역 (라운드트립 광범위 + 신규 4건 영역 영역 결정적 입증) closes #172
PR #738 (@oksure) 옵션 A 처리 — 2 commits cherry-pick + no-ff merge. 본질 정정 (2 files, +601/-98): - rhwp-studio/src/ui/equation-editor-dialog.ts (+447/-91): · HWP ↔ LaTeX 듀얼 입력 모드 (InputMode = 'hwp' | 'latex' + setMode/toggleMode) · 타이틀바 모드 토글 버튼 + 기존 스크립트 영역 영역 \명령어 존재 시 LaTeX 모드 자동 시작 · 탭 기반 130+ 템플릿 (7 탭: 구조/그리스/연산자/화살표/함수/장식/특수) · 명령어 자동완성 드롭다운 (2자 이상 입력 시 활성화, ↑↓ 선택 / Tab+Enter 확정 / Esc 닫기, 기호+이름+그룹 표시) · 기호 검색 (이름/유니코드 → 커서 위치 삽입) · LaTeX 전환 힌트 (HWP 모드 영역 \ + 영문자 감지 → 안내 배너) - rhwp-studio/src/styles/dialogs.css (+154/-7): 신규 UI 요소 영역 CSS (모드 토글 / 탭 / 자동완성 / 검색 / LaTeX 힌트) Copilot 리뷰 반영 (commit `f4636679`): LaTeX 모드 자동완성 정정 — 모드별 insert 분리 + 빈 name 방지 + 백슬래시 중복 제거. 백엔드 변경 부재: - Rust 수식 파서 영역 영역 PR #729 (closes #143) 영역 영역 양 구문 처리 영역 영역 활용 - WASM 변경 부재 — TypeScript + CSS 만 자기 검증: - cherry-pick 충돌 0건 - tsc --noEmit ✅ 통과 - 광범위 sweep 7 fixture / 170 페이지 / 회귀 0 ✅ (TypeScript 영역 영역 SVG 무영향 입증) - WASM 빌드 4.66 MB - 작업지시자 시각 판정 ✅ 통과 (dev server 영역 영역 모드 토글 / 자동완성 / 탭 템플릿 / 기호 검색 / LaTeX 힌트 5개 영역 영역 정합) PR supersede 체인 (a) 패턴 — close+통합 머지: - PR #738 영역 영역 PR #765 (closes #763, 5/9 19:35 등록, 동일 컨트리뷰터 @oksure) 영역 영역 의 본질 (UI 모드 토글) 영역 영역 완전 포함 - PR #765 영역 영역 close + Issue #763 close (PR #738 영역 영역 통합 영역 영역 명시) closes #144 관련: PR #765 (closes #763) — PR #738 영역 영역 supersede ((a) 패턴)
- mydocs/pr/archives/pr_738_review.md: 검토 문서 archives 이동 - mydocs/pr/archives/pr_738_report.md: 처리 보고서 작성 · 수식 편집 UI 개선 (듀얼 모드 + 자동완성 + 탭 130+ 템플릿 + 기호 검색 + LaTeX 힌트) · 백엔드 변경 부재 (PR #729 영역 영역 Rust 수식 파서 활용) · 작업지시자 시각 판정 ✅ 통과 · feedback_pr_supersede_chain (a) 패턴 권위 사례 — PR #738 영역 PR #765 (closes #763) supersede - mydocs/orders/20260510.md: PR #738 항목 추가 (5/10 사이클 영역 영역 11건 처리)
PR #729 (Task #143 LaTeX 호환 확장 1차, 5/9 머지) 회귀 정정 — FUNCTIONS HashMap 영역 ('inf', 'inf') 추가 영역 기존 hwpeq inf → ∞ 매핑이 함수 텍스트로 대체됨. 정정 (parser.rs +36/-7): lookup_symbol (Unicode 기호) 영역 is_function (함수명) 영역 먼저 점검: - inf → ∞ (기존 동작 복원) - deg → ° (기존 동작 복원) - sin/cos/log 등 → 함수 처리 (정합) 회귀 가드 테스트 2건 추가: - test_hwpeq_inf_remains_symbol - test_hwpeq_deg_remains_symbol 본 환경 head commit 만 cherry-pick (옵션 1) — PR 본문 영역 본질 (Issue #762 정정) 만 적용, commit 6~8 (Task #143 추가 LaTeX 확장) 영역 별 본질 영역 별 PR 안내. 검증: - cargo build/test/clippy --release ALL GREEN (clippy -D warnings) - 회귀 가드 2건 PASS - 광범위 sweep 168 same / 2 diff (exam_math_014/016 — 의도된 시각 변경: ∞ 기호 복원, PR 본문 정합) - WASM 4.66 MB 재빌드 - 작업지시자 시각 판정 ✅ 통과 이전 abandon (Service Worker 캐시 결함) 영역 다시 시도 — 본 환경 영역 정합 진행. closes #762
요약
기존 hwpeq 토크나이저/파서를 확장하여 LaTeX 수식 명령어 호환성을 대폭 강화합니다. PR #563에서 도입된 LaTeX 토큰화 기반 위에, 구조 명령어·기호 별칭·환경 파싱을 추가합니다.
접근 방식
이슈 #143의 원래 설계는 듀얼 토크나이저(별도 파일)였으나, 메인테이너 권고에 따라 기존 파서 확장 방식으로 진행합니다. LaTeX
\command구문이 기존 hwpeq와 같은 파서에서 공존하므로 별도 모드 전환 없이 혼용 가능합니다.변경 내용
1. FontStyleKind 확장 (
symbols.rs,ast.rs)2. 구조 명령어 (parser.rs)
3. 기호 별칭 (~80개, symbols.rs)
4. 간격 명령어 (tokenizer.rs + parser.rs)
\+ 비알파벳 → 명령어 토큰 변환5. 괄호/구분자 (tokenizer.rs + symbols.rs)
6. 장식 확장 (symbols.rs)
7. \\ 줄바꿈 (tokenizer.rs)
\\→ hwpeq#행 구분자로 변환 (행렬·정렬 환경 호환)테스트
Closes #143