仿 NOI 风格题面的 Typst 模板
  • 板块灌水区
  • 楼主破壁人五号
  • 当前回复6
  • 已保存回复6
  • 发布时间2024/1/22 18:11
  • 上次更新2024/1/22 20:32:32
查看原帖
仿 NOI 风格题面的 Typst 模板
37676
破壁人五号楼主2024/1/22 18:11

OI-Statement-Typst 是一个 Typst 模板,用于创作 CNOI 风格的题面。

什么是 Typst?

Typst 旨在成为 LaTeX 的替代品是怎么回事呢?LaTeX 相信大家都很熟…… 抱歉走错片场了。

Typst 是一个新兴的排版引擎,其语法简洁、易于安装、编译速度快、有一套现代的语言用于编程。是 LaTeX\LaTeX 的有力竞争对手。

效果展示

P1

题目表格可以方便地生成,同时可以自定义其中的内容。


#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"),
  // )
)

P2

在 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
```
]

P3

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 行以更换字体来达到你更偏好的效果。

2024/1/22 18:11
加载中...