(非官方)华中科技大学网安学院实验/实践报告Typst 模板
at 309 lines 7.7 kB view raw
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}