diff --git a/devel/204_1.md b/devel/204_1.md index 25ce3d9d7b40d86b44b5e1f35802790f17ea5877..14490860c549a3ed5bcaa90a443d336e87c55f2e 100644 --- a/devel/204_1.md +++ b/devel/204_1.md @@ -1,6 +1,24 @@ # 204_1 CJK标点符号间距调整功能实现 -## 2025/01/17 +## 如何测试 +添加了测试文件`TeXmacs/tests/tmu/204_1.tmu`,包含以下测试场景: +- 行首和行尾夹注符号的0.5字宽调整 +- 普通符号后跟左夹注符号的1.5字宽调整 +- 夹注符号后跟普通符号的1.5字宽调整 +- 连续符号的混合字宽调整(前两个1字宽,后续1.5字宽) + +关于双引号重叠问题的测试: +- 将字体设置为 kaiti SC,中文输入法输入双引号,看是否会重叠 + +## 2025/12/15 修复双引号重叠问题 +### What +- 因为一些cjk字体本身没有设置字距,`text_box_rep::right_contract_kerning `和`text_box_rep::left_contract_kerning`会导致额外的压缩,最终导致了重叠问题 +- 额外删去了`add_upright_left_protrusion`和`add_upright_right_protrusion`里的关于中文单双引号凸出设置,因为西方字体凸出函数不应该处理这些 + +### How +进行额外判定,如果没有字距或者压缩完小于0时,不压缩 + +## 2025/11/16 ### Why 在TeXmacs中处理中日韩(CJK)文本时,标点符号的间距调整是一个重要的排版需求。特别是对于夹注符号(如括号)和普通标点符号之间的间距,需要根据不同的上下文进行智能调整,以符合中文排版的规范和美观要求。现有的自动间距功能无法满足这种精细的标点符号间距控制需求。https://www.w3.org/TR/clreq/#punctuation_width_adjustment 参考 6.3.2 标点符号的宽度调整 @@ -31,13 +49,6 @@ 2. **段落处理增强**:增强了lazy_paragraph的处理能力,增加了新的数据结构和算法 3. **文本框功能增强**:为text_box添加了kerning收缩功能 -#### 测试验证 -添加了测试文件`TeXmacs/tests/tmu/204_1.tmu`,包含以下测试场景: -- 行首和行尾夹注符号的0.5字宽调整 -- 普通符号后跟左夹注符号的1.5字宽调整 -- 夹注符号后跟普通符号的1.5字宽调整 -- 连续符号的混合字宽调整(前两个1字宽,后续1.5字宽) - #### 兼容性考虑 1. **向后兼容**:新添加的虚函数在基类中提供默认实现,不影响现有代码 2. **性能影响**:新增的标点符号识别和调整逻辑仅在CJK语言环境下启用 diff --git a/src/Graphics/Fonts/font_protrusion.cpp b/src/Graphics/Fonts/font_protrusion.cpp index eff117729a3f98005da8e6e099813e337b8fa574..51e316922829efb75fa50cd78822e7f633c3b7ad 100644 --- a/src/Graphics/Fonts/font_protrusion.cpp +++ b/src/Graphics/Fonts/font_protrusion.cpp @@ -19,74 +19,70 @@ void add_upright_left_protrusion (hashmap& t) { - t ("`") = 0.7; - t ("'") = 0.7; - t (",") = 0.7; - t ("<#2018>")= 0.7; - t ("<#2019>")= 0.7; - t ("\016") = 0.2; // < - t ("\017") = 0.2; // > - t ("\020") = 0.5; // `` - t ("\021") = 0.5; // '' - t ("\022") = 0.5; // ,, - t ("\023") = 0.2; // << - t ("\024") = 0.2; // >> - t ("\025") = 0.3; // -- - t ("\026") = 0.2; // --- - t ("(") = 0.05; - t ("A") = 0.05; - t ("J") = 0.05; - t ("T") = 0.05; - t ("V") = 0.05; - t ("W") = 0.05; - t ("X") = 0.05; - t ("Y") = 0.05; - t ("v") = 0.05; - t ("w") = 0.05; - t ("x") = 0.05; - t ("y") = 0.05; + t ("`") = 0.7; + t ("'") = 0.7; + t (",") = 0.7; + t ("\016")= 0.2; // < + t ("\017")= 0.2; // > + t ("\020")= 0.5; // `` + t ("\021")= 0.5; // '' + t ("\022")= 0.5; // ,, + t ("\023")= 0.2; // << + t ("\024")= 0.2; // >> + t ("\025")= 0.3; // -- + t ("\026")= 0.2; // --- + t ("(") = 0.05; + t ("A") = 0.05; + t ("J") = 0.05; + t ("T") = 0.05; + t ("V") = 0.05; + t ("W") = 0.05; + t ("X") = 0.05; + t ("Y") = 0.05; + t ("v") = 0.05; + t ("w") = 0.05; + t ("x") = 0.05; + t ("y") = 0.05; } void add_upright_right_protrusion (hashmap& t) { - t ("`") = 0.7; - t ("'") = 0.7; - t (",") = 0.7; - t ("<#2018>")= 0.7; - t ("<#2019>")= 0.7; - t ("\016") = 0.2; // < - t ("\017") = 0.2; // > - t ("\020") = 0.5; // `` - t ("\021") = 0.5; // '' - t ("\022") = 0.5; // ,, - t ("\023") = 0.2; // << - t ("\024") = 0.2; // >> - t ("\025") = 0.3; // -- - t ("\026") = 0.2; // --- - t (".") = 0.7; - t ("-") = 0.7; - t (";") = 0.5; - t (":") = 0.5; - t ("!") = 0.2; - t ("?") = 0.2; - t (")") = 0.05; - t ("A") = 0.05; - t ("F") = 0.05; - t ("K") = 0.05; - t ("L") = 0.05; - t ("T") = 0.05; - t ("V") = 0.05; - t ("W") = 0.05; - t ("X") = 0.05; - t ("Y") = 0.05; - t ("k") = 0.05; - t ("r") = 0.05; - t ("s") = 0.05; - t ("t") = 0.05; - t ("v") = 0.05; - t ("w") = 0.05; - t ("x") = 0.05; - t ("y") = 0.05; + t ("`") = 0.7; + t ("'") = 0.7; + t (",") = 0.7; + t ("\016")= 0.2; // < + t ("\017")= 0.2; // > + t ("\020")= 0.5; // `` + t ("\021")= 0.5; // '' + t ("\022")= 0.5; // ,, + t ("\023")= 0.2; // << + t ("\024")= 0.2; // >> + t ("\025")= 0.3; // -- + t ("\026")= 0.2; // --- + t (".") = 0.7; + t ("-") = 0.7; + t (";") = 0.5; + t (":") = 0.5; + t ("!") = 0.2; + t ("?") = 0.2; + t (")") = 0.05; + t ("A") = 0.05; + t ("F") = 0.05; + t ("K") = 0.05; + t ("L") = 0.05; + t ("T") = 0.05; + t ("V") = 0.05; + t ("W") = 0.05; + t ("X") = 0.05; + t ("Y") = 0.05; + t ("k") = 0.05; + t ("r") = 0.05; + t ("s") = 0.05; + t ("t") = 0.05; + t ("v") = 0.05; + t ("w") = 0.05; + t ("x") = 0.05; + t ("y") = 0.05; } void diff --git a/src/Typeset/Boxes/Basic/text_boxes.cpp b/src/Typeset/Boxes/Basic/text_boxes.cpp index 11603284dc2467d670e16a577e02cdd16a1e9b61..f3cf94d3ac493a1b5535140dffe3418a6a29f45e 100644 --- a/src/Typeset/Boxes/Basic/text_boxes.cpp +++ b/src/Typeset/Boxes/Basic/text_boxes.cpp @@ -151,6 +151,13 @@ text_box_rep::right_contract_kerning (double factor) { nxk->right = xk->right; nxk->padding= xk->padding; } + // 只收缩字距为正的字符 + if (nxk->right <= 0) { + pad= 0; // 如果字距已经是0或负值,不收缩 + } + else if (nxk->right - pad < 0) { + pad= nxk->right; // 最多收缩到0 + } nxk->right-= pad; box result= tm_new (ip, pos, str, fn, pen, nxk); return result; @@ -165,6 +172,13 @@ text_box_rep::left_contract_kerning (double factor) { nxk->right = xk->right; nxk->padding= xk->padding; } + // 只收缩字距为正的字符 + if (nxk->left <= 0) { + pad= 0; // 如果字距已经是0或负值,不收缩 + } + else if (nxk->left - pad < 0) { + pad= nxk->left; // 最多收缩到0 + } nxk->left-= pad; return tm_new (ip, pos, str, fn, pen, nxk); }