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
10 changes: 9 additions & 1 deletion TeXmacs/plugins/lang/dic/en_US/zh_CN.scm
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
("(re)build autocompletion index" "构建/重建自动补全索引")
(" (length: " "(长度为")
("1.5 line spacing" "1.5 倍行距")
("1.5 line spacing" "1.5倍行距")
("2 line spacing" "2倍行距")
("Upgrade VIP" "升级会员")
("Upgrade to unlock AI writing, MathOCR, and more advanced features." "开通会员,立即解锁 AI 写作、MathOCR 等高阶功能。")
("All" "全部")
Expand All @@ -17,6 +18,7 @@
("Archive selected" "归档所选")
("Archive selected (%1)" "归档所选 (%1)")
("As" "作为")
("At least" "最小值")
("Auto backup:" "自动备份:")
("Backslash \\ /" "反斜线 \\ /")
("BibTeX command" "BibTeX命令")
Expand Down Expand Up @@ -50,6 +52,7 @@
("End::keyboard" "End")
("Expand TeXmacs macros with no LaTeX equivalents" "展开没有 LaTeX 等价项的 TeXmacs 宏")
("Experimental features (to be used with care)" "实验性功能(请谨慎使用)")
("Exactly" "固定值")
("expired" "到期")
("Expired" "已过期")
("Export mathematical formulas as MathJax" "将数学公式导出为 MathJax")
Expand All @@ -73,6 +76,7 @@
("Merge lines into paragraphs unless separated by blank lines" "无空行分隔时自动合并多行为段落")
("Math Modeling" "数学建模")
("Multi-select" "多选")
("Multiple" "多倍行距")
("No matching command found!" "未找到匹配指令!")
("No multiple spaces" "不允许多个空格")
("NSFC Young Scientists Fund" "国自然基金青年基金申请模板")
Expand Down Expand Up @@ -1375,6 +1379,7 @@
("line wrapping" "自动换行")
("Interline space" "行距")
("Line spacing presets:" "行距预设:")
("Line spacing:" "行距:")
("line" "线")
("linear algebra" "线性代数")
("lines around block" "双划线块")
Expand Down Expand Up @@ -2253,6 +2258,9 @@
("space between lines" "行间空白")
("space between paragraphs" "段间空白")
("spacing" "间隔")
("Spacing value:" "设置值:")
("Minimum value:" "最小值:")
("Multiple value:" "倍数:")
("spanish" "西班牙语")
("special functions" "特殊函数")
("special properties" "特殊属性")
Expand Down
3 changes: 2 additions & 1 deletion TeXmacs/progs/generic/document-menu.scm
Original file line number Diff line number Diff line change
Expand Up @@ -560,8 +560,9 @@
(-> "Spacing"
("Default" (init-default "par-sep" "par-line-sep" "interpargraph space"))
---
("Single line spacing" (init-env "par-sep" "0fn"))
("1.5 line spacing" (init-env "par-sep" "0.5fn"))
("Double line spacing" (init-env "par-sep" "1.0fn"))
("2 line spacing" (init-env "par-sep" "1.0fn"))
---
("Interline separation" (init-interactive-env "par-sep"))
("Interline space" (init-interactive-env "par-line-sep"))
Expand Down
3 changes: 2 additions & 1 deletion TeXmacs/progs/generic/format-menu.scm
Original file line number Diff line number Diff line change
Expand Up @@ -301,8 +301,9 @@
(link indentation-menu)
) ;->
(-> "Spacing"
("Single line spacing" (make-line-with "par-sep" "0fn"))
("1.5 line spacing" (make-line-with "par-sep" "0.5fn"))
("Double line spacing" (make-line-with "par-sep" "1.0fn"))
("2 line spacing" (make-line-with "par-sep" "1.0fn"))
---
("Interline separation" (make-interactive-line-with "par-sep"))
("Interline space" (make-interactive-line-with "par-line-sep"))
Expand Down
249 changes: 228 additions & 21 deletions TeXmacs/progs/generic/format-widgets.scm
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,146 @@
) ;list
) ;tm-define

(define (safe-string-null? s)
(or (not s) (not (string? s)) (equal? s "")))

(define (safe-string-ends? s suffix)
(and (string? s)
(string? suffix)
(>= (string-length s) (string-length suffix))
(equal? (substring s (- (string-length s) (string-length suffix)) (string-length s)) suffix)))

(define (get-current-par-sep new)
(let ((val (ahash-ref new "par-sep")))
(if (and val (string? val)) val "")))

(define (get-current-par-ver-sep new)
(let ((val (ahash-ref new "par-ver-sep")))
(if (and val (string? val)) val "")))

(define (par-sep->multiplier par-sep)
(if (and (safe-string-ends? par-sep "fn") (>= (string-length par-sep) 2))
(let* ((num-str (substring par-sep 0 (- (string-length par-sep) 2)))
(num (string->number num-str)))
(if num
(number->string (+ num 1.0))
"1.2"))
"1.2"))

(define (multiplier->par-sep mult-str)
(let ((num (string->number mult-str)))
(if num
(let ((val (- num 1.0)))
(string-append (number->string val) "fn"))
"0.2fn")))

(define (get-fn-val s)
(and (string? s)
(safe-string-ends? s "fn")
(>= (string-length s) 2)
(string->number (substring s 0 (- (string-length s) 2)))))

(define (get-line-spacing-type par-sep par-ver-sep)
(let ((val (get-fn-val par-sep)))
(cond
((and (not (safe-string-null? par-ver-sep))
(not (equal? par-ver-sep ""))
(or (safe-string-null? par-sep) (and val (= val 0))))
"At least")
((or (safe-string-null? par-sep) (and val (= val 0)))
"Single line spacing")
((and val (= val 0.5))
"1.5 line spacing")
((and val (= val 1.0))
"2 line spacing")
((and val (not (or (= val 0) (= val 0.5) (= val 1.0))))
"Multiple")
(else
"Exactly"))))

(define (par-sep->multiplier-str par-sep)
(let ((val (get-fn-val par-sep)))
(if val
(number->string (+ val 1.0))
"1.2")))

(define (multiplier-str->par-sep mult-str)
(let ((num (string->number mult-str)))
(if num
(let ((val (- num 1.0)))
(string-append (number->string val) "fn"))
"0.2fn")))

(define (get-multiple-default par-sep)
(let ((val (get-fn-val par-sep)))
(if (and val (not (or (= val 0) (= val 0.5) (= val 1.0))))
par-sep
"0.2fn")))

(define (get-at-least-default par-ver-sep)
(if (and (string? par-ver-sep) (not (safe-string-null? par-ver-sep)))
par-ver-sep
"12pt"))

(define (get-exactly-default par-sep)
(let ((val (get-fn-val par-sep)))
(if (not val)
(if (and (string? par-sep) (not (safe-string-null? par-sep)))
par-sep
"12pt")
"12pt")))

;; State variables to preserve line spacing values across type switches
(define line-spacing-exactly-value "12pt")
(define line-spacing-at-least-value "12pt")
(define line-spacing-multiple-value "0.2fn")

(define (save-line-spacing-values new)
"Save current line spacing values before switching types"
(let* ((p-sep (get-current-par-sep new))
(pv-sep (get-current-par-ver-sep new))
(sp-type (get-line-spacing-type p-sep pv-sep)))
(cond ((equal? sp-type "Exactly")
(set! line-spacing-exactly-value p-sep))
((equal? sp-type "At least")
(set! line-spacing-at-least-value pv-sep))
((equal? sp-type "Multiple")
(set! line-spacing-multiple-value p-sep)))))

(define (get-exactly-default-with-save par-sep)
"Get default for Exactly mode, using saved value if current is a fn value"
(let ((val (get-fn-val par-sep)))
(if (not val)
(if (and (string? par-sep) (not (safe-string-null? par-sep)))
par-sep
line-spacing-exactly-value)
line-spacing-exactly-value)))

(define (get-at-least-default-with-save par-ver-sep)
"Get default for At least mode, using saved value if current is empty"
(if (and (string? par-ver-sep) (not (safe-string-null? par-ver-sep)))
par-ver-sep
line-spacing-at-least-value))

(define (get-multiple-default-with-save par-sep)
"Get default for Multiple mode, using saved value if current is a standard fn value"
(let ((val (get-fn-val par-sep)))
(if (and val (not (or (= val 0) (= val 0.5) (= val 1.0))))
par-sep
line-spacing-multiple-value)))

(define (line-spacing-exactly? new)
"Check if current line spacing type is Exactly"
(equal? (get-line-spacing-type (get-current-par-sep new) (get-current-par-ver-sep new)) "Exactly"))

(define (line-spacing-at-least? new)
"Check if current line spacing type is At least"
(equal? (get-line-spacing-type (get-current-par-sep new) (get-current-par-ver-sep new)) "At least"))

(define (line-spacing-multiple? new)
"Check if current line spacing type is Multiple"
(equal? (get-line-spacing-type (get-current-par-sep new) (get-current-par-ver-sep new)) "Multiple"))

(tm-widget (paragraph-formatter-basic old new fun u flag?)
(aligned (item (text "Alignment:")
(enum (change "par-mode" answer old new fun u)
Expand Down Expand Up @@ -172,30 +312,87 @@
) ;enum
) ;item
(item ====== ======)
(item (text "Interline space:")
(enum (change "par-sep" answer old new fun u)
(cons-new (ahash-ref new "par-sep") '("0fn" "0.2fn" "0.5fn" "1fn" ""))
(ahash-ref new "par-sep")
(item (text "Line spacing:")
(enum
(cond
((equal? answer "Single line spacing")
(begin
(save-line-spacing-values new)
(change "par-sep" "0fn" old new fun u)
(change "par-ver-sep" "" old new fun u)
(refresh-now "paragraph-formatter")))
((equal? answer "1.5 line spacing")
(begin
(save-line-spacing-values new)
(change "par-sep" "0.5fn" old new fun u)
(change "par-ver-sep" "" old new fun u)
(refresh-now "paragraph-formatter")))
((equal? answer "2 line spacing")
(begin
(save-line-spacing-values new)
(change "par-sep" "1.0fn" old new fun u)
(change "par-ver-sep" "" old new fun u)
(refresh-now "paragraph-formatter")))
((equal? answer "At least")
(begin
(save-line-spacing-values new)
(change "par-sep" "0fn" old new fun u)
(change "par-ver-sep" (get-at-least-default-with-save (get-current-par-ver-sep new)) old new fun u)
(refresh-now "paragraph-formatter")))
((equal? answer "Exactly")
(begin
(save-line-spacing-values new)
(change "par-sep" (get-exactly-default-with-save (get-current-par-sep new)) old new fun u)
(change "par-ver-sep" "" old new fun u)
(refresh-now "paragraph-formatter")))
((equal? answer "Multiple")
(begin
(save-line-spacing-values new)
(change "par-sep" (get-multiple-default-with-save (get-current-par-sep new)) old new fun u)
(change "par-ver-sep" "" old new fun u)
(refresh-now "paragraph-formatter")))
) ;cond
'("Single line spacing" "1.5 line spacing" "2 line spacing" "At least" "Exactly" "Multiple")
(get-line-spacing-type (get-current-par-sep new) (get-current-par-ver-sep new))
"10em"
) ;enum
) ;item
(item (hlist // (text "Line spacing presets:"))
(hlist ("1.5x"
(begin
(change "par-sep" "0.5fn" old new fun u)
(refresh-now "paragraph-formatter")
) ;begin
) ;
//
//
("2.0x"
(assuming (line-spacing-exactly? new)
(item (text "Spacing value:")
(enum
(begin
(change "par-sep" "1.0fn" old new fun u)
(refresh-now "paragraph-formatter")
) ;begin
) ;
) ;hlist
) ;item
(change "par-sep" answer old new fun u)
(refresh-now "paragraph-formatter"))
(cons-new (get-current-par-sep new) '("10pt" "12pt" "15pt" "18pt" "20pt" "24pt"))
(get-current-par-sep new)
"10em"
) ;enum
) ;item
) ;assuming
(assuming (line-spacing-at-least? new)
(item (text "Minimum value:")
(enum
(begin
(change "par-ver-sep" answer old new fun u)
(refresh-now "paragraph-formatter"))
(cons-new (get-current-par-ver-sep new) '("10pt" "12pt" "15pt" "18pt" "20pt" "24pt"))
(get-current-par-ver-sep new)
"10em"
) ;enum
) ;item
) ;assuming
(assuming (line-spacing-multiple? new)
(item (text "Multiple value:")
(enum
(begin
(change "par-sep" (multiplier-str->par-sep answer) old new fun u)
(refresh-now "paragraph-formatter"))
(cons-new (par-sep->multiplier-str (get-current-par-sep new)) '("1.2" "1.3" "1.4" "1.6" "1.8" "2.5"))
(par-sep->multiplier-str (get-current-par-sep new))
"10em"
) ;enum
) ;item
) ;assuming
(item (text "Interparagraph space:")
(enum (change "par-par-sep" answer old new fun u)
(cons-new (ahash-ref new "par-par-sep")
Expand Down Expand Up @@ -369,7 +566,17 @@
(let* ((old (get-env-table paragraph-parameters))
(new (get-env-table paragraph-parameters))
(u (current-buffer))
) ;
(p-sep (get-current-par-sep new))
(pv-sep (get-current-par-ver-sep new))
(sp-type (get-line-spacing-type p-sep pv-sep))
) ;
;; Initialize saved values from current document state
(cond ((equal? sp-type "Exactly")
(set! line-spacing-exactly-value p-sep))
((equal? sp-type "At least")
(set! line-spacing-at-least-value pv-sep))
((equal? sp-type "Multiple")
(set! line-spacing-multiple-value p-sep)))
(dialogue-window (paragraph-formatter old new make-multi-line-with u #f)
noop
"Paragraph format"
Expand Down
Loading