grelin_templates/tech-report/data/cover.typ
MORRO d83e6a99a9 Add tech-report and travel-plan templates, replacing feasibility.
Introduce tech-report/ with cover page, custom TOC, and summary flow; add travel-plan/ for trip planning; update README, gitignore, and brand colors.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-08 13:56:22 +08:00

258 lines
7.6 KiB
Plaintext

#import "theme.typ": *
#let format-cover-date(date, fallback) = {
if date != none {
date.display("[year].[month repr:numerical].[day]")
} else if type(fallback) == str {
fallback
} else {
str(fallback)
}
}
#let cover-title-lines(title) = {
let marker = "智能"
let m = title.match(regex(marker))
if m == none {
(title, none)
} else {
let end = m.end
let line-2 = title.slice(end)
if line-2.len() > 0 {
(title.slice(0, end), line-2)
} else {
(title, none)
}
}
}
#let cover-title-block(line-1, line-2) = {
block(breakable: false, spacing: 0pt)[
#text(
font: heading-font,
size: size-cover-title,
weight: "bold",
fill: cover-panel-title-color,
hyphenate: false,
top-edge: "cap-height",
bottom-edge: "baseline",
)[#line-1]
#if line-2 != none [
#move(dy: cover-panel-title-pull)[
#text(
font: heading-font,
size: size-cover-title-line2,
weight: "bold",
fill: cover-panel-title-color,
hyphenate: false,
top-edge: "cap-height",
bottom-edge: "baseline",
)[#line-2]
]
]
]
}
#let cover-logo() = {
let mark = cover-logo-size * 0.64
let offset = cover-logo-size * 0.36
box(width: cover-logo-size, height: cover-logo-size)[
#place(left + top)[
#rect(width: mark, height: mark, fill: color-primary)
]
#place(left + top, dx: offset, dy: offset)[
#rect(width: mark, height: mark, fill: none, stroke: 1.5pt + color-primary)
]
]
}
#let cover-quote-mark() = {
text(
font: heading-font,
size: cover-quote-size,
fill: cover-quote-color,
)[”]
}
#let cover-panel-footer(meta, date-text) = {
block(width: 100%, breakable: false)[
#text(font: heading-font, size: cover-panel-author-size, weight: "bold", fill: cover-panel-title-color)[
#meta.company
]
#v(cover-panel-text-gap * 0.25)
#text(font: body-font, size: cover-panel-role-size, fill: cover-panel-subtitle-color)[
技术报告 · #meta.version
]
#v(cover-panel-role-gap-before-line)
#block(width: 100%, breakable: false)[
#place(right + top)[
#cover-quote-mark()
]
#block(width: 100%, inset: (right: cover-quote-clearance))[
#line(length: cover-panel-footer-line-length, stroke: cover-panel-footer-rule-stroke + cover-panel-footer-line-color)
#v(cover-panel-meta-gap-after-line)
#grid(
columns: (auto, auto, auto),
column-gutter: cover-panel-meta-column-gap,
align: (left, center + horizon, left),
[
#text(font: body-font, size: cover-panel-meta-label, fill: cover-panel-meta-color)[
报告版本
]
#v(tw(0.5))
#text(font: body-font, size: cover-panel-meta-size, fill: cover-panel-title-color)[
#meta.version
]
],
box(width: cover-panel-meta-divider-width, height: tw(8), fill: cover-panel-footer-line-color),
[
#text(font: body-font, size: cover-panel-meta-label, fill: cover-panel-meta-color)[
发布日期
]
#v(tw(0.5))
#text(font: body-font, size: cover-panel-meta-size, fill: cover-panel-title-color)[
#date-text
]
],
)
]
]
]
}
#let cover-panel-bottom(meta, date-text) = {
cover-panel-footer(meta, date-text)
}
#let cover-below-panel(meta, date-text) = {
block(height: cover-band-height)[
#pad(left: cover-footer-inset)[
#align(horizon)[
#grid(
columns: (auto, auto, auto),
column-gutter: cover-footer-column-gap,
align: bottom,
[
#text(font: heading-font, size: cover-footer-label, weight: "bold", fill: cover-footer-heading)[
单位
]
#v(cover-footer-line-gap)
#text(font: body-font, size: cover-footer-body, fill: cover-footer-text)[
#meta.company
]
#v(cover-footer-line-gap-tight)
#text(font: body-font, size: cover-footer-note, fill: cover-text-muted)[
智能矿石分选 · 技术方案与工程实施
]
],
box(width: 1pt, height: cover-footer-divider-height, fill: cover-footer-rule),
[
#text(font: heading-font, size: cover-footer-label, weight: "bold", fill: cover-footer-heading)[
信息
]
#v(cover-footer-line-gap)
#text(font: body-font, size: cover-footer-body, fill: cover-footer-text)[
文档类型 技术报告
]
#v(cover-footer-line-gap-tight)
#text(font: body-font, size: cover-footer-note, fill: cover-text-muted)[
#meta.brand · #meta.version · #date-text
]
],
)
]
]
]
}
#let cover-page(meta, date: none) = {
let date-text = format-cover-date(date, meta.date)
let (title-line-1, title-line-2) = cover-title-lines(meta.title)
page(
paper: "a4",
margin: page-margin-cover,
fill: cover-bg,
header: none,
footer: none,
)[
#block(width: 100%, height: cover-body-height)[
#block(height: cover-band-height)[
#pad(left: cover-content-inset)[
#align(horizon)[
#grid(
columns: (auto, 1fr),
column-gutter: tw(3),
align: horizon,
cover-logo(),
[
#text(font: heading-font, size: cover-brand-size, weight: "bold", fill: cover-text)[
#meta.brand
]
#v(cover-footer-line-gap)
#text(font: body-font, size: cover-tagline-size, fill: cover-text-muted)[
#meta.company
]
],
)
]
]
]
#v(cover-header-gap)
#pad(right: cover-panel-right-gap)[
#block(width: 100%, height: cover-panel-height, fill: cover-panel-fill)[
#pad(
left: cover-content-inset,
right: cover-margin-right,
top: cover-panel-inset-y,
bottom: cover-panel-inset-bottom-y,
)[
#block(width: 100%, height: 100%)[
#place(top + left)[
#block(width: 100%)[
#text(
font: heading-font,
size: cover-panel-kicker,
weight: "medium",
fill: cover-panel-kicker-color,
tracking: 0.08em,
)[TECHNICAL REPORT · 技术报告]
#v(cover-panel-title-outer-gap)
#cover-title-block(title-line-1, title-line-2)
#v(cover-panel-title-outer-gap)
#text(
font: heading-font,
size: size-cover-subtitle,
fill: cover-panel-subtitle-color,
tracking: 0.04em,
)[INTELLIGENT ORE SORTING · 智能矿石分选]
]
]
#place(left + horizon)[
#line(
length: cover-panel-rule-width,
stroke: cover-panel-accent-stroke + cover-panel-divider-color,
)
]
#place(bottom + left)[
#block(width: 100%, breakable: false)[
#cover-panel-bottom(meta, date-text)
]
]
]
]
]
]
#v(cover-below-gap)
#cover-below-panel(meta, date-text)
]
]
}