聚珍 — 新功能效果演示(定寬對照)

本頁以定寬文本框(不可拖動)並排對照,逐場景展示兩項新功能:功能分級(文本級/段落級)、垂懸字避免orphan)。各框寬度經 headless 校準,配 Noto Sans CJK 可穩定重現所述效果。勾選下方開關可描出聚珍注入之結構(紫=垂懸字綁定、紅=中西間隙、藍=半形標點)。第三項曾規劃之「標點懸掛」經實測為機制級死路、已移除,說明見文末。

一、功能分級:文本級 vs 段落級

功能分兩級——文本級(中西間隙 spacing、標點擠壓 jiya)僅依字符鄰接,任意文本片段(標題、按鈕、單行)皆適用;段落級(禁則 jinze、垂懸字 orphan、長詞 longWord)依賴行/段布局。塊級元素預設全功能;標 data-jz-level="text" 之子樹(或選項 level:{text:"選擇器"})僅跑文本級。

標題標為文本級(仍有間隙與半形,但不參與禁則/垂懸字)

data-jz-level="text"(標題典型)

用 Neovim 寫程式(v0.10)真的很順手。

中西間隙(Neovimv0.10 兩側)與標點半形照常;但此子樹跑垂懸字/禁則(無 jz-orphanjz-jinze)。

預設段落級(同內容,作正文)

用 Neovim 寫程式(v0.10)真的很順手。

同樣有間隙與半形,但另含禁則綁定與垂懸字(開啟「顯示垂懸字綁定」可見紫框)。

即:把標題/按鈕標為文本級——要中西間隙與標點半形、不要避孤字/避頭尾(那些對單行無意義)。

二、垂懸字避免(orphan,方案 C)

保證段末行 CJK 實義字數 ≥ N(預設 2;標點/符號不計)。機制:把段末「第 N 個實義字起至段末」(含尾隨標點)包入 jz-orphanwhite-space:nowrap)成不可斷整體 → 末行恒含之 ⇒ 末行實義字 ≥ N,無需量測版面、任意寬度成立。預設開

關閉 vs 開啟(同寬同文:末行從「孤字」變為保留兩字)

orphan 關閉(data-juzhen-off="orphan"

春天來了萬物復甦大地生機盎然處處鳥語花香令人神往心曠神怡。

末行僅剩孤字「怡。」——單字垂懸,版面失衡。

orphan 開啟(預設 chars=2)

春天來了萬物復甦大地生機盎然處處鳥語花香令人神往心曠神怡。

末行保留「神怡。」兩個實義字(開「顯示垂懸字綁定」見紫框=被綁之尾段)。

調整保留字數(orphan:{ chars: 3 }

chars = 3(同前文、同寬 14em)

春天來了萬物復甦大地生機盎然處處鳥語花香令人神往心曠神怡。

末行保留「曠神怡。」三個實義字(較預設 chars=2 之「神怡。」多拉一字下來)。

標點/符號不計入字數(句末多個標點不佔 N)

orphan 關閉

他想了好久最後終於對著大家堅定地說出了那三個字「我願意」。

末行=「意」。」——僅 1 個實義字(意),其後 」。 兩個標點不計入字數。

orphan 開啟(chars=2)

他想了好久最後終於對著大家堅定地說出了那三個字「我願意」。

末行=「願意」。」——保 2 個實義字(願意);尾隨 」。 隨尾段綁入但不佔 N(開紫框見綁定範圍含標點,且整個 「我願意」 禁則群組跨 jz-jinze 不被切割)。

邊界:段落實義字 < N(或單行段)→ 不綁、無副作用。極窄容器(<N 字寬)→ 該尾段可能溢出(罕見)。

三、標點懸掛(hanging)— 已移除

原計劃之標點懸掛(行端標點凸出版心)經 headless + 真實瀏覽器實測確認為機制級死路,已移除(負 margin 程式碼與 CSS 皆刪;hanging 選項保留為 no-op,無任何效果)。寬度守恆矛盾:行端標點盒若保持非零寬,墨色出去多少、版心內就空出多少(行末實義字無法齊版心右緣);若收為零寬,釋放一整字寬、斷行器把下一字拉上本行與標點重疊(且 justifyAtoms 預設之 inline-block 下負 margin 被 justify 吸收)。CSS hack 接觸不到斷行器,此恒等式無解。唯一正解為原生 CSS hanging-punctuation,惟 Chrome/Firefox 至今不支援(僅 Safari),且本庫 jz-char 為 inline-block 原子非文本、原生懸掛不作用之——未來若做須是繞開 jz-char 的「原生管線」新功能。詳見 ARCHITECTURE.md §6.5.6