Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 3 additions & 5 deletions TeXmacs/langs/encoding/tmuniversaltounicode.scm
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,7 @@
;; General Remark about Unicode symbols
;;
;; Most Unicode symbols are intentionally defined as shape-based
;; instead of meaning based. For example U+22C8 (bowtie) maps to
;; symbol <join> and U+2A1D (join, large bowtie) maps to symbol
;; <Bowtie> because <join> is the small variant of <Bowtie>.
;; instead of meaning based.


;;; Symbols which do not seem to exist in Unicode
Expand Down Expand Up @@ -634,7 +632,7 @@
("<cdot>" "#22C5") ; not MIDDLE DOT
("<star>" "#22C6")
("<divideontimes>" "#22C7")
("<join>" "#22C8")
("<bowtie>" "#22C8")
("<ltimes>" "#22C9")
("<rtimes>" "#22CA")
("<leftthreetimes>" "#22CB")
Expand Down Expand Up @@ -1089,7 +1087,7 @@
("<big-sqcap>" "#2A05")
("<big-sqcup>" "#2A06")
("<merge>" "#2A07")
("<Bowtie>" "#2A1D")
("<Join>" "#2A1D")
("<amalg>" "#2A3F")
("<leqslant>" "#2A7D")
("<geqslant>" "#2A7E")
Expand Down
2 changes: 2 additions & 0 deletions TeXmacs/plugins/latex/progs/latex/latex-kbd.scm
Original file line number Diff line number Diff line change
Expand Up @@ -410,6 +410,8 @@
"gtrdot"
"ltimes"
"rtimes"
"bowtie"
"Join"
"shortmid"
"shortparallel"
"smallsetminus"
Expand Down
2 changes: 1 addition & 1 deletion TeXmacs/progs/language/std-symbols.scm
Original file line number Diff line number Diff line change
Expand Up @@ -681,7 +681,7 @@
"<btimes>"
"<ttimes>"
"<exterior>"
"<join>"
"<bowtie>"
"<ast>"
"<star>"
"<oast>"
Expand Down
51 changes: 51 additions & 0 deletions TeXmacs/progs/language/tests/tmuniversaltounicode-test.scm
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; MODULE : tmuniversaltounicode-test.scm
;; DESCRIPTION : TeXmacs universal 符号 <-> Unicode 双向转换测试
;; (数据表:TeXmacs/langs/encoding/tmuniversaltounicode.scm)。
;; 锁定 bowtie 一族的命名契约:
;; <bowtie> = U+22C8(对应 LaTeX \bowtie,小蝴蝶结)
;; <Join> = U+2A1D(对应 LaTeX \Join,大蝴蝶结)
;; COPYRIGHT : (C) 2026 Mogan STEM
;;
;; This software falls under the GNU general public license version 3 or later.
;; It comes WITHOUT ANY WARRANTY WHATSOEVER. For details, see the file LICENSE
;; in the root directory of <http://www.gnu.org/licenses/gpl-3.0.html>.
;;
;; USAGE
;; xmake b stem && xmake r tmuniversaltounicode-test
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(import (liii check))

(check-set-mode! 'report-failed)

;; 符号 -> Unicode

(define (test-symbol-to-unicode)
(check (string-convert "<bowtie>" "Cork" "UTF-8") => "⋈")
(check (string-convert "<Join>" "Cork" "UTF-8") => "⨝")
) ;define

;; Unicode -> 符号(反向映射用于 LaTeX/UTF-8 导入时还原符号名)

(define (test-unicode-to-symbol)
(check (string-convert "⋈" "UTF-8" "Cork") => "<bowtie>")
(check (string-convert "⨝" "UTF-8" "Cork") => "<Join>")
) ;define

;; 旧(错误)命名不再占用这两个码位(未注册符号原样透传)

(define (test-old-names-removed)
(check (string-convert "<join>" "Cork" "UTF-8") => "<join>")
(check (string-convert "<Bowtie>" "Cork" "UTF-8") => "<Bowtie>")
) ;define

(tm-define (regtest-tmuniversaltounicode)
(test-symbol-to-unicode)
(test-unicode-to-symbol)
(test-old-names-removed)
(check-report)
) ;tm-define
4 changes: 2 additions & 2 deletions TeXmacs/progs/math/math-kbd.scm
Original file line number Diff line number Diff line change
Expand Up @@ -524,7 +524,7 @@
("< > var var var var" "<clubsuit>")
("< > var var var var var" "<legeangle>")
("> <" "<gtrless>")
("> < var" "<join>")
("> < var" "<bowtie>")
("> < var var" "<geleangle>")
("< ~" "<lesssim>")
("< ~ ~" "<lessapprox>")
Expand Down Expand Up @@ -1490,7 +1490,7 @@
("| var *" "<ltimes>")
("| var * var" "<ttimes>")
("| var * var var" "<btimes>")
("| var * |" "<join>")
("| var * |" "<bowtie>")
("* var |" "<rtimes>")
("* var | var" "<btimes>")
("* var | var var" "<ttimes>")
Expand Down
119 changes: 119 additions & 0 deletions devel/1255.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
# [1255] 修复 bowtie 符号命名:`<bowtie>` = U+22C8,`<Join>` = U+2A1D

## 1 相关文档
- [dddd.md](dddd.md) - 任务文档模板

## 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 契约):

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

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

```bash
xmake test "lolly_tests/cork_test"
```

注意:Windows 下 scheme 测试目标运行的是**安装目录**里的
`build/packages/stem/data/bin/MoganSTEM.exe`(见 `xmake/tests.lua` 的
`add_target_scheme_test`),不是 `build/windows/.../MoganSTEM.exe`;
`xmake 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 如何提交

```bash
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.scm`:`kbd-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 转换**不在运行时读 .scm**:`lolly/lolly/data/gen_cork_data.py`
把 `TeXmacs/langs/encoding/*.scm` 解析为编译期常量表 `cork_data.inc`,
由 `lolly/lolly/data/cork.cpp` 编译进二进制(`converter.cpp` 中
`hashtree_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` 等工作目录假设),与本任务无关。
Loading
Loading