From f27374b072feb828384cadb0f47ebfeecc350a58 Mon Sep 17 00:00:00 2001 From: AXeonV <2607343351@qq.com> Date: Sat, 28 Feb 2026 16:40:16 +0800 Subject: [PATCH] fix rebinding logic --- TeXmacs/tests/tmu/201_35.tmu | 52 +++++++++++++++++++++++++----------- devel/201_35.md | 25 +++++++++++++++-- src/Typeset/Table/table.cpp | 15 ++++++++--- 3 files changed, 71 insertions(+), 21 deletions(-) diff --git a/TeXmacs/tests/tmu/201_35.tmu b/TeXmacs/tests/tmu/201_35.tmu index 68253280d5..161c8755a6 100644 --- a/TeXmacs/tests/tmu/201_35.tmu +++ b/TeXmacs/tests/tmu/201_35.tmu @@ -1,8 +1,20 @@ -> +> > <\body> + <\frame> + <\equation> + A x=B + + + <\equation> + x=AB + + + + \; + <\align> \>||g-h|\<\|\|\>>>>|>||g-z|\<\|\|\>>+|z-h|\<\|\|\>>>>>>> @@ -17,16 +29,22 @@ sin=cos|2>-x|)> + \; + : <\itemize> - in align, line1 label before eq-number: , label after eq-number: + in frame, line1 label: , line2 label: + - in align, line2 label before eq-number: , label after eq-number: + <\itemize> + in align, line3 label before eq-number: , label after eq-number: - in equation, line3 label: + in align, line4 label before eq-number: , label after eq-number: - in equation, line4 label: + in equation, line5 label: + + in equation, line6 label: \; @@ -34,13 +52,15 @@ : <\itemize> - in align line1 label before eq-number:, label after eq-number: + in frame, line1 label: , line2 label: + + in align line3 label before eq-number:, label after eq-number: - in align line2 label before eq-number:, label after eq-number: + in align line4 label before eq-number:, label after eq-number: - in equation, line3 label: + in equation, line5 label: - in equation, line4 label: + in equation, line6 label: \; @@ -55,11 +75,13 @@ <\references> <\collection> - > - > - > - > - > - > + > + > + > + > + > + > + > + > diff --git a/devel/201_35.md b/devel/201_35.md index a88c9d87e5..0221c697d4 100644 --- a/devel/201_35.md +++ b/devel/201_35.md @@ -3,10 +3,31 @@ ## 如何测试 打开 `TeXmacs\tests\tmu\201_35.tmu` ,查看 smart-ref 和 reference 的公式编号是否正确 -- line1 的 label 编号应该都是1 -- line2 的 label 编号应该都是2 +- line1 的 label 编号应该都是1(这一次修改的修复样例) +- line2 的 label 编号应该都是2(这一次修改的修复样例) - line3 的 label 编号应该都是3 - line4 的 label 编号应该都是4 +- line5 的 label 编号应该都是5 +- line6 的 label 编号应该都是6 + +## 2026/2/28 +### What +修复在 frame、solution 等环境内的公式编号错位的问题 + +### Why +之前的实现把 `defer-tags=row` 放在 `table_rep::typeset_row` 行入口处,导致**所有**走 table row 的场景都可能触发延迟绑定 + +但 `defer-tags` 的设计初衷仅是服务多行公式(align/eqnarray/gather 等)中“`label` 先于 `eq-number`”的时序修正。像 frame、solution 这类外层环境内部也会进入 `typeset_row`,从而把本不该延迟重绑的 label 键加入 `the-tags`,最终在后续 `set-binding`(1参)时被错误覆盖,表现为编号错位 + +### How +将 `typeset_row` 中 `defer-tags/the-tags` 的行级作用域从“无条件开启”改为“仅在多行显示公式场景开启”: + +1. `hyphen == "y"`:仅处理可按行拆分的数学表格(多行公式结构信号) +2. `mode == "math"`:仅在数学语义环境生效 +3. `math-display == "true"`:仅在陈列公式模式生效 + +满足三条件时才 `local_begin ("defer-tags", "row")` 与 `local_begin ("the-tags", tuple)`;否则不进入 defer 逻辑。`exec_set_binding` 中已有的 `defer-tags=="row"` 判定逻辑保持不变,因此修复后既保留 align 场景的正确重绑,也避免 frame/solution 等环境误触发 + ## 2025/12/12 ### What diff --git a/src/Typeset/Table/table.cpp b/src/Typeset/Table/table.cpp index aadd18f2f5..4f4957ee7a 100644 --- a/src/Typeset/Table/table.cpp +++ b/src/Typeset/Table/table.cpp @@ -113,8 +113,13 @@ table_rep::typeset_row (int i, tree fm, tree t, path ip) { T[i] = tm_new_array (nr_cols); STACK_NEW_ARRAY (subformat, tree, nr_cols); extract_format (fm, subformat, nr_cols); - tree old_defer= env->local_begin ("defer-tags", string ("row")); - tree old_tags = env->local_begin ("the-tags", tree (TUPLE)); + bool can_make_tags= (hyphen == "y" && env->read (MODE) == "math" && + env->read (MATH_DISPLAY) == "true"); + tree old_defer, old_tags; + if (can_make_tags) { + old_defer= env->local_begin ("defer-tags", string ("row")); + old_tags = env->local_begin ("the-tags", tree (TUPLE)); + } for (j= 0; j < nr_cols; j++) { cell& C= T[i][j]; C = cell (env); @@ -127,8 +132,10 @@ table_rep::typeset_row (int i, tree fm, tree t, path ip) { C->col_span= min (C->col_span, nr_cols - j); if (hyphen == "y") C->row_span= 1; } - env->local_end ("the-tags", old_tags); - env->local_end ("defer-tags", old_defer); + if (can_make_tags) { + env->local_end ("the-tags", old_tags); + env->local_end ("defer-tags", old_defer); + } STACK_DELETE_ARRAY (subformat); }