166 lines
4.8 KiB
Typst
166 lines
4.8 KiB
Typst
#let times = "Times New Roman"
|
||
#let song = (times, "Noto Serif CJK SC")
|
||
#let hei = (times, "Noto Sans CJK SC")
|
||
#let kai = (times, "Noto Serif CJK SC")
|
||
#let xbsong = (times, "Noto Serif CJK SC")
|
||
#let fsong = (times, "Noto Serif CJK SC")
|
||
#let code = (times, "Maple Mono NF CN")
|
||
|
||
#let requirement_report(
|
||
title: "",
|
||
author: "",
|
||
id: "",
|
||
grade: "",
|
||
major: "",
|
||
department: "",
|
||
advisor: "",
|
||
version: "V1.0",
|
||
date: "",
|
||
header_str: "",
|
||
body) = {
|
||
|
||
// Set the document's basic properties.
|
||
set document(author: author, title: title)
|
||
set page(
|
||
margin: (left: 30mm, right: 30mm, top: 30mm, bottom: 30mm),
|
||
)
|
||
|
||
// Title row.
|
||
v(158pt)
|
||
align(center)[
|
||
#block(text(weight: 700, size: 30pt, font: hei, tracking: 15pt, "网络应用开发"))
|
||
]
|
||
align(center)[
|
||
#block(text(weight: 700, size: 30pt, font: song, tracking: 15pt, ""))
|
||
]
|
||
|
||
v(103pt)
|
||
pad(
|
||
left: 1em,
|
||
right: 1em,
|
||
grid(
|
||
columns: (80pt, 1fr),
|
||
rows: (17pt, auto),
|
||
text(weight: 700, size: 16pt, font: song, "项目名称:"),
|
||
align(center, text(weight: "regular", size: 16pt, font: song, title)),
|
||
text(""),
|
||
line(length: 100%)
|
||
)
|
||
)
|
||
|
||
// Author information.
|
||
v(82.5pt)
|
||
|
||
grid(
|
||
columns: (0.25fr, 0.25fr, 0.25fr, 0.25fr),
|
||
rows: (15pt, 8pt, 15pt, 8pt, 15pt, 8pt, 15pt, 8pt),
|
||
text(size: 14pt, font: song, tracking: 10pt, "开发小组"),
|
||
align(center, text(size: 14pt, font: song, author)),
|
||
text(size: 14pt, font: song, tracking: 10pt, "小组成员"),
|
||
align(center, text(size: 12pt, font: song, id)),
|
||
text(""),
|
||
line(length: 100%),
|
||
text(""),
|
||
line(length: 100%),
|
||
|
||
text(size: 14pt, font: song, tracking: 54pt, "专业"),
|
||
align(center, text(size: 14pt, font: song, major)),
|
||
text(size: 14pt, font: song, tracking: 54pt, "年级"),
|
||
align(center, text(size: 14pt, font: times, grade)),
|
||
text(""),
|
||
line(length: 100%),
|
||
text(""),
|
||
line(length: 100%),
|
||
|
||
text(size: 14pt, font: song, tracking: 9pt, "所属学院"),
|
||
align(center, text(size: 14pt, font: song, department)),
|
||
text(size: 14pt, font: song, tracking: 9pt, "指导教员"),
|
||
align(center, text(size: 14pt, font: song, advisor)),
|
||
text(""),
|
||
line(length: 100%),
|
||
text(""),
|
||
line(length: 100%),
|
||
|
||
text(size: 14pt, font: song, tracking: 20pt, "版本号"),
|
||
align(center, text(size: 14pt, font: song, version)),
|
||
text(size: 14pt, font: song, tracking: 9pt, "编写时间"),
|
||
align(center, text(size: 14pt, font: song, date)),
|
||
text(""),
|
||
line(length: 100%),
|
||
text(""),
|
||
line(length: 100%),
|
||
)
|
||
|
||
v(35pt)
|
||
align(center)[#image("figures/logo-long.png", width: 6cm)]
|
||
|
||
pagebreak()
|
||
|
||
set page(
|
||
margin: (left: 30mm, right: 30mm, top: 30mm, bottom: 30mm),
|
||
numbering: "i",
|
||
number-align: center,
|
||
)
|
||
|
||
v(14pt)
|
||
align(center)[
|
||
#block(text(font: hei, size: 14pt, "《项目需求分析报告》编写说明"))
|
||
]
|
||
|
||
v(14pt)
|
||
text("")
|
||
par(first-line-indent: 2em, text(font: song, size: 12pt, "项目需求分析报告应符合以下要求:"))
|
||
|
||
par(first-line-indent: 2em, text(font: fsong, size: 12pt, "(1)采用A4(21cm×29.7cm)白色复印纸。页边距均为3cm;正文字号为小4号,中文宋体,英文Times New Roman,每页30行,页码居中。"))
|
||
|
||
par(first-line-indent: 2em, text(font: fsong, size: 12pt, "(2)报告主要涵盖:引言(目的、背景)、项目概述(功能、环境)、功能性需求(详细功能描述)、非功能性需求(性能、安全、可靠性)以及外部接口需求。"))
|
||
|
||
par(first-line-indent: 2em, text(font: fsong, size: 12pt, "(3)应结合图表(如UML用例图、流程图)对需求进行辅助说明,图表需有编号和名称。"))
|
||
|
||
pagebreak()
|
||
|
||
set page(
|
||
margin: (left: 30mm, right: 30mm, top: 30mm, bottom: 30mm),
|
||
numbering: "1",
|
||
number-align: center,
|
||
)
|
||
|
||
set heading(numbering: "1.1")
|
||
|
||
show heading: it => box(width: 100%)[
|
||
#v(0.50em)
|
||
#set text(font: hei)
|
||
#if it.numbering != none {
|
||
counter(heading).display()
|
||
h(0.5em)
|
||
}
|
||
#it.body
|
||
]
|
||
// Main body.
|
||
set par(justify: true, first-line-indent: 2em)
|
||
|
||
body
|
||
}
|
||
|
||
#let para(t) = par(text(font: song, size: 10.5pt, t))
|
||
|
||
#let abstract-keywords(abstract: none, keywords: "") = {
|
||
if abstract != none {
|
||
place(
|
||
top + center,
|
||
scope: "parent",
|
||
float: true,
|
||
block(width: 100%)[
|
||
#set par(justify: true, first-line-indent: 0pt)
|
||
#text(font: hei, size: 10.5pt)[【摘 要】]
|
||
#text(font: song, size: 9pt)[#abstract]
|
||
|
||
#v(0.8em)
|
||
#text(font: hei, size: 10.5pt)[【关键词】]
|
||
#text(font: hei, size: 10.5pt)[#keywords]
|
||
#v(1.5em)
|
||
]
|
||
)
|
||
}
|
||
}
|