증상
samples/exam_kor.hwp 1페이지 좌측 단에서 pi=1("밑줄 긋기는 일상적으로...") → pi=2("통상적으로 독자는...") 전환 간격이 같은 단락 내 줄 간격보다 좁게 렌더링됨.
| 측정 |
값 |
기대 |
| pi=1 단락 내 줄 step |
24.51 px |
24.51 px (= lh+ls = 1838 HU) |
| pi=1.line9 → pi=2.line0 step |
15.34 px |
24.51 px |
| 누락량 |
-9.17 px |
(= ls = 688 HU) |
PDF (한컴 렌더링) 은 모든 줄 step 이 12.96 pt 로 균일.
원인
src/renderer/layout/paragraph_layout.rs:2511-2520 의 is_para_last_line 분기가 단락 마지막 visible 줄에서 trailing line_spacing 을 제외하고 y 를 lh 만 전진시킴. 이 y 가 layout_paragraph 의 반환값으로 전달되어 다음 단락의 y_start 를 결정하므로, 다음 단락 첫 줄이 ls 만큼 위로 당겨짐.
let is_para_last_line = cell_ctx.is_none()
&& line_idx + 1 == end
&& end == composed.lines.len();
if (is_cell_last_line && cell_ctx.is_some()) || is_para_last_line {
y += line_height; // ← trailing ls 누락
} else {
y += line_height + line_spacing_px;
}
Task #332 에서 도입된 로직. 같은 페이지의 pi=2→pi=3 가 정상으로 보이는 것은 composed.lines.len() 이 LineSeg 수와 달라 is_para_last_line 이 false 로 잡힌 우연일 가능성이 큼 → 매우 불안정한 동작.
해결 방향 (옵션 A)
is_para_last_line 분기를 제거하고 모든 줄에서 y += lh + ls 를 적용. Task #332 회귀 여부는 자동 테스트 + 시각 비교로 검증.
증상
samples/exam_kor.hwp1페이지 좌측 단에서 pi=1("밑줄 긋기는 일상적으로...") → pi=2("통상적으로 독자는...") 전환 간격이 같은 단락 내 줄 간격보다 좁게 렌더링됨.PDF (한컴 렌더링) 은 모든 줄 step 이 12.96 pt 로 균일.
원인
src/renderer/layout/paragraph_layout.rs:2511-2520의is_para_last_line분기가 단락 마지막 visible 줄에서 trailingline_spacing을 제외하고 y 를lh만 전진시킴. 이 y 가layout_paragraph의 반환값으로 전달되어 다음 단락의y_start를 결정하므로, 다음 단락 첫 줄이 ls 만큼 위로 당겨짐.Task #332 에서 도입된 로직. 같은 페이지의 pi=2→pi=3 가 정상으로 보이는 것은
composed.lines.len()이 LineSeg 수와 달라is_para_last_line이 false 로 잡힌 우연일 가능성이 큼 → 매우 불안정한 동작.해결 방향 (옵션 A)
is_para_last_line분기를 제거하고 모든 줄에서y += lh + ls를 적용. Task #332 회귀 여부는 자동 테스트 + 시각 비교로 검증.