improve NITRAC doc cover

This commit is contained in:
Youmu Liu
2026-09-04 13:49:00 +08:00
parent 5bef767708
commit ac9628d2b7
6 changed files with 164 additions and 13 deletions
+66 -11
View File
@@ -49,13 +49,17 @@
#let cover(
title: none, // 主标题(中文)
title-en: none, // 主标题(英文,Source Code Pro 自行排版)
subtitle: none, // 副标题
subtitle: none, // 兼容旧调用:英文分册题名
sub_title: none, // 中文分册题名
sub_title_en: none, // 英文分册题名
subtitle_en: none, // 兼容旧调用:英文分册题名
logo: none, // 图片路径,如 image("logo.png")
number: none, // 文档编号
author: none, // 作者(可为单个字符串或数组)
classification: none, // 密级,如 "内部"、"秘密"
info: (:), // 附加信息字典,如 (学号: "123", 指导教师: "张三")
date: none, // 日期
part-info: none, // 兼容旧调用:分册题名
fill: white, // 封面背景色
decorate: true, // 是否绘制天蓝/暖橙网格装饰色块
) = {
@@ -165,6 +169,53 @@
let title-rows = cn-rows + en-rows
let title-end-y = (7 + title-rows) * unit + en-gap
let part-title-text = if sub_title != none { sub_title } else { none }
let part-title-en = if sub_title_en != none {
sub_title_en
} else if subtitle_en != none {
subtitle_en
} else {
subtitle
}
let part-box = if part-title-text != none or part-title-en != none or part-info != none {
let part-lines = ()
if part-title-text != none {
part-lines.push(text(
font: (cover-cjk, cover-latin), size: 18pt, fill: black,
)[#part-title-text])
}
if part-title-en != none {
let part-en = text(
font: (cover-latin, cover-cjk), size: 18pt, fill: black,
)[#part-title-en]
let part-en-inner = {
set par(leading: 0.3em)
part-en
}
part-lines.push(box(
width: 10.5cm - unit - 0.0 * unit,
part-en-inner,
))
}
if part-lines.len() == 0 and part-info != none {
part-lines.push(text(
font: (cover-cjk, cover-latin), size: 18pt, fill: black,
)[#part-info])
}
let part-value = stack(dir: ttb, spacing: 0.35 * unit, ..part-lines)
box(
width: 10.5cm - unit,
inset: (left: 0.25 * unit, right: 0.25 * unit),
align(left + top, part-value),
)
} else { none }
let part-y = title-end-y + 0.5 * unit
let part-height = if part-box != none { measure(part-box).height } else { 0pt }
if part-box != none {
place(top + left, dx: unit, dy: part-y, part-box)
}
let part-end-y = part-y + part-height
let metadata = ()
if number != none { metadata.push(("编号", number)) }
if author != none {
@@ -177,7 +228,7 @@
if value != none { metadata.push((str(key), value)) }
}
let marker-height = 2 * unit
let info-y = title-end-y + 0.45 * unit
let info-y = part-end-y + 0.45 * unit
let cells = ()
for (label, value) in metadata {
@@ -191,7 +242,9 @@
)[#value])
}
let info-content = if metadata.len() > 0 {
box(width: 21cm - 1.5 * unit,
box(
width: 21cm - 8.5 * unit,
inset: (left: 0.25 * unit, right: 0.25 * unit),
align(left + top, grid(
columns: (auto, 1fr),
column-gutter: 0.6em,
@@ -205,11 +258,7 @@
// 左侧笔画与右侧笔画一样保持固定高度,不再随标题行数拉伸。
// 标志在第七格独立收尾;下方长条依据文档信息的实际高度紧凑起笔。
tri(0, 6, "tr", sky)
let strip-y = if metadata.len() > 0 {
info-y + info-height + 0.18 * unit
} else {
7 * unit
}
let strip-y = part-end-y + 0.18 * unit
let strip-height = 29.7cm - strip-y
place(top + left, dy: strip-y, polygon(
fill: sky, stroke: none,
@@ -240,17 +289,23 @@
)[signed]
let signed-size = measure(signed-label)
place(top + left,
dx: unit + signature-line-length - signed-size.width,
dx: unit,
dy: meta-y + apex-y - signed-size.height - 0.04 * unit,
signed-label)
// 三角形保留在距页底七个单位的位置,作为独立的封面装饰。
// 文档信息不再与三角形连线,而是跟随主标题实际高度,排列在标题正下方。
place(top + left, dx: 1.25 * unit, dy: info-y, info-content)
place(
top + left,
dx: unit + signature-line-length,
dy: meta-y + apex-y + 0.3 * unit,
info-content,
)
}
tri(2, 6, "tl", sky)
}
tri(2, 6, "tl", sky)
}
pagebreak(weak: true)