Skip to content

fix: LaTeX 분수 수식 미리보기 파싱 보정 (#143 1차)#563

Closed
cskwork wants to merge 1 commit into
edwardkim:mainfrom
cskwork:task143-latex-frac-preview
Closed

fix: LaTeX 분수 수식 미리보기 파싱 보정 (#143 1차)#563
cskwork wants to merge 1 commit into
edwardkim:mainfrom
cskwork:task143-latex-frac-preview

Conversation

@cskwork

@cskwork cskwork commented May 4, 2026

Copy link
Copy Markdown
Contributor

요약

  • LaTeX 입력 \frac{1}{2}가 수식 미리보기에서 문자 그대로 보이던 문제를 보정
  • 백슬래시로 시작하는 LaTeX 명령어를 기존 Command 토큰 흐름에 태우도록 토크나이저 보강
  • \frac{a}{b}를 기존 EqNode::Fraction으로 파싱하도록 연결
  • \sqrt{...}\sqrt[n]{...} 입력이 기존 제곱근 AST로 이어지는지 회귀 테스트 추가

Refs #143

배경

Issue #143은 LaTeX 입력 지원 전체를 다루는 큰 작업이다.

현재 수식 파서는 한컴 수식 문법(1 over 2, SQRT x 등)을 중심으로 동작하고 있고, LaTeX 형식의 \frac{1}{2} 같은 입력은 기존 수식 미리보기에서 정상적인 분수 구조로 연결되지 않았다.

이 PR은 전체 LaTeX 파서를 구현하지 않고, 미리보기에서 가장 눈에 띄는 기본 구조인 분수와 제곱근 입력만 기존 AST에 연결하는 1차 보정이다.

현상

기존 코드에서 \frac{1}{2}를 파싱하면 기대한 EqNode::Fraction이 아니라 다음과 같은 문자 조합으로 해석됐다.

Row([Text("\\"), Text("frac"), Number("1"), Number("2")])

그 결과 사용자가 LaTeX 분수를 입력해도 미리보기에는 분수선이 있는 수식이 아니라 \frac 텍스트에 가까운 형태로 보였다.

근본 원인

src/renderer/equation/tokenizer.rs가 백슬래시를 LaTeX 명령어 prefix로 처리하지 않았다.

토큰 흐름상 \frac가 하나의 명령어로 들어와야 parse_command()frac를 구조 명령으로 처리할 수 있는데, 기존에는 \frac가 분리되어 파서가 LaTeX 분수 명령을 인식할 수 없었다.

해결책

1. LaTeX 명령어 토큰화

src/renderer/equation/tokenizer.rsread_latex_command()를 추가했다.

백슬래시 뒤에 ASCII alphabetic 문자가 이어지는 경우:

  • \fracTokenType::Command, value frac
  • \sqrtTokenType::Command, value sqrt
  • \pmTokenType::Command, value pm

으로 기존 명령어 파서 경로에 연결한다.

2. LaTeX 분수 파싱

src/renderer/equation/parser.rs에서 FRAC 명령을 만나면 다음 두 그룹을 분자/분모로 읽어 기존 AST에 매핑한다.

\frac{a}{b} → EqNode::Fraction { numer: a, denom: b }

3. LaTeX indexed sqrt 보강

기존 SQRT 파싱 흐름에 LaTeX 형태의 index 문법을 추가했다.

\sqrt[3]{x} → EqNode::Sqrt { index: Some(3), body: x }

검증

신규 회귀 테스트

src/renderer/equation/tokenizer.rs

  • test_latex_command_prefix
    • \frac{1}{2}Command("frac"), brace, number 토큰으로 분해되는지 확인

src/renderer/equation/parser.rs

  • test_latex_frac
    • \frac{1}{2}EqNode::Fraction으로 파싱되는지 확인
  • test_latex_quadratic_slice
    • x=\frac{-b \pm \sqrt{b^2}}{2a}에서 Fraction, ±, Sqrt가 모두 AST에 들어가는지 확인
  • test_latex_sqrt_with_bracket_index
    • \sqrt[3]{x}가 index 포함 Sqrt로 파싱되는지 확인

테스트 실행 결과

  • cargo test --lib test_latex 통과
    • 4 passed, 0 failed
  • cargo test --lib equation 통과
    • 76 passed, 0 failed
  • cargo test --lib 통과
    • 1106 passed, 0 failed, 1 ignored
  • cargo build --lib 통과
  • git diff --check HEAD~1..HEAD 통과

GitHub Actions

  • Build & Test 통과
  • Analyze Rust/Python/JS-TS 통과
  • Canvas visual diff 통과
  • CodeQL 통과
  • WASM Build는 workflow 조건상 skipped

시각 검증

다음 스크린샷에서 \frac{1}{2}x=\frac{-b \pm \sqrt{b^2}}{2a}가 분수/제곱근 형태로 렌더링되는 것을 확인했다.

  • mydocs/working/task_m100_143_stage1/latex_equation_preview.png

의도된 동작 변경

앞으로 백슬래시가 붙은 기본 LaTeX 명령어는 가능한 경우 기존 한컴 수식 AST 흐름으로 연결된다.

예:

  • \frac{1}{2}는 문자 \frac가 아니라 분수로 렌더링
  • \sqrt{b^2}는 기존 제곱근 노드로 렌더링
  • \sqrt[3]{x}는 index 포함 제곱근으로 렌더링

비-목표

이 PR은 Issue #143 전체를 닫지 않는다.

다음 범위는 후속 작업 대상이다.

  • LaTeX 환경 블록 파싱
  • 수식 편집 UI 모드 전환
  • 광범위한 LaTeX alias 지원
  • full LaTeX parser 수준의 문법 호환성

변경 파일

파일 변경
src/renderer/equation/tokenizer.rs 백슬래시 prefix LaTeX 명령어 토큰화 추가, 회귀 테스트 추가
src/renderer/equation/parser.rs \frac 분수 파싱 및 \sqrt[n] index 파싱 추가, 회귀 테스트 추가
mydocs/orders/20260504.md 작업 지시 기록
mydocs/plans/task_m100_143.md 작업 계획
mydocs/plans/task_m100_143_impl.md 구현 계획
mydocs/working/task_m100_143_stage1.md 단계별 작업 기록
mydocs/report/task_m100_143_report.md 최종 보고서
mydocs/working/task_m100_143_stage1/latex_equation_preview.png 시각 검증 스크린샷

Test plan

  • cargo test --lib test_latex
  • cargo test --lib equation
  • cargo test --lib
  • cargo build --lib
  • git diff --check HEAD~1..HEAD
  • GitHub Actions 확인
  • 수식 미리보기 스크린샷 확인

메타

@cskwork cskwork changed the title Task #143: LaTeX fraction preview support fix: LaTeX 분수 수식 미리보기 파싱 보정 (#143 1차) May 4, 2026
@cskwork cskwork marked this pull request as ready for review May 4, 2026 03:49
edwardkim added a commit that referenced this pull request May 4, 2026
@edwardkim

Copy link
Copy Markdown
Owner

@cskwork 님, rhwp 에 첫 PR 이시군요 — 환영합니다.

본 PR 의 단일 commit d5c7a22 를 본 환경 devel 에 cherry-pick 으로 통합했습니다 (7bdc111 merge commit).

통합 결과

8 file (+333) — tokenizer.rs + parser.rs 본질 변경 + Stage 1 + 계획서/구현계획서/최종보고서 + 시각 검증 스크린샷.

orders 영역에 사소한 충돌이 있어 본 환경의 PR 처리 표 형태로 통합했습니다 (옵션 C — 컨트리뷰터의 "수식 파서" 섹션은 본 환경 orders 컨벤션과 형태가 달라, PR #563 항목 자체로 통합). 본질 영역은 충돌 0 자동 머지.

본질 평가 — 정합

1차 보정의 명시적 한정

PR 본문에서 Refs #143 (closes 가 아님) + "비-목표: Issue #143 전체를 닫지 않는다" 명시 → Issue #143 의 듀얼 토크나이저 설계와 본 PR 의 hybrid 접근의 차이를 인지하고 1차 보정으로 자체 한정. 향후 latex_tokenizer.rs + latex_parser.rs 듀얼 토크나이저 전환 가능성 보존.

코드 안전성

  • 백슬래시 + alphabet 만 LaTeX 인식\\ 단독이나 \ + 비-alphabet 은 기존 동작 유지
  • 기존 한컴 분기 보존SQRT / OVER / MATRIX 모두 그대로. \fracToken("frac")cu = uppercase("frac") = "FRAC" 로 새 분기 (대문자 비교 활용 정합)
  • \sqrt[n]{x} LBracket 분기만 추가SQRT(n) of x 의 LParen 분기 보존
  • 회귀 테스트 4개test_latex_command_prefix (tokenizer) + test_latex_frac / test_latex_quadratic_slice / test_latex_sqrt_with_bracket_index (parser)

작업지시자 절차

Stage 1 + 계획서 + 구현계획서 + 최종보고서 + 시각 검증 스크린샷 완비 — 본 프로젝트의 하이퍼-워터폴 단계 절차에 정합한 모범 사례입니다.

결정적 검증

게이트 결과
cargo test --lib --release ✅ 1129 passed (+4 신규 GREEN, 회귀 0)
cargo test ... equation ✅ 77 passed
cargo test ... test_latex ✅ 4 passed
cargo test --test svg_snapshot ✅ 6/6 (회귀 0)
cargo clippy --lib --release -- -D warnings ✅ 0
CI (Canvas visual diff 포함) ✅ All SUCCESS

시각 판정 — 메인테이너 통과 확인

mydocs/working/task_m100_143_stage1/latex_equation_preview.png 의 두 케이스 (\frac{1}{2} 분수선 + x=\frac{-b \pm \sqrt{b^2}}{2a} 분수+루트+±) 모두 분수/제곱근 형태로 정합하게 렌더링되는 것을 메인테이너가 직접 확인했습니다.

다음 PR 시 안내

본 PR 의 base 가 main 이라 본 환경 룰 (PR base=devel) 상 BLOCKED 였습니다 (cherry-pick 으로 우회). 다음 PR 시작 전:

git fetch upstream
git checkout devel
git merge --ff-only upstream/devel
git push origin devel
git checkout -b local/task{N}

Issue #143 후속 권장

본 PR 의 1차 보정 본질을 보존한 위에서 Issue #143 의 본 설계 (듀얼 토크나이저 — latex_tokenizer.rs + latex_parser.rs + UI 모드 토글 + ast.rs FontStyleKind 확장) 는 별도 사이클로 진행하면 좋겠습니다. 본 PR 의 hybrid 분기는 그 시점에 자연스럽게 듀얼로 마이그레이션 가능합니다.

본 PR 은 cherry-pick 통합 완료로 close 합니다. Issue #143 은 OPEN 유지 (후속 듀얼 토크나이저 사이클). 다음 PR 도 기다리겠습니다.

@edwardkim edwardkim closed this May 4, 2026
edwardkim added a commit that referenced this pull request May 5, 2026
PR #599 (refs #536, @seo-rii) 1차 검토 — render P4 native Skia PNG raster backend:
- 본 환경 정체성 정합 (project_dtp_identity — DTP 엔진 + 다층 레이어 토대)
- PR base skew 73 commits (eaac8bd, 5/4 PR #563 후속) — 단순 머지 시 본 사이클
  cherry-pick 처리분 모두 revert 위험
- 그러나 본질 영역 (src/renderer/skia/ + layer_renderer.rs + image_conv.rs)
  이 본 사이클 처리분과 0 중첩 → commit 단위 cherry-pick 가능
- 9 commits 순차 cherry-pick test: 모두 충돌 0 + cargo test --lib --release
  1134 passed (회귀 0) + cargo test --features native-skia skia 20 passed +
  clippy 0건
- native-skia feature gate (기본 빌드 영향 없음, opt-in)

권장 처리: 옵션 A — 9 commits 순차 cherry-pick (단순 머지 절대 금지) +
결정적 검증 + Skia feature 테스트 + WASM check + PNG 내보내기 게이트웨이.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants