Skip to content

Latest commit

 

History

History
119 lines (97 loc) · 6.07 KB

File metadata and controls

119 lines (97 loc) · 6.07 KB

[1255] 修复 bowtie 符号命名:<bowtie> = U+22C8,<Join> = U+2A1D

1 相关文档

2 任务相关的代码文件

  • TeXmacs/langs/encoding/tmuniversaltounicode.scm — 符号 ↔ Unicode 编码表(数据源)
  • lolly/lolly/data/gen_cork_data.py — 由编码表生成编译期常量表
  • lolly/lolly/data/cork_data.inc — 生成物,cork↔UTF-8 编译期查找表(勿手改
  • lolly/tests/lolly/data/cork_test.cpp — lolly 转换函数单元测试(TDD)
  • TeXmacs/plugins/latex/progs/latex/latex-kbd.scm — LaTeX 命令键盘映射
  • TeXmacs/progs/math/math-kbd.scm — 数学模式快捷键
  • TeXmacs/progs/language/std-symbols.scm — 数学符号语义分组
  • TeXmacs/progs/language/tests/tmuniversaltounicode-test.scm — 单元测试

3 如何测试

3.1 确定性测试(单元测试)

Scheme 层(符号 ↔ Unicode 契约):

xmake b stem && xmake i stem && xmake r tmuniversaltounicode-test

C++ 层(lolly 编译表转换函数 cork_to_utf8 / utf8_to_cork / strict_cork_to_utf8,TDD):

xmake test "lolly_tests/cork_test"

注意:Windows 下 scheme 测试目标运行的是安装目录里的 build/packages/stem/data/bin/MoganSTEM.exe(见 xmake/tests.luaadd_target_scheme_test),不是 build/windows/.../MoganSTEM.exexmake b stem 之后必须 xmake i stem 才能把新二进制和资源同步过去。

3.2 非确定性测试(GUI 验证)

  1. 启动 Mogan(xmake b stem && xmake r stem
  2. 插入数学公式($
  3. 输入 \ 进入命令模式(hybrid 模式),输入 bowtie 并回车,验证插入 ⋈; 输入 Join 并回车,验证插入 ⨝
  4. 快捷键 > < var| var * | 插入 ⋈

4 如何提交

gf fmt --changed-since=main

5 What

修正 bowtie 一族符号的底层命名,使其与 LaTeX 命令语义一致:

LaTeX 命令 TeXmacs 符号(修正前) TeXmacs 符号(修正后) Unicode
\bowtie <join> <bowtie> U+22C8 ⋈
\Join(latexsym) <Bowtie> <Join> U+2A1D ⨝

具体改动:

  1. tmuniversaltounicode.scm<join><bowtie>(#22C8)、<Bowtie><Join>(#2A1D), 并删除文件头中以此为「正确示例」的过时注释;
  2. 运行 python3 lolly/lolly/data/gen_cork_data.py 重新生成 lolly/lolly/data/cork_data.inc(cork↔UTF-8 双向查找表编译进二进制, 仅改 .scm 不重新生成则运行时不生效);
  3. latex-kbd.scmkbd-symbols 列表中 join/Bowtie 改为 bowtie/Join, 删除上一版临时加的 ("bowtie" ... (kbd-insert "<join>"))("Join" ... (kbd-insert "<Join>")) 两条显式映射(改名后 kbd-symbols 自动生成的 \bowtie<bowtie>\Join<Join> 即为正确映射);
  4. math-kbd.scm> < var| var * | 两个快捷键改为插入 <bowtie>
  5. std-symbols.scm:Times-visible-symbol 组中的 <join> 改为 <bowtie> (Relation-nolim-symbol 组原本就列着 <bowtie>/<Join>, 改名前这两个名字没有编码映射、是悬空的)。

6 Why

  • LaTeX 中 \bowtie = U+22C8(⋈,小蝴蝶结),\Join = U+2A1D(⨝,大蝴蝶结), 而底层符号名却是 <join>(对应 22C8)与 <Bowtie>(对应 2A1D), 大小写命名与 LaTeX 恰好相反;
  • 改名前 <bowtie>/<Join> 没有任何 Unicode 映射:\Join 经 kbd 插入的 <Join> 无法渲染,LaTeX 导入 \bowtie 得到的 <bowtie> 也无法渲染;
  • LaTeX 导出按名字映射(<foo>\foo):改名前导出 <join> 会得到 非标准命令 \join<Bowtie> 会被错误导出为 wasysym 的 \Bowtie

已知影响

  • 旧文档中已存在的 <join>/<Bowtie> 符号将变为未注册符号(原样透传、不渲染);
  • wasysym 的 \Bowtie 命令(与 \Join 不同字形)此前碰巧映射到 U+2A1D, 改名后导入得到悬空的 <Bowtie>;该命令本身与 JOIN 语义不同,留待后续单独处理;
  • convert-latex-texmacs-drd.scm\join(tm 专有命令)的导入映射保留不动。

7 How(关键机制)

cork↔UTF-8 转换不在运行时读 .scmlolly/lolly/data/gen_cork_data.pyTeXmacs/langs/encoding/*.scm 解析为编译期常量表 cork_data.inc, 由 lolly/lolly/data/cork.cpp 编译进二进制(converter.cpphashtree_from_dictionary 的运行时加载路径对 Cork↔UTF-8 已不可达—— convert() 直接短路到 lolly;但该路径仍服务于 Cork→SourceCode、 Cork→ASCII、LaTeX↔UTF-8 等其它编码对)。 因此修改编码表后必须重新运行生成脚本并重新编译。

验证重新生成的 diff 语义:新旧 cork_data.inc 的实体表/码位表逐项对比, 唯一差异即 <join><bowtie><Bowtie><Join> 两处改名,值不变, 无其它条目漂移。

7.1 TDD 验证过程

  1. 先在 lolly/tests/lolly/data/cork_test.cpp 新增 test_named_bowtie_join 用例(8 个断言:双向映射 + 旧名透传 + strict 变体);
  2. Red:把 cork_data.inc 回滚到修复前版本,新用例如期全部失败;
  3. Green:恢复重新生成的 cork_data.inc,全部通过 (70 用例 / 1177 断言,含存量用例无回归)。

7.2 cork_test.cpp 同名遮蔽的修复

lolly/tests/Data/String/cork_test.cpp(tm_encode/tm_decode 等用例)与 lolly/tests/lolly/data/cork_test.cpp 同名,xmake add_tests 按 basename 注册时后者把前者覆盖,lolly_tests/cork_test 实际只跑后者,前者是从不 运行的死测试。已将前者改名为 tm_cork_test.cpp(内容测的是 Data/String/cork.cpp 的 tm_* 帮助函数),解除遮蔽后两个测试各自独立 运行:tm_cork_test 5 用例 / 25 断言、cork_test 70 用例 / 1177 断言, 全部通过——旧树实现与测试契约一致,无需改实现。

遗留:lolly_tests/file_test 在本机失败是环境相关的既有问题 (依赖 bin/test_only.bat 等工作目录假设),与本任务无关。