From 51936333a6884da24955e8e5f99acc4c77f00aa4 Mon Sep 17 00:00:00 2001 From: jackyansongli Date: Thu, 21 May 2026 19:30:27 +0800 Subject: [PATCH 1/8] [0616] add task document --- devel/0616.md | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 devel/0616.md diff --git a/devel/0616.md b/devel/0616.md new file mode 100644 index 0000000000..c429401f35 --- /dev/null +++ b/devel/0616.md @@ -0,0 +1,49 @@ +# [0616] 任务描述 + +数学模式下直接敲击 `dx`, `dy`, `dz`, `dr` 等时自动转换为 `x`, `y`, `z`, `r`,并且支持 `d rho`, `d theta` 等常用微分格式。且转换后依然支持用户在中间手动输入空格或进行正常编辑。 + +## 1 相关文档 +- [dddd.md](dddd.md) - 任务文档模板 + +## 2 任务相关的代码文件 +- [TeXmacs/progs/math/math-kbd.scm](TeXmacs/progs/math/math-kbd.scm) + +## 3 如何测试 + +### 3.1 确定性测试(单元测试) +无 + +### 3.2 非确定性测试(文档验证) +启动 Mogan Stem,进入数学模式: +1. 输入 `d` 再输入 `x`,验证是否自动转为 `x`,且光标能移动到中间输入空格或进行编辑。 +2. 输入 `d` 再输入 `y`,验证是否自动转为 `y`。 +3. 输入 `d` 再输入 `z`,验证是否自动转为 `z`。 +4. 输入 `d` 再输入 `r`,验证是否自动转为 `r`。 +5. 输入 `d` 再输入 `r` 和 `Tab` 键,验证是否自动转为 ``。 +6. 输入 `d` 再输入 `j` 和 `Tab` 键,验证是否自动转为 ``。 + +## 4 如何提交 + +提交前执行以下最少步骤: +1. 检查 `TeXmacs/progs/math/math-kbd.scm` 的 Scheme 语法和括号匹配是否正确。 + +## 5 What +1. 实现了在数学模式下连续敲击 `dx`, `dy`, `dz`, `dr` 自动转换为 `"x"`, `"y"`, `"z"`, `"r"` 的键盘映射。 +2. 实现了对希腊字母 `rho` (`r var` / `r var var`) 和 `theta` (`j var` / `j var var var`) 微分形式的自动转换。 +3. 保持了字符的独立性,转换后的 `` 与变量是两个单独的符号,用户可以直接在中间插入空格或进行自由编辑。 + +## 6 Why +此前数学模式下敲击 `dx` 会被理解为多字母算子(类似 LaTeX 的 `\mathrm{dx}`),不便输入和修改。本次改动为常用微分项提供了智能快捷纠正,使用户能以更符合直觉的方式自然输入标准微分公式。 + +## 7 How +在 `TeXmacs/progs/math/math-kbd.scm` 的 `(:mode in-math-not-hybrid?)` 快捷键块中增加以下按键序列映射: +- `("d x" "x")` +- `("d y" "y")` +- `("d z" "z")` +- `("d r" "r")` +- `("d r var" "")` +- `("d r var var" "")` +- `("d j var" "")` +- `("d j var var var" "")` + +Mogan 的 `kbd-map` 机制在检测到连续敲击指定序列后,会自动替换之前的输入,从而完美实现了这一特性。 From 8376d36adaf12bb599e1351da9045c43ffc70c61 Mon Sep 17 00:00:00 2001 From: jackyansongli Date: Thu, 21 May 2026 19:30:30 +0800 Subject: [PATCH 2/8] [0616] support automatic mathd conversion for dx, dy, dz, dr, d rho, and d theta --- TeXmacs/progs/math/math-kbd.scm | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/TeXmacs/progs/math/math-kbd.scm b/TeXmacs/progs/math/math-kbd.scm index 3197187bcc..68151090a3 100644 --- a/TeXmacs/progs/math/math-kbd.scm +++ b/TeXmacs/progs/math/math-kbd.scm @@ -2881,7 +2881,15 @@ ;;("l l" "") ;;("p p" "") ("R E" "") - ("I M" "")) + ("I M" "") + ("d x" "x") + ("d y" "y") + ("d z" "z") + ("d r" "r") + ("d r var" "") + ("d r var var" "") + ("d j var" "") + ("d j var var var" "")) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Textual operators From 64f6100f70f795e6bb877e20fe3b166092149450 Mon Sep 17 00:00:00 2001 From: jackyansongli Date: Thu, 21 May 2026 19:36:14 +0800 Subject: [PATCH 3/8] [0616] fix missing d j var var intermediate shortcut in Tab-cycling --- TeXmacs/progs/math/math-kbd.scm | 1 + devel/0616.md | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/TeXmacs/progs/math/math-kbd.scm b/TeXmacs/progs/math/math-kbd.scm index 68151090a3..fb63201cda 100644 --- a/TeXmacs/progs/math/math-kbd.scm +++ b/TeXmacs/progs/math/math-kbd.scm @@ -2889,6 +2889,7 @@ ("d r var" "") ("d r var var" "") ("d j var" "") + ("d j var var" "") ("d j var var var" "")) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/devel/0616.md b/devel/0616.md index c429401f35..210711001e 100644 --- a/devel/0616.md +++ b/devel/0616.md @@ -29,7 +29,7 @@ ## 5 What 1. 实现了在数学模式下连续敲击 `dx`, `dy`, `dz`, `dr` 自动转换为 `"x"`, `"y"`, `"z"`, `"r"` 的键盘映射。 -2. 实现了对希腊字母 `rho` (`r var` / `r var var`) 和 `theta` (`j var` / `j var var var`) 微分形式的自动转换。 +2. 实现了对希腊字母 `rho` (`r var` / `r var var`) 和 `theta` (`j var` / `j var var` / `j var var var`) 微分形式的自动转换。 3. 保持了字符的独立性,转换后的 `` 与变量是两个单独的符号,用户可以直接在中间插入空格或进行自由编辑。 ## 6 Why @@ -44,6 +44,7 @@ - `("d r var" "")` - `("d r var var" "")` - `("d j var" "")` +- `("d j var var" "")` - `("d j var var var" "")` Mogan 的 `kbd-map` 机制在检测到连续敲击指定序列后,会自动替换之前的输入,从而完美实现了这一特性。 From 76ade5dbb4e82a2749a4b386da9368a298241f48 Mon Sep 17 00:00:00 2001 From: jackyansongli Date: Thu, 21 May 2026 19:53:09 +0800 Subject: [PATCH 4/8] [0616] support automatic mathd conversion during external LaTeX import --- TeXmacs/progs/convert/latex/init-latex.scm | 95 ++++++++++++++++++++++ devel/0616.md | 29 ++++--- 2 files changed, 111 insertions(+), 13 deletions(-) diff --git a/TeXmacs/progs/convert/latex/init-latex.scm b/TeXmacs/progs/convert/latex/init-latex.scm index b0abe6752a..9dbb7e251c 100644 --- a/TeXmacs/progs/convert/latex/init-latex.scm +++ b/TeXmacs/progs/convert/latex/init-latex.scm @@ -114,3 +114,98 @@ (converter latex-tree texmacs-tree (:function latex->texmacs)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Post-processing imported LaTeX differentials in math mode +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(define (is-letter-char? c) + (and (char? c) + (or (and (char>=? c #\a) (char<=? c #\z)) + (and (char>=? c #\A) (char<=? c #\Z))))) + +(define (is-word-boundary-before? s i) + (or (= i 0) + (not (is-letter-char? (string-ref s (- i 1)))))) + +(define (is-word-boundary-after? s i) + (or (= i (- (string-length s) 1)) + (not (is-letter-char? (string-ref s (+ i 1)))))) + +(define (transform-math-string s) + (let* ((n (string-length s)) + (modified #f) + (res '())) + (let loop ((i 0) (last-idx 0)) + (cond ((>= i (- n 1)) + (if (null? res) s + (begin + (if (< last-idx n) + (set! res (append res (list (substring s last-idx n))))) + (cons 'concat res)))) + ((and (char=? (string-ref s i) #\d) + (or (char=? (string-ref s (+ i 1)) #\x) + (char=? (string-ref s (+ i 1)) #\y) + (char=? (string-ref s (+ i 1)) #\z) + (char=? (string-ref s (+ i 1)) #\r)) + (is-word-boundary-before? s i) + (is-word-boundary-after? s (+ i 1))) + (let ((var (substring s (+ i 1) (+ i 2)))) + (if (> i last-idx) + (set! res (append res (list (substring s last-idx i))))) + (set! res (append res (list "" var))) + (set! modified #t) + (loop (+ i 2) (+ i 2)))) + (else + (loop (+ i 1) last-idx)))))) + +(define (transform-concat-children children) + (cond ((null? children) '()) + ((and (pair? children) (pair? (cdr children))) + (let* ((c1 (car children)) + (c2 (cadr children))) + (if (and (string? c1) (string? c2) + (or (string=? c2 "") (string=? c2 "") + (string=? c2 "") (string=? c2 "")) + (let ((len (string-length c1))) + (and (> len 0) + (char=? (string-ref c1 (- len 1)) #\d) + (or (= len 1) + (not (is-letter-char? (string-ref c1 (- len 2)))))))) + (let* ((len (string-length c1)) + (prefix (if (> len 1) (substring c1 0 (- len 1)) #f)) + (mathd-part (if prefix (list prefix "" c2) (list "" c2)))) + (append mathd-part (transform-concat-children (cddr children)))) + (cons (car children) (transform-concat-children (cdr children)))))) + (else children))) + +(define (upgrade-latex-differentials-stree t in-math) + (cond ((string? t) + (if in-math + (transform-math-string t) + t)) + ((pair? t) + (let* ((head (car t)) + (next-in-math (or in-math (eq? head 'math)))) + (if (and next-in-math (eq? head 'concat)) + (let* ((new-children (map (lambda (x) (upgrade-latex-differentials-stree x #t)) (cdr t))) + (transformed-children (transform-concat-children new-children))) + (cons 'concat transformed-children)) + (cons head (map (lambda (x) (upgrade-latex-differentials-stree x next-in-math)) (cdr t)))))) + (else t))) + +(define latex->texmacs-original latex->texmacs) + +(tm-define (latex->texmacs t) + (let* ((res (latex->texmacs-original t)) + (st (tree->stree res)) + (new-st (upgrade-latex-differentials-stree st #f))) + (stree->tree new-st))) + +(define latex-document->texmacs-original latex-document->texmacs) + +(tm-define (latex-document->texmacs x . opts) + (let* ((res (apply latex-document->texmacs-original (cons x opts))) + (st (tree->stree res)) + (new-st (upgrade-latex-differentials-stree st #f))) + (stree->tree new-st))) diff --git a/devel/0616.md b/devel/0616.md index 210711001e..d43a608602 100644 --- a/devel/0616.md +++ b/devel/0616.md @@ -31,20 +31,23 @@ 1. 实现了在数学模式下连续敲击 `dx`, `dy`, `dz`, `dr` 自动转换为 `"x"`, `"y"`, `"z"`, `"r"` 的键盘映射。 2. 实现了对希腊字母 `rho` (`r var` / `r var var`) 和 `theta` (`j var` / `j var var` / `j var var var`) 微分形式的自动转换。 3. 保持了字符的独立性,转换后的 `` 与变量是两个单独的符号,用户可以直接在中间插入空格或进行自由编辑。 +4. 实现了对外部 LaTeX 代码导入(包括粘贴)时的自动转换。对于形如 `dx`, `dy`, `dz`, `dr` 以及 `d\rho`, `d\theta` 且中间没有空格的序列,也会在导入时被自动转换为正确的微分形式。 ## 6 Why -此前数学模式下敲击 `dx` 会被理解为多字母算子(类似 LaTeX 的 `\mathrm{dx}`),不便输入和修改。本次改动为常用微分项提供了智能快捷纠正,使用户能以更符合直觉的方式自然输入标准微分公式。 +此前数学模式下敲击 `dx` 会被理解为多字母算子(类似 LaTeX 的 `\mathrm{dx}`),不便输入和修改。外部 LaTeX 导入时这些也会被解析为普通字符,导致排版不正确。本次改动为常用微分项提供了智能快捷纠正与完美的外部代码导入转换,提供了绝佳的用户体验。 ## 7 How -在 `TeXmacs/progs/math/math-kbd.scm` 的 `(:mode in-math-not-hybrid?)` 快捷键块中增加以下按键序列映射: -- `("d x" "x")` -- `("d y" "y")` -- `("d z" "z")` -- `("d r" "r")` -- `("d r var" "")` -- `("d r var var" "")` -- `("d j var" "")` -- `("d j var var" "")` -- `("d j var var var" "")` - -Mogan 的 `kbd-map` 机制在检测到连续敲击指定序列后,会自动替换之前的输入,从而完美实现了这一特性。 +1. 在 `TeXmacs/progs/math/math-kbd.scm` 的 `(:mode in-math-not-hybrid?)` 快捷键块中增加以下按键序列映射: + - `("d x" "x")` + - `("d y" "y")` + - `("d z" "z")` + - `("d r" "r")` + - `("d r var" "")` + - `("d r var var" "")` + - `("d j var" "")` + - `("d j var var" "")` + - `("d j var var var" "")` + +2. 在 `TeXmacs/progs/convert/latex/init-latex.scm` 中封装 `latex->texmacs` 和 `latex-document->texmacs` 转换函数。在导入解析完成后,通过 Scheme 递归遍历生成的文档树: + - 将满足边界条件的单个字符串中的 `"dx"`, `"dy"`, `"dz"`, `"dr"` 子串拆分并转换为 `""` 与变量。 + - 在 `concat` 节点内查找结尾为 `"d"` 且前一字符非字母的字符串,其下一节点如果为希腊字母 `""`, `""` 等,则自动转换为直立微分符 `""` 形式。 From 965ac007d305839faa3be40ebcfdacab8f2fd0af Mon Sep 17 00:00:00 2001 From: jackyansongli Date: Thu, 21 May 2026 19:57:53 +0800 Subject: [PATCH 5/8] [0616] add LaTeX and Markdown math integration tests for differential conversions --- TeXmacs/progs/convert/latex/init-latex.scm | 53 ++++++++++------ TeXmacs/tests/0616.scm | 64 ++++++++++++++++++++ TeXmacs/tests/md/0616_differential_test.md | 15 +++++ TeXmacs/tests/tex/0616_differential_test.tex | 14 +++++ 4 files changed, 129 insertions(+), 17 deletions(-) create mode 100644 TeXmacs/tests/0616.scm create mode 100644 TeXmacs/tests/md/0616_differential_test.md create mode 100644 TeXmacs/tests/tex/0616_differential_test.tex diff --git a/TeXmacs/progs/convert/latex/init-latex.scm b/TeXmacs/progs/convert/latex/init-latex.scm index 9dbb7e251c..e79834d6c1 100644 --- a/TeXmacs/progs/convert/latex/init-latex.scm +++ b/TeXmacs/progs/convert/latex/init-latex.scm @@ -132,32 +132,48 @@ (or (= i (- (string-length s) 1)) (not (is-letter-char? (string-ref s (+ i 1)))))) +(define (match-differential s i) + (and (< i (- (string-length s) 1)) + (char=? (string-ref s i) #\d) + (char=? (string-ref s (+ i 1)) #\*) + (let ((rest (substring s (+ i 2) (string-length s)))) + (cond ((or (string-starts? rest "x") + (string-starts? rest "y") + (string-starts? rest "z") + (string-starts? rest "r")) + (cons 1 (substring rest 0 1))) + ((string-starts? rest "") + (cons 5 "")) + ((string-starts? rest "") + (cons 8 "")) + ((string-starts? rest "") + (cons 7 "")) + ((string-starts? rest "") + (cons 10 "")) + (else #f))))) + (define (transform-math-string s) (let* ((n (string-length s)) - (modified #f) (res '())) (let loop ((i 0) (last-idx 0)) - (cond ((>= i (- n 1)) + (cond ((>= i n) (if (null? res) s (begin (if (< last-idx n) (set! res (append res (list (substring s last-idx n))))) (cons 'concat res)))) - ((and (char=? (string-ref s i) #\d) - (or (char=? (string-ref s (+ i 1)) #\x) - (char=? (string-ref s (+ i 1)) #\y) - (char=? (string-ref s (+ i 1)) #\z) - (char=? (string-ref s (+ i 1)) #\r)) - (is-word-boundary-before? s i) - (is-word-boundary-after? s (+ i 1))) - (let ((var (substring s (+ i 1) (+ i 2)))) - (if (> i last-idx) - (set! res (append res (list (substring s last-idx i))))) - (set! res (append res (list "" var))) - (set! modified #t) - (loop (+ i 2) (+ i 2)))) (else - (loop (+ i 1) last-idx)))))) + (let ((match (match-differential s i))) + (if (and match + (is-word-boundary-before? s i) + (is-word-boundary-after? s (+ i 1 (car match)))) + (let* ((match-len (car match)) + (var (cdr match))) + (if (> i last-idx) + (set! res (append res (list (substring s last-idx i))))) + (set! res (append res (list "" var))) + (loop (+ i 2 match-len) (+ i 2 match-len))) + (loop (+ i 1) last-idx)))))))) (define (transform-concat-children children) (cond ((null? children) '()) @@ -179,6 +195,9 @@ (cons (car children) (transform-concat-children (cdr children)))))) (else children))) +(define math-environments + '(math equation equation* eqnarray eqnarray* align align* multline multline*)) + (define (upgrade-latex-differentials-stree t in-math) (cond ((string? t) (if in-math @@ -186,7 +205,7 @@ t)) ((pair? t) (let* ((head (car t)) - (next-in-math (or in-math (eq? head 'math)))) + (next-in-math (or in-math (memq head math-environments)))) (if (and next-in-math (eq? head 'concat)) (let* ((new-children (map (lambda (x) (upgrade-latex-differentials-stree x #t)) (cdr t))) (transformed-children (transform-concat-children new-children))) diff --git a/TeXmacs/tests/0616.scm b/TeXmacs/tests/0616.scm new file mode 100644 index 0000000000..29c971c9f7 --- /dev/null +++ b/TeXmacs/tests/0616.scm @@ -0,0 +1,64 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; MODULE : 0616.scm +;; DESCRIPTION : Integration tests for PR 0616 differential conversion (LaTeX/Markdown) +;; COPYRIGHT : (C) 2026 AcceleratorX +;; +;; 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 or . +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(import (liii check)) + +(load "./TeXmacs/progs/convert/latex/init-latex.scm") + +(check-set-mode! 'report-failed) + +(define (stree-has-mathd? t) + (cond ((string? t) (string=? t "")) + ((pair? t) + (or (stree-has-mathd? (car t)) + (stree-has-mathd? (cdr t)))) + (else #f))) + +(define (load-latex path) + (with path (string-append "$TEXMACS_PATH/tests/tex/" path) + (string-replace (string-load path) "\r\n" "\n"))) + +(define (load-markdown path) + (with path (string-append "$TEXMACS_PATH/tests/md/" path) + (string-load path))) + +(define (test-latex-document-differentials) + (display "Testing differentials in LaTeX document import...\n") + (let* ((latex-content (load-latex "0616_differential_test.tex")) + (texmacs-tree (latex-document->texmacs latex-content)) + (st (tree->stree texmacs-tree))) + (display* "LaTeX Document converted tree stree: " st "\n") + (check (stree-has-mathd? st) => #t))) + +(define (test-markdown-differentials) + (display "Testing differentials inside Markdown math snippets...\n") + ;; We check that each TeX math snippet (wrapped in math mode) from our + ;; Markdown file is correctly converted to include the upright operator. + (let* ((snippets '("\\( dx \\)" + "\\( dy = dz \\)" + "\\( dr \\)" + "\\( d\\rho \\)" + "\\( d\\theta \\)" + "\\( x dx + y dy = z dz \\)" + "\\( \\sin \\theta d\\theta \\)"))) + (for-each (lambda (s) + (let* ((parsed (parse-latex s)) + (converted (latex->texmacs parsed)) + (st (tree->stree converted))) + (display* "Snippet: " s " => " st "\n") + (check (stree-has-mathd? st) => #t))) + snippets))) + +(tm-define (test_0616) + (test-latex-document-differentials) + (test-markdown-differentials) + (check-report)) diff --git a/TeXmacs/tests/md/0616_differential_test.md b/TeXmacs/tests/md/0616_differential_test.md new file mode 100644 index 0000000000..538029c5ef --- /dev/null +++ b/TeXmacs/tests/md/0616_differential_test.md @@ -0,0 +1,15 @@ +# Differential Test in Markdown + +This is a test of math formula differentials inside a Markdown document. + +Here are some inline formulas: +- $dx$ +- $dy = dz$ +- $dr$ +- $d\rho$ +- $d\theta$ + +And display equations: +$$x dx + y dy = z dz$$ + +$$\sin \theta d\theta$$ diff --git a/TeXmacs/tests/tex/0616_differential_test.tex b/TeXmacs/tests/tex/0616_differential_test.tex new file mode 100644 index 0000000000..3d84e30988 --- /dev/null +++ b/TeXmacs/tests/tex/0616_differential_test.tex @@ -0,0 +1,14 @@ +\documentclass{article} +\begin{document} + +Here is a LaTeX math test for differentials: + +\( dx + dy = dz \) + +\[ dr = d\rho d\theta \] + +Inline math: $x dx$ and $\sin x dx$. + +Greek variants: $d\varrho + d\vartheta$. + +\end{document} From dbe4ca07e32335d8e1f469ad19193f0067f6f582 Mon Sep 17 00:00:00 2001 From: jackyansongli Date: Thu, 21 May 2026 20:01:47 +0800 Subject: [PATCH 6/8] [0616] clean up debug logging in integration tests --- TeXmacs/tests/0616.scm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TeXmacs/tests/0616.scm b/TeXmacs/tests/0616.scm index 29c971c9f7..43f9b79713 100644 --- a/TeXmacs/tests/0616.scm +++ b/TeXmacs/tests/0616.scm @@ -36,7 +36,7 @@ (let* ((latex-content (load-latex "0616_differential_test.tex")) (texmacs-tree (latex-document->texmacs latex-content)) (st (tree->stree texmacs-tree))) - (display* "LaTeX Document converted tree stree: " st "\n") + (display* "LaTeX Document converted tree TMU: " (serialize-tmu texmacs-tree) "\n") (check (stree-has-mathd? st) => #t))) (define (test-markdown-differentials) From 5e6f8d04c54f6ae9dcb1ab0ca79b810356dbf701 Mon Sep 17 00:00:00 2001 From: jackyansongli Date: Thu, 21 May 2026 20:10:00 +0800 Subject: [PATCH 7/8] [0616] insert space between d and var in LaTeX import instead of mathd conversion --- TeXmacs/progs/convert/latex/init-latex.scm | 22 ++++++-- TeXmacs/tests/0616.scm | 62 ++++++++++------------ TeXmacs/tests/md/0616_differential_test.md | 15 ------ 3 files changed, 47 insertions(+), 52 deletions(-) delete mode 100644 TeXmacs/tests/md/0616_differential_test.md diff --git a/TeXmacs/progs/convert/latex/init-latex.scm b/TeXmacs/progs/convert/latex/init-latex.scm index e79834d6c1..cbf152b375 100644 --- a/TeXmacs/progs/convert/latex/init-latex.scm +++ b/TeXmacs/progs/convert/latex/init-latex.scm @@ -116,7 +116,8 @@ (:function latex->texmacs)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Post-processing imported LaTeX differentials in math mode +;; Post-processing imported LaTeX: insert space between d and differential +;; variables so they are not merged into a single operator in math mode. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define (is-letter-char? c) @@ -171,7 +172,7 @@ (var (cdr match))) (if (> i last-idx) (set! res (append res (list (substring s last-idx i))))) - (set! res (append res (list "" var))) + (set! res (append res (list "d" " " var))) (loop (+ i 2 match-len) (+ i 2 match-len))) (loop (+ i 1) last-idx)))))))) @@ -190,8 +191,8 @@ (not (is-letter-char? (string-ref c1 (- len 2)))))))) (let* ((len (string-length c1)) (prefix (if (> len 1) (substring c1 0 (- len 1)) #f)) - (mathd-part (if prefix (list prefix "" c2) (list "" c2)))) - (append mathd-part (transform-concat-children (cddr children)))) + (spaced-part (if prefix (list prefix "d" " " c2) (list "d" " " c2)))) + (append spaced-part (transform-concat-children (cddr children)))) (cons (car children) (transform-concat-children (cdr children)))))) (else children))) @@ -228,3 +229,16 @@ (st (tree->stree res)) (new-st (upgrade-latex-differentials-stree st #f))) (stree->tree new-st))) + +;; Re-register converters so that `converter-function` table points +;; to our wrapper definitions. The `converter` macro resolves the +;; function symbol at registration time; simply redefining the symbol +;; afterwards leaves the old reference in the table. +(converter latex-tree texmacs-tree + (:function latex->texmacs)) +(converter latex-document texmacs-tree + (:function-with-options latex-document->texmacs) + (:option "latex->texmacs:fallback-on-pictures" "on") + (:option "latex->texmacs:source-tracking" "off") + (:option "latex->texmacs:conservative" "off") + (:option "latex->texmacs:transparent-source-tracking" "off")) diff --git a/TeXmacs/tests/0616.scm b/TeXmacs/tests/0616.scm index 43f9b79713..52dce6d432 100644 --- a/TeXmacs/tests/0616.scm +++ b/TeXmacs/tests/0616.scm @@ -1,7 +1,7 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; MODULE : 0616.scm -;; DESCRIPTION : Integration tests for PR 0616 differential conversion (LaTeX/Markdown) +;; DESCRIPTION : Integration tests for PR 0616 differential conversion (LaTeX) ;; COPYRIGHT : (C) 2026 AcceleratorX ;; ;; This software falls under the GNU general public license version 3 or later. @@ -16,49 +16,45 @@ (check-set-mode! 'report-failed) -(define (stree-has-mathd? t) - (cond ((string? t) (string=? t "")) - ((pair? t) - (or (stree-has-mathd? (car t)) - (stree-has-mathd? (cdr t)))) - (else #f))) +(define (stree-has-spaced-differential? t) + ;; Check for pattern: "d" followed by " " followed by x/y/z/r// etc. + (define (check-list lst) + (if (or (null? lst) (null? (cdr lst)) (null? (cddr lst))) + #f + (let ((a (car lst)) + (b (cadr lst)) + (c (caddr lst))) + (if (and (string? a) (string=? a "d") + (string? b) (string=? b " ") + (string? c) + (or (string=? c "x") (string=? c "y") (string=? c "z") (string=? c "r") + (string=? c "") (string=? c "") + (string=? c "") (string=? c ""))) + #t + (check-list (cdr lst)))))) + (define (check-children lst) + (if (null? lst) + #f + (or (stree-has-spaced-differential? (car lst)) + (check-children (cdr lst))))) + (cond ((not (pair? t)) #f) + ((eq? (car t) 'concat) + (or (check-list (cdr t)) + (check-children (cdr t)))) + (else (check-children (cdr t))))) (define (load-latex path) (with path (string-append "$TEXMACS_PATH/tests/tex/" path) (string-replace (string-load path) "\r\n" "\n"))) -(define (load-markdown path) - (with path (string-append "$TEXMACS_PATH/tests/md/" path) - (string-load path))) - (define (test-latex-document-differentials) - (display "Testing differentials in LaTeX document import...\n") + (display "Testing space insertion for differentials in LaTeX document import...\n") (let* ((latex-content (load-latex "0616_differential_test.tex")) (texmacs-tree (latex-document->texmacs latex-content)) (st (tree->stree texmacs-tree))) (display* "LaTeX Document converted tree TMU: " (serialize-tmu texmacs-tree) "\n") - (check (stree-has-mathd? st) => #t))) - -(define (test-markdown-differentials) - (display "Testing differentials inside Markdown math snippets...\n") - ;; We check that each TeX math snippet (wrapped in math mode) from our - ;; Markdown file is correctly converted to include the upright operator. - (let* ((snippets '("\\( dx \\)" - "\\( dy = dz \\)" - "\\( dr \\)" - "\\( d\\rho \\)" - "\\( d\\theta \\)" - "\\( x dx + y dy = z dz \\)" - "\\( \\sin \\theta d\\theta \\)"))) - (for-each (lambda (s) - (let* ((parsed (parse-latex s)) - (converted (latex->texmacs parsed)) - (st (tree->stree converted))) - (display* "Snippet: " s " => " st "\n") - (check (stree-has-mathd? st) => #t))) - snippets))) + (check (stree-has-spaced-differential? st) => #t))) (tm-define (test_0616) (test-latex-document-differentials) - (test-markdown-differentials) (check-report)) diff --git a/TeXmacs/tests/md/0616_differential_test.md b/TeXmacs/tests/md/0616_differential_test.md deleted file mode 100644 index 538029c5ef..0000000000 --- a/TeXmacs/tests/md/0616_differential_test.md +++ /dev/null @@ -1,15 +0,0 @@ -# Differential Test in Markdown - -This is a test of math formula differentials inside a Markdown document. - -Here are some inline formulas: -- $dx$ -- $dy = dz$ -- $dr$ -- $d\rho$ -- $d\theta$ - -And display equations: -$$x dx + y dy = z dz$$ - -$$\sin \theta d\theta$$ From e80278cfa6dbf8aa54c7a969f5b3b8c5951032fa Mon Sep 17 00:00:00 2001 From: jackyansongli Date: Fri, 22 May 2026 09:49:18 +0800 Subject: [PATCH 8/8] wip --- TeXmacs/progs/math/math-kbd.scm | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/TeXmacs/progs/math/math-kbd.scm b/TeXmacs/progs/math/math-kbd.scm index fb63201cda..c525e622c2 100644 --- a/TeXmacs/progs/math/math-kbd.scm +++ b/TeXmacs/progs/math/math-kbd.scm @@ -2883,14 +2883,23 @@ ("R E" "") ("I M" "") ("d x" "x") + ("d x var" "") + ("d x var var" "dx") ("d y" "y") + ("d y var" "") + ("d y var var" "dy") ("d z" "z") + ("d z var" "") + ("d z var var" "dz") ("d r" "r") ("d r var" "") ("d r var var" "") + ("d r var var var" "dr") + ("d j" "j") ("d j var" "") ("d j var var" "") - ("d j var var var" "")) + ("d j var var var" "") + ("d j var var var var" "dj")) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Textual operators