Skip to content

Commit

Permalink
add auto space around inline math
Browse files Browse the repository at this point in the history
  • Loading branch information
sses7757 committed Jun 1, 2024
1 parent 17d9503 commit 1341cdb
Show file tree
Hide file tree
Showing 8 changed files with 130 additions and 67 deletions.
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
## 特点

- 初步融合了[equate](https://typst.app/universe/package/equate)[i-figured](https://typst.app/universe/package/i-figured)的公式编号,并提供了一种更方便的公式子编号逻辑。
- 提供了`#notation`用以自动管理术语,具体使用参见`example.typ`的第1.1.3节。
- 提供了`#notation`用以自动管理术语,具体使用参见`example.typ`的第1.2节。
- 提供了自动在行内公式两端添加空格的功能,该功能会自动避免在符号两端添加空格。具体使用参见`example.typ`的第1.4节。


## 使用
Expand All @@ -15,4 +16,5 @@

## License

This project is licensed under the Apache License Version 2.0.
This project is licensed under the Apache License Version 2.0.
This project contains codes originated from https://github.com/nju-lug/modern-nju-thesis, https://github.com/RubixDev/typst-i-figured, and https://github.com/EpicEricEE/typst-plugins/tree/master/equate, which are of MIT license.
33 changes: 23 additions & 10 deletions example.typ
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,11 @@
doctype: "midterm", // proposal, midterm, final
// anonymous: true, // 盲审模式
twoside: true, // 双面模式,会加入空白页,便于打印
// 可自定义字体,先英文字体后中文字体,应传入「宋体」、「黑体」、「楷体」、「仿宋」、「等宽」
// fonts: (楷体: ("Times New Roman", "FZKai-Z03S")),
// fonts: (楷体: ("Times New Roman", "FZKai-Z03S")), // 可自定义字体,先英文字体后中文字体,应传入「宋体」、「黑体」、「楷体」、「仿宋」、「等宽」
// math-font: "XITS Math", // 公式字体,应预先安装在系统中或放在根目录下
// slant-glteq: true, // 公式 <= >= 样式,按照中文格式要求,所有大于等于、小于等于号均替换为对应倾斜等号变体
// arounds: arounds_default, // 公式不加空格的符号,默认值为 mainmatter.arounds_default
// math-breakable: false, // 多行公式可否分割到多页
info: (
title: ("基于Typst的", "南方科技大学学位论文"),
title-en: "SUSTech Thesis Template for Typst",
Expand Down Expand Up @@ -54,8 +57,7 @@
#decl-page()

// 正文
// 按照中文格式要求,所有大于等于、小于等于号均替换为对应倾斜等号变体
#show: mainmatter.with(slant-glteq: true)
#show: mainmatter

// 中文摘要
#abstract(
Expand Down Expand Up @@ -102,25 +104,33 @@

=== 无序列表

无序列表编号请自行使用`#set list(indent: 1em, marker: (...))`等方式修改符号和缩进。

#set list(indent: 1em, marker: ([•], [#text(size: 0.5em, baseline: 0.2em, "■")]))

- 无序列表项一
- 无序列表项二
- 无序子列表项一
- 无序子列表项二

=== 有序列表

+ 有序列表项一
有序列表编号请自行使用`#set enum(numbering: "(1 a)", indent: 0.35em)`等方式修改编号和缩进。

#set enum(numbering: "(1 a)", indent: 0.35em)

+ 有序列表项一#lorem(15)
+ 有序列表项二
+ 有序子列表项一
+ 有序子列表项二

=== 术语列表
== 术语

定义新术语,使用`#notation("key", name-en: "English Full Name", name-cn: "中文全称", abbr: "EFN")`,其中`abbr`可不指定以自动生成,`name-en`可以首字母不大写,如#notation("dft", name-en: "density functional theory", name-cn: "密度泛函理论");字母中存在大写的,默认简写为其大写部分,如#notation("bana", name-en: "BA-NAnas", name-cn: "香蕉")。

引用已经定义的术语,使用`#notation("key", full: true|false|none)`,其中键值`key`的大小写不敏感,如#notation("DFT")、#notation("bana", full: none)和#notation("dft", full: true)。

文档中使用`notation`添加的所有术语均会自动出现在符号表中。
文档中使用`notation`添加的所有术语均会自动出现在符号表中;同一个`key`,之后的定义会覆盖之前的定义


== 图表
Expand Down Expand Up @@ -152,7 +162,7 @@
$
phi.alt := (1 + sqrt(5)) / 2
$ <ratio>
默认字体为XITS Math,可按需修改,在正文开头的`info`中添加`math-font: "需要的公式字体"`进行修改
默认字体为XITS Math,可按需修改`math-font`选项以改为所需字体,选项接收的参数为*字体名称*而非字体文件的名称,且字体应预先安装在系统中或放在根目录下

引用数学公式需要加上`eqt:`前缀,则由@eqt:ratio,我们有:
$
Expand All @@ -172,9 +182,9 @@ $
F_n &= P(n) \
&= floor(1 / sqrt(5) phi.alt^n). #<final1>
$ <->
测试引用@eqt:final1。
测试引用@eqt:final1。注意到默认情况下,多行公式不能分割到多页上,如需改变,修改`math-breakable`选项。

使用`#fake-par`另起一段,仅使用空行无法另起一段
本模板加入了自动在行内公式两端添加空格的功能,如$sin(x)$,该功能会自动避免在符号两端添加空格。修改`arounds`选项以指定哪些符号两端不添加空格


== 参考文献 <sec:bib>
Expand All @@ -198,6 +208,9 @@ $ <->
- 为了避免不必要的空格,中文内部(包括标点符号)不能换行。
否则就像本行,在第一个句号后加入了额外的空格。
- 为了使得标题后首行文字可以缩进,本模板使用了`#fake-par`,会导致标题行和下一行可能不同页,如@sec:bib,建议使用手动换行“`\`”解决。
- 另外,对于行间公式和有序/无序列表之后马上需要另起一段的,需使用`#fake-par`另起一段,仅使用空行无法另起一段。
#fake-par
注意事项结束。


= 正文 <chap:2>
Expand Down
7 changes: 1 addition & 6 deletions sustech-master-thesis/layouts/doc.typ
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
#import "../utils/style.typ": 字号, 字体

// 文稿设置,可以进行一些像页面边距这类的全局设置
#let doc(
// documentclass 传入参数
info: (:),
fonts: (:),
// 其他参数
fallback: false, // 字体缺失时使用 fallback,不显示豆腐块
fallback: true, // 字体缺失时使用 fallback,不显示豆腐块
lang: "zh",
margin: (x: 3cm, y: 3cm),
it,
Expand All @@ -16,7 +13,6 @@
title: ("基于Typst的", "南方科技大学学位论文"),
author: "张三",
) + info
fonts = 字体 + fonts

// 2. 对参数进行处理
// 2.1 如果是字符串,则使用换行符将标题分隔为列表
Expand All @@ -28,7 +24,6 @@
set text(fallback: fallback, hyphenate: auto)
set par(justify: true)
set page(margin: margin)
show math.equation: set text(font: info.math-font)

// 4. PDF 元信息
set document(
Expand Down
49 changes: 40 additions & 9 deletions sustech-master-thesis/layouts/mainmatter.typ
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
#import "../utils/indent.typ": fake-par
#import "../utils/unpairs.typ": unpairs

#let arounds_default = "、,。!?…;:—‘’“”()【】《》~!@#$%^&*()-_=+/*[]{}|\\:;'\"<>,./?"

#let mainmatter(
// documentclass 传入参数
twoside: false,
Expand Down Expand Up @@ -40,10 +42,12 @@
caption-size: 11pt,
// figure 计数
show-figure: show-figure,
// equation 计数
// 公式计数
show-equation: equate,
// equation <= >= 样式
slant-glteq: true,
math-font: "XITS Math",
arounds: arounds_default,
math-breakable: false,
..args,
it,
) = {
Expand Down Expand Up @@ -90,15 +94,16 @@
show heading: reset-counters
show figure: show-figure
// 3.4 设置 equation 的编号和假段落首行缩进
show math.equation.where(block: true): show-equation
show math.equation: set text(font: (math-font, ) + fonts.宋体)
show math.equation.where(block: true): show-equation.with(breakable: math-breakable)
show math.equation.where(block: true): set block(spacing: 0em)
show math.equation.where(block: true): set par(leading: 0em)
show math.equation.where(block: true): set par(leading: 0.5em)
set math.equation(supplement: "公式")
set math.equation(numbering: "(1.1.a)")
show ref: equate-ref
show math.gt.eq: math.class("binary", if slant-glteq {sym.gt.eq.slant} else {sym.gt.eq})
show math.lt.eq: math.class("binary", if slant-glteq {sym.lt.eq.slant} else {sym.lt.eq})
// 3.5 表格表头置顶 + 不用冒号用空格分割 + 样式
// 3.6 表格表头置顶 + 不用冒号用空格分割 + 样式
show figure.where(
kind: image
): set figure(supplement: "")
Expand All @@ -113,10 +118,6 @@
): set figure.caption(position: top)
set figure.caption(separator: separator)
show figure.caption: set text(font: fonts.宋体, size: caption-size)
// 3.6 优化列表显示
// 术语列表 terms 不应该缩进
show terms: set par(first-line-indent: 0pt)

// 4. 处理标题
// 4.1 设置标题的 Numbering
set heading(numbering: numbering)
Expand Down Expand Up @@ -213,5 +214,35 @@
)
])

// 3.5 inline 公式两边的空格,必须放在最后
show: cont => {
if not cont.has("children") {
return cont
}
for (n, item) in cont.children.enumerate() {
if item.func() == math.equation and item.block == false {
if n > 0 {
if cont.children.at(n - 1).has("text") {
let prev = cont.children.at(n - 1).text.last()
if not arounds_default.contains(prev) {
[ ]
}
}
}
item
if n < cont.children.len() - 1 {
if cont.children.at(n + 1).has("text") {
let next = cont.children.at(n + 1).text.first()
if not arounds_default.contains(next) {
[ ]
}
}
}
} else {
item
}
}
}

it
}
13 changes: 8 additions & 5 deletions sustech-master-thesis/lib.typ
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#import "@preview/anti-matter:0.0.2": anti-inner-end as mainmatter-end
#import "layouts/doc.typ": doc
#import "layouts/mainmatter.typ": mainmatter
#import "layouts/mainmatter.typ": mainmatter, arounds_default
#import "layouts/appendix.typ": appendix
#import "pages/fonts-display-page.typ": fonts-display-page
#import "pages/outline-page.typ": outline-page
Expand All @@ -18,8 +18,6 @@
#import "utils/custom-numbering.typ": custom-numbering
#import "utils/custom-heading.typ": heading-display, active-heading, current-heading
#import "utils/indent.typ": indent, fake-par
#import "@preview/i-figured:0.2.4": show-figure, show-equation
#import "@preview/equate:0.1.0": equate
#import "utils/style.typ": 字体, 字号
#import "utils/state-notations.typ": notation, notations

Expand All @@ -29,6 +27,10 @@
twoside: true, // 双面模式,会加入空白页,便于打印
anonymous: false, // 盲审模式
bibliography: none, // 原来的参考文献函数
math-font: "XITS Math", // 公式字体,应预先安装在系统中或放在根目录下
slant-glteq: true, // 公式 <= >= 样式
math-breakable: false, // 多行公式可否分割到多页
arounds: arounds_default, // 公式不加空格的符号
fonts: (:), // 字体,应传入「宋体」、「黑体」、「楷体」、「仿宋」、「等宽」
info: (:),
) = {
Expand Down Expand Up @@ -65,7 +67,6 @@
email: "[email protected]",
school-code: "518055",
degree: "MEng",
math-font: "XITS Math",
) + info

(
Expand All @@ -80,11 +81,13 @@
doc(
..args,
info: info + args.named().at("info", default: (:)),
fonts: fonts,
)
},
mainmatter: (..args) => {
mainmatter(
slant-glteq: slant-glteq,
math-font: math-font,
arounds: arounds,
twoside: twoside,
display-header: true,
..args,
Expand Down
3 changes: 2 additions & 1 deletion sustech-master-thesis/pages/notation.typ
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@
..(
notations.pairs().
filter(kv => kv.at(0) != "test").
map(kv => print-notations(..kv.at(1)))
map(kv => print-notations(..kv.at(1))).
filter(v => v != none)
).flatten(),
..supplements.flatten()
))
Expand Down
58 changes: 34 additions & 24 deletions sustech-master-thesis/utils/multi-line-equate.typ
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
// NOTICE about license
// The majority of this file is originated from "EpicEricEE/typst-plugins/equate" with MIT license, with my modification to fit current demands.
// The `show-figure` function is originated from "RubixDev/typst-i-figured" with MIT license, with my modification to work with the rest of the functions.


// Element function for alignment points.
#let align-point = $&$.body.func()

Expand Down Expand Up @@ -248,7 +253,8 @@
let _ = if "counter" in dic { dic.remove("counter") }
dic + (numbering: n => _typst-numbering(numbering, ..numbers, n))
}
// See `i-figured.show-figure`


#let show-figure(
it,
level: 1,
Expand Down Expand Up @@ -295,6 +301,7 @@
// and displayed at every line, optionally with sub-numbering.
//
// ### Parameters:
// - breakable: wheteher the multi-line equations can be break to different pages
// - sub-numbering: whether to use the last number in the `math.equation.numbering` as the sub number
// - zero-fill: whether to fill 0s for the first (few) numbers when not present
// - leading-zero: wheter to set the first heading number to 0 if it is not numbered
Expand All @@ -314,6 +321,7 @@
// #set math.equation(numbering: "(1.1.a)")
// ```
#let equate(
breakable: false,
sub-numbering: true,
zero-fill: true,
leading-zero: true,
Expand Down Expand Up @@ -465,29 +473,31 @@
state.update(_ => sub-numbering)

// Layout equation as grid to allow page breaks.
grid(
columns: 1,
row-gutter: par.leading,
..realign(lines).enumerate().map(((i, line)) => {
let sub-number = numbered.position(n => n == i)
let number = if it.numbering == none {
none
} else if sub-number == none {
// Step back counter as this equation should not be counted.
counter(math.equation).update(n => n - 1)
} else if sub-numbering and numbered.len() > 1 {
numbering(it.numbering, ..main-number, sub-number + 1)
} else {
numbering(it.numbering, ..(main-number.slice(0, -1) + (main-number.at(-1) + sub-number, )))
}

layout-line(
line,
number: number,
number-align: number-align,
number-width: max-number-width
)
})
block(breakable: breakable,
grid(
columns: 1,
row-gutter: par.leading,
..realign(lines).enumerate().map(((i, line)) => {
let sub-number = numbered.position(n => n == i)
let number = if it.numbering == none {
none
} else if sub-number == none {
// Step back counter as this equation should not be counted.
counter(math.equation).update(n => n - 1)
} else if sub-numbering and numbered.len() > 1 {
numbering(it.numbering, ..main-number, sub-number + 1)
} else {
numbering(it.numbering, ..(main-number.slice(0, -1) + (main-number.at(-1) + sub-number, )))
}

layout-line(
line,
number: number,
number-align: number-align,
number-width: max-number-width
)
})
)
)
main-num

Expand Down
Loading

0 comments on commit 1341cdb

Please sign in to comment.