(非官方)华中科技大学网安学院实验/实践报告Typst 模板
1#import "@preview/cuti:0.4.0": show-cn-fakebold
2
3// 图片函数,自动添加图注
4#let fig(image-path, caption: "", width: auto) = {
5 figure(
6 image(image-path, width: width),
7 caption: text(font: ("Times New Roman", "SimHei"), size: 12pt)[#caption],
8 supplement: [图],
9 numbering: (..nums) => {
10 let values = nums.pos()
11 if values.len() == 1 {
12 context {
13 let section = counter(heading).get()
14 if section.len() >= 2 {
15 numbering("1-1-1", section.at(0), section.at(1), values.at(0))
16 } else if section.len() == 1 {
17 numbering("1-1", section.at(0), values.at(0))
18 } else {
19 numbering("1", values.at(0))
20 }
21 }
22 }
23 }
24 )
25}
26
27// 表格函数,自动添加表注
28#let tbl(content, caption: "") = {
29 figure(
30 content,
31 caption: text(font: ("Times New Roman", "SimHei"), size: 12pt)[#caption],
32 supplement: text(font: "SimHei")[表],
33 numbering: (..nums) => {
34 let values = nums.pos()
35 if values.len() == 1 {
36 context {
37 let section = counter(heading).get()
38 if section.len() >= 2 {
39 numbering("1-1-1", section.at(0), section.at(1), values.at(0))
40 } else if section.len() == 1 {
41 numbering("1-1", section.at(0), values.at(0))
42 } else {
43 numbering("1", values.at(0))
44 }
45 }
46 }
47 },
48 kind: table,
49 placement: auto,
50 )
51}
52
53#let report(
54 name: "",
55 class: "",
56 id: "U202",
57 contact: "(电子邮件)",
58 title: "",
59 extratitle: none,
60 scoretable:[],
61 signature: none, // 签名图片路径,如 "signature.png"
62 title-size: 26pt, // 标题字号,默认 26pt,可改为 25pt
63 body
64) = {
65
66 show: show-cn-fakebold
67 show heading.where(level: 1): it => {
68 if query(heading.where(level: 1)).first() != it {
69 pagebreak()
70 }
71 set text(font: ("Times New Roman", "SimHei"), size: 18pt)
72 set align(center)
73 set block(below: 1em)
74 it
75 }
76
77 show heading.where(level: 2): it => {
78 counter(figure.where(kind: image)).update(0)
79 counter(figure.where(kind: table)).update(0)
80 counter(math.equation).update(0)
81 set text(font: ("Times New Roman", "SimHei"), size: 14pt)
82 set block(above: 1.5em, below: 1.5em)
83 it
84 }
85
86 show heading.where(level: 3): it => {
87 set text(font: ("Times New Roman", "SimHei"), size: 12pt, weight: "bold")
88 set block(above: 1.5em, below: 1.5em)
89 it
90 }
91
92 show heading.where(level: 4): it => {
93 set text(font: ("Times New Roman", "SimHei"), size: 12pt, weight: "bold")
94 set block(above: 1.5em, below: 1.5em)
95 it
96 }
97
98 set page(
99 paper: "a4",
100 margin: (x: 2.5cm, y: 3cm),
101 numbering: none,
102 header: context {
103 if counter(page).get().first() > 1 [
104 #align(center)[#text(font: ("SimHei"), size: 10.5pt)[网络空间安全学院#title]]
105 #block(line(length: 100%, stroke: 0.5pt), above: 0.6em, below: 1.5em)
106 ]
107 },
108 )
109
110 set text(
111 font: ("Times New Roman", "SimSun"),
112 size: 12pt,
113 lang: "zh",
114 )
115
116 set par(
117 justify: true,
118 leading: 1.5em,
119 spacing:1.5em,
120 first-line-indent: (amount: 2em, all: true),
121 )
122
123 // 设置代码块行距
124 show raw.where(block: true): it => {
125 set par(leading: 0.5em)
126 it
127 }
128
129 // 设置列表缩进,与正文保持一致
130 set list(indent: 2em)
131 set enum(indent: 2em)
132
133 show heading: set block(
134 above: 0.7em,
135 below: 0.9em,
136 )
137
138 // 设置图片和表格居中
139 show figure.where(kind: image): set align(center)
140 show figure.where(kind: table): set align(center)
141
142 // 设置块级数学公式编号(标号在右侧)
143 set math.equation(numbering: (..nums) => {
144 let values = nums.pos()
145 if values.len() == 1 {
146 context {
147 let section = counter(heading).get()
148 if section.len() >= 2 {
149 numbering("(1-1-1)", section.at(0), section.at(1), values.at(0))
150 } else if section.len() == 1 {
151 numbering("(1-1)", section.at(0), values.at(0))
152 } else {
153 numbering("(1)", values.at(0))
154 }
155 }
156 }
157 })
158
159 set heading(numbering: (..nums) => {
160 let values = nums.pos()
161 if values.len() == 1 {
162 str(values.at(0)) + "、"
163 } else if values.len() == 2 {
164 str(values.at(0)) + "." + str(values.at(1))
165 } else {
166 numbering("1.1.1", ..nums)
167 }
168 })
169
170
171 // --- 标题页 ---
172 align(center)[
173 #v(3em)
174 #text(font: "SimSun", size: 26pt, weight: "bold")[
175 华 中 科 技 大 学
176 ]
177
178 #text(font: "SimSun", size: 26pt)[
179 *网络空间安全学院*
180 ]
181
182 #v(5em)
183
184 #text(font: "FangSong", size: title-size)[
185 本科:#title
186 ]
187 ]
188
189 v(2em)
190
191if extratitle != none [#align(center)[#text(font:"SimSun",size:22pt)[
192 题目:#extratitle
193]]] else {v(4em)}
194
195 v(6em)
196
197align(center)[#text(font:"FangSong",size:16pt)[
198 #set par(spacing: 1.5em)
199 #context {
200 let info_width = calc.max(
201 measure[#name].width,
202 measure[#class].width,
203 measure[#id].width,
204 measure[#contact].width
205 ) + 1em
206 [姓#h(2em)名 #box(width: info_width, align(center)[#name])
207
208 班#h(2em)级 #box(width: info_width, align(center)[#class])
209
210 学#h(2em)号 #box(width: info_width, align(center)[#id])
211
212 联系方式 #box(width: info_width, align(center)[#contact])
213
214 分#h(2em)数 #box(width: info_width, align(center)[#line(length: info_width)])
215
216 评#h(0.5em)分#h(0.5em)人 #box(width: info_width, align(center)[#line(length: info_width)])]
217 }
218]]
219
220 v(3em)
221 align(center)[#text(font:"SimSun", size:14pt)[
222 #datetime.today().display("[year] 年 [month] 月 [day] 日")
223 ]]
224
225 pagebreak()
226 v(3em)
227 align(center)[#text(size:18pt,weight:"bold")[
228 课程设计报告要求
229 #v(1em)
230 ]]
231 text(size:14pt,weight:"bold")[
232 #set par(spacing:2em,leading:2em)
233 \1. 报告不可以抄袭,发现雷同者记为0分。
234
235 \2. 报告中不可以只粘贴大段代码,应是文字与图、表结合的,需要
236
237 说明流程的时候,也应该用流程图或者伪代码来说明;如果发现有
238
239 大段代码粘贴者,报告打回重写。
240
241 \3. 报告格式要求规范。
242 ]
243
244 pagebreak()
245 scoretable
246 pagebreak()
247 // --- 目录 ---
248 {
249 show outline.entry.where(level: 1): it => {
250 set text(weight: "bold")
251 it
252 }
253 show outline: it => {
254 show heading: set align(center)
255 show heading: set text(font: "SimHei")
256 it
257 }
258 outline(
259 title: [目#h(2em) 录],
260 indent: auto,
261 )
262 }
263
264 counter(page).update(1) // 目录后的第一个正文页记为1
265 set page(numbering: "1")
266
267 // --- 正文 ---
268 body
269
270 pagebreak()
271
272 // --- 原创性声明 ---
273 align(center)[
274 #text(font:"FangSong",size: 18pt)[
275 原创性声明
276 ]
277 ]
278
279 v(1em)
280
281 text(font:"FangSong")[
282 本人郑重声明本报告内容,是由作者本人独立完成的。有关观点、方法、数据和文献等的引用已在文中指出。除文中已注明引用的内容外,本报告不包含任何其他个人或集体已经公开发表的作品成果,不存在剽窃、抄袭行为。
283
284 已阅读并同意以下内容。
285
286 判定为不合格的一些情形:
287
288 (1)请人代做或冒名顶替者;
289
290 (2) 替人做且不听劝告者;
291
292 (3) 实验报告内容抄袭或雷同者;
293
294 (4) 实验报告内容与实际实验内容不一致者;
295
296 (5) 实验代码抄袭者。
297
298 #v(2em)
299
300 #grid(
301 columns: (auto, 1fr),
302 gutter: 1em,
303 text(fill: red,font:"FangSong")[*作者签名:*],
304 if signature != none [
305 #align(left)[#image(signature, width: 3cm)]
306 ]
307 )
308 ]
309}