OI-Statement-Typst 是一个 Typst 模板,用于创作 CNOI 风格的题面。
Typst 旨在成为 LaTeX 的替代品是怎么回事呢?LaTeX 相信大家都很熟…… 抱歉走错片场了。
Typst 是一个新兴的排版引擎,其语法简洁、易于安装、编译速度快、有一套现代的语言用于编程。是 LATEX 的有力竞争对手。
题目表格可以方便地生成,同时可以自定义其中的内容。
#let prob-list = (
(
name: "圆格染色",
name-en: "color",
time-limit: "1.0 秒",
memory-limit: "512 MiB",
test-case-count: "10",
test-case-equal: "是",
year: "2023",
),
// 此处省略若干行
)
// 此处省略若干行
#problem-information-table(prob-list,
extra-rows:(
("year", "年份", text, false, "2023"),
// key, name, wrapper, always-show, default-value
("contest", "赛事", text.with(fill: blue), true, "NOI"),
("setter", "出题人", text, true, p=>{p.name+"的出题人"}),
("foo", "bar", text, false, "这一行不会显示"),
),
// languages:(
// ("C++", "cpp"),
// ("D++", "dpp")
// ),
// compile-options: (
// ("C++", "-O2 -std=c++20 -DOFFLINE_JUDGE"),
// )
)

在 Typst 的加持下,你可以用简洁的语法编辑题目的文本和公式。样例内容可以从文件中读入。
#next-problem()
== 题目描述
输入两个正整数 $a, b$,输出它们的和。
你可以#dstrong[强调一段带 $f+or+mu+l+a$ 的文本]。用 `#underline` 加 ``` `` ``` 来实现 #underline[`underlined raw text`]。
// 此处省略若干行
== 输入格式
从文件 #filename[color.in] 中读入数据。
输入的第一行包含两个正整数 $a, b$,表示需要求和的两个数。
== 输出格式
输出到文件 #filename[color.out] 中。
输出一行一个整数,表示 $a+b$。
== 样例1输入
#sample(read("example-assets/color1.in"))
== 样例1输出
#sample[
```text
13
```
]

Typst 有一套现代的编程语言,你可以借助它省下很多机械的操作。
复杂表格的绘制也很优雅。
#for (i,case) in range(6).zip(($1 tilde 5$, $6 tilde 9$, $10 tilde 13$, $14 tilde 17$, $18 tilde 19$, $20$)){[
== 样例#{i+2}
见选手目录下的 #filename[color/color#{i+2}#"."in] 与 #filename[color/color#{i+2}#"."ans]。
这个样例满足测试点 #case 的条件限制。
]}
== 数据范围
对于所有测试数据保证:$1 <= a,b <= 10^9$。
#align(center,
box( // 使用 box 来强制让表格处于同一页
tablex(
columns: 4,
auto-vlines: false,
stroke: 0.4pt,
align: center+horizon,
(), vlinex(), vlinex(), vlinex(), (),
hlinex(stroke: 2pt),
[测试点编号], $n,m <=$, $q<=$, [特殊性质],
hlinex(stroke: 1.2pt),
$1 tilde 5$, $300$, $300$, rowspanx(2)[无],
$6 tilde 9$, rowspanx(4)[$10^5$], $2000$, (),
$10 tilde 13$, (), rowspanx(4)[$10^5$], [A],
$14 tilde 17$, (), (), [B],
$18 tilde 19$, (), (), rowspanx(2)[无],
$20$, $10^9$, (), (),
hlinex(stroke: 2pt),
)
)
)
#empty-par
特殊性质 A: 你可以像上面这样创建复杂的表格。
特殊性质 B: 模板没有对 `tablex` 额外封装。在 `tablex` 之后,你需要用 `#empty-par` 插入一个空段落,以确保之后段落的首行缩进正确。你也可以通过 `#h(2em)` 手动添加缩进。

你很可能需要修改 typst-oi-statement.typ 中的 28 至 33 行以更换字体来达到你更偏好的效果。