Skip to content

Commit c103828

Browse files
committed
feat: remove anti-matter dependency, fix cjk line breaks
Signed-off-by: Juntong Chen <[email protected]>
1 parent fc4a33f commit c103828

18 files changed

+159
-78
lines changed

Diff for: README.md

+6-2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
- 优化段落缩进
1212
- 优化对多行标题 / 院系的处理逻辑
1313
- 优化开启 `twoside` 参数后的页码逻辑
14+
- 修复中文文字断行的问题
1415
- 增加字数统计功能
1516

1617
对于研究生,我们参考华东师范大研究生院于 2023 年发布的[华东师范大学博士、硕士学位论文基本格式要求](https://yjsy.ecnu.edu.cn/8e/62/c42090a429666/page.htm);对于本科生,我们参考华东师范大学教务处于 2021 年更新的[华东师范大学本科生毕业论文(设计)格式要求](http://www.jwc.ecnu.edu.cn/d4/be/c40573a513214/page.htm)。格式适配于 2025 年初,后续使用的同学请留意参考校方的最新通知。
@@ -28,13 +29,13 @@
2829

2930
> 天下苦 LaTeX 久矣。
3031
31-
Typst 是一个基于 Rust 的现代化的排版引擎。它具备类似 Markdown 的简洁语法、清晰的错误提示、实时预览级的编译性能,又同时具备和 LaTeX 一样精准的排版控制和图灵完备的脚本能力。自 2023 年 4 月开源发布以来,已获得 ![](https://img.shields.io/github/stars/typst/typst?style=flat)。现代化的 Typst 可以让你更加专注于论文内容本身,而不被 LaTeX 漫长的编译时间与难以阅读的输出日志困扰。
32+
Typst 是一个基于 Rust 的现代化的排版引擎。它具备类似 Markdown 的简洁语法、清晰的错误提示、实时预览级的编译性能,又同时具备和 LaTeX 一样精准的排版控制和图灵完备的脚本能力。自 2023 年 4 月开源发布以来,已获得 ![](https://img.shields.io/github/stars/typst/typst?style=flat)。现代化的 Typst 可以让你更加专注于论文内容本身,而不被 LaTeX 漫长的编译时间与难以阅读的输出日志困扰。当然,Typst 作为一个年轻的工具还在快速发展,生态远没有 LaTeX 丰富,也有大量的 issue 正在解决的路上。欢迎加入这个社区来共建现代排版生态。
3233

3334
## Usage
3435

3536
### 在 VSCode 中本地编辑(推荐)
3637

37-
首先请确保安装的 typst 版本 >= 0.12.0
38+
请确保本地安装的 typst 版本 >= 0.12.0
3839

3940
#### 从 Typst Universe 获取模板
4041

@@ -128,6 +129,7 @@ context state("total-characters").final()
128129
129130
- **本科**
130131
- [ ] 中英双语图片标题
132+
- [ ] 本科学位论文的诚信承诺页
131133
- **研究生**
132134
- 暂无
133135
@@ -136,6 +138,8 @@ context state("total-characters").final()
136138
- [modern-nju-thesis](https://github.com/nju-lug/modern-nju-thesis) by [OrangeX4](https://github.com/Orangex4)
137139
- [ECNU-Undergraduate-LaTeX](https://github.com/YijunYuan/ECNU-Undergraduate-LaTeX) by [YijunYuan](https://github.com/YijunYuan)
138140
- [华东师范大学硕士论文模板-2023](https://www.overleaf.com/latex/templates/hua-dong-shi-fan-da-xue-shuo-shi-lun-wen-mo-ban-2023/ctvnwyqtsbbz) by ivyee17
141+
- [ECNU_graduation_thesis_template](https://github.com/ECNU-ICA/ECNU_graduation_thesis_template) by [ECNU-ICA](https://github.com/ECNU-ICA)
142+
- [ECNU-Dissertations-Latex-Template](https://github.com/DeepTrial/ECNU-Dissertations-Latex-Template) by [Karl Xing](https://github.com/DeepTrial)
139143
- [关于2023-2024学年第二学期学术型学位硕士研究生论文答辩及学位申请工作的通知](https://yjsy.ecnu.edu.cn/c1/7a/c42079a573818/page.htm) by 华东师范大学研究生院
140144
- [毕业论文常用下载材料](http://www.jwc.ecnu.edu.cn/d4/be/c40573a513214/page.htm) by 华东师范大学教务处
141145
- [学校标识](https://www.ecnu.edu.cn/wzcd/xxgk/xxbs.htm) by 华东师范大学

Diff for: layouts/doc.typ

+10
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
#import "../utils/str.typ": to-normal-str
2+
#import "../utils/fix-cjk-linebreak.typ": fix-cjk-linebreak
3+
24
// 文稿设置,可以进行一些像页面边距这类的全局设置
35
#let doc(
46
// documentclass 传入参数
57
info: (:),
68
// 其他参数
79
fallback: false, // 字体缺失时使用 fallback,不显示豆腐块
810
lang: "zh",
11+
fix-cjk: true,
912
margin: (top: 3cm, bottom: 2.5cm, left: 3.18cm, right: 3.18cm),
1013
it,
1114
) = {
@@ -31,5 +34,12 @@
3134
author: info.author,
3235
)
3336

37+
38+
show: if fix-cjk {
39+
fix-cjk-linebreak
40+
} else {
41+
it
42+
}
43+
3444
it
3545
}

Diff for: layouts/mainmatter.typ

+28-24
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
#import "@preview/anti-matter:0.1.1": fence, step, core
21
#import "@preview/i-figured:0.2.4"
32
#import "../utils/style.typ": 字号, 字体
43
#import "../utils/custom-numbering.typ": custom-numbering
@@ -53,28 +52,23 @@
5352
it,
5453
) = {
5554

56-
// 0. 标志前言结束
57-
{
58-
// TODO: 用了一个很 tricky 的方式防止前言最后一页的页码打印出来,可能有更优解
59-
set page(footer: { text(size: 0pt, ".") })
60-
v(-1pt)
61-
fence()
62-
}
55+
pagebreak-from-odd(twoside: twoside)
56+
// // 0. 标志前言结束
57+
counter(page).update(1)
58+
set page(numbering: "1")
6359

6460
set page(footer: context {
6561
set text(size: 字号.五号)
66-
let p = core.inner-counter().get().at(0)
62+
let p = counter(page).get().at(0)
63+
let pagealign = center
6764
if doctype == "bachelor" {
68-
align(center)[
69-
#core.inner-counter().display()
70-
]
65+
pagealign = center
7166
} else if calc.rem(p, 2) == 1 {
72-
h(1fr)
73-
text(core.inner-counter().display())
67+
pagealign = right
7468
} else {
75-
text(core.inner-counter().display())
76-
h(1fr)
69+
pagealign = left
7770
}
71+
align(pagealign, counter(page).display())
7872
})
7973

8074

@@ -103,6 +97,7 @@
10397
set par(
10498
leading: leading,
10599
justify: justify,
100+
linebreaks: "optimized",
106101
first-line-indent: first-line-indent
107102
)
108103
// show par: set block(spacing: spacing)
@@ -127,11 +122,12 @@
127122
show figure.caption: caption-style
128123
show figure.caption: set text(size: caption-size, font: fonts.楷体)
129124
show figure.caption: set par(leading: 1.25em)
125+
130126
show figure.caption: c => block(inset: (top: figure-caption-spacing, bottom: figure-caption-spacing))[
131127
#text(font: fonts.黑体, weight: "bold", style: "normal")[
132128
#c.supplement #context c.counter.display(c.numbering)
133129
]
134-
#c.separator#c.body
130+
#h(0.3em)#c.body
135131
]
136132
show figure.where(placement: none): it => {
137133
v(figure-clearance / 6)
@@ -201,11 +197,10 @@
201197
set page(..(if display-header {
202198
(
203199
header: {
204-
// needed by anti-matter
205200
if header-render == auto {
206201
heading-content(doctype: doctype, fonts: fonts)
207202
} else {
208-
header-render(loc)
203+
header-render()
209204
}
210205
v(header-vspace)
211206

@@ -222,19 +217,28 @@
222217
)
223218
}))
224219

225-
// 字数统计(正文 + 附录)
226-
// typst query main.typ '<total-words>' 2>/dev/null --field value --one
220+
// 斜体文字使用楷体
221+
show emph: set text(font: fonts.楷体)
227222

223+
// 列表样式
224+
set enum(indent: 0.9em, body-indent: 0.35em)
225+
set list(indent: 1em, body-indent: 0.55em)
226+
227+
// 引述文本样式
228+
set quote(block: true)
229+
show quote: set text(font: fonts.楷体)
230+
show quote: set pad(x: 2em)
231+
232+
// 字数统计(正文 + 附录)
233+
// typst query main.typ '<total-words>' 2>/dev/null --field value --one
228234
context [
229235
#metadata(state("total-words-cjk").final()) <total-words>
230236
#metadata(state("total-characters").final()) <total-chars>
231237
]
232238

239+
// 用于本科毕业论文控制标题样式
233240
let s = state("in-mainmatter", true)
234241
context s.update(true)
235242

236243
it
237-
// 正文结束标志,不可缺少
238-
// 这里放在附录后面,使得页码能正确计数
239-
fence()
240244
}

Diff for: layouts/preface.typ

+15-15
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,36 @@
1-
#import "@preview/anti-matter:0.1.1": anti-matter, core
21
#import "../utils/style.typ": 字号
32

43
// 前言,重置页面计数器
54
#let preface(
65
doctype: "master",
76
// documentclass 传入的参数
87
twoside: false,
9-
// 其他参数
10-
numbering: ("I", "1", "I"),
118
..args,
129
it,
1310
) = {
11+
counter(page).update(0)
1412
set page(footer: context {
1513
set text(size: 字号.五号)
16-
let p = core.outer-counter().get().at(0)
14+
let p = counter(page).get().at(0)
15+
let pagealign = center
1716
if doctype == "bachelor" {
18-
align(center)[
19-
#core.outer-counter().display("I")
20-
]
17+
pagealign = center
2118
} else if twoside == true {
22-
align(right)[
23-
#core.outer-counter().display("I")
24-
]
19+
let preal = here().position().page
20+
if calc.rem(preal, 2) == 1 {
21+
pagealign = right
22+
} else {
23+
pagealign = left
24+
}
2525
} else {
2626
if calc.rem(p, 2) == 1 {
27-
h(1fr)
28-
core.outer-counter().display("I")
27+
pagealign = right
2928
} else {
30-
core.outer-counter().display("I")
31-
h(1fr)
29+
pagealign = left
3230
}
3331
}
32+
align(pagealign, counter(page).display("I"))
3433
})
35-
anti-matter(numbering: numbering, ..args, it)
34+
set par(linebreaks: "optimized")
35+
it
3636
}

Diff for: lib.typ

+2-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* @project: modern-ecnu-thesis
55
* @author: OrangeX4, Juntong Chen ([email protected])
66
* @created: 2025-01-06 22:37:34
7-
* @modified: 2025-01-11 16:46:35
7+
* @modified: 2025-01-12 14:38:55
88
*
99
* 华东师范大学学位论文模板
1010
* Repo: https://github.com/jtchen2k/modern-ecnu-thesis
@@ -13,7 +13,6 @@
1313
* Copyright (c) 2025 Juntong Chen. All rights reserved.
1414
*/
1515

16-
#import "@preview/anti-matter:0.1.1": fence as mainmatter-end
1716
#import "layouts/doc.typ": doc
1817
#import "layouts/preface.typ": preface
1918
#import "layouts/mainmatter.typ": mainmatter
@@ -123,7 +122,7 @@
123122
heading-below: (1.8em, 1.5em),
124123
..args, fonts: fonts + args.named().at("fonts", default: (:)))
125124
} else {
126-
mainmatter(doctype: doctype, twoside: twoside, display-header: true, ..args, fonts: fonts + args.named().at("fonts", default: (:)))
125+
mainmatter(doctype: doctype, twoside: twoside, display-header: true, ..args, fonts: fonts + args.named().at("fonts", default: (:)))
127126
}
128127
},
129128
mainmatter-end: (..args) => {

Diff for: pages/bachelor-abstract-en.typ

+2-2
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
}
4646

4747
set page(header: {
48-
heading-content(doctype: "bachelor", fonts: fonts)
48+
heading-content(doctype: "bachelor", twoside: twoside, fonts: fonts)
4949
})
5050

5151
// 4. 正式渲染
@@ -61,7 +61,7 @@
6161
#invisible-heading(level: 1, outlined: outlined, outline-title)
6262

6363
#align(center)[
64-
#set text(font: fonts.黑体, size: 字号.小三)
64+
#set text(font: fonts.黑体, size: 字号.小三, weight: "bold")
6565
Abstract
6666
]
6767

Diff for: pages/bachelor-abstract.typ

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040

4141
set page(
4242
header: {
43-
heading-content(doctype: "bachelor", fonts: fonts)
43+
heading-content(doctype: "bachelor", twoside: twoside, fonts: fonts)
4444
}
4545
)
4646

Diff for: pages/bachelor-outline-page.typ

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050

5151
set page(..(if show-heading {
5252
(header: {
53-
heading-content(doctype: doctype, fonts: fonts)
53+
heading-content(doctype: doctype, twoside: twoside, fonts: fonts)
5454
})
5555
} else { () }))
5656

Diff for: pages/list-of-figures.typ

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343

4444
set page(..(if show-heading {(
4545
header: {
46-
heading-content(doctype: doctype, fonts: fonts)
46+
heading-content(doctype: doctype, twoside: twoside, fonts: fonts)
4747
}
4848
)} else {()}))
4949

Diff for: pages/list-of-tables.typ

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343

4444
set page(..(if show-heading {(
4545
header: {
46-
heading-content(doctype: doctype, fonts: fonts)
46+
heading-content(doctype: doctype, twoside: twoside, fonts: fonts)
4747
}
4848
)} else {()}))
4949

Diff for: pages/master-abstract-en.typ

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353

5454
set page(
5555
header: {
56-
heading-content(doctype: doctype, fonts: fonts)
56+
heading-content(doctype: doctype, twoside: twoside, fonts: fonts)
5757
}
5858
)
5959

Diff for: pages/master-abstract.typ

+1-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555

5656
set page(
5757
header: {
58-
heading-content(doctype: doctype, fonts: fonts)
58+
heading-content(doctype: doctype, twoside: twoside, fonts: fonts)
5959
}
6060
)
6161

Diff for: pages/notation.typ

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434

3535
set page(..(if show-heading {(
3636
header: {
37-
heading-content(doctype: doctype, fonts: fonts)
37+
heading-content(doctype: doctype, twoside: twoside, fonts: fonts)
3838
}
3939
)} else {()}))
4040

0 commit comments

Comments
 (0)