FrameSeq

内容#

每个内容命令都会往当前区域加一个对象,并返回一个可链式调用的构建器。

每个常用命令的定义、签名、参数、返回值和一个聚焦的例子,见 Function reference(英文)。

文字#

text("A normal paragraph");

text("A highlighted sentence")
  .size(pt(28))
  .color("#38bdf8")
  .bold();

文字角色提供了带演示语义的默认值:

text("Main title").hero();
text("Supporting message").subtitle();
text("Ada Lovelace").author();
text("SECTION 01").eyebrow();
text("The important idea").lead();
text("Source: Example").caption();
text("A memorable sentence").quote();

在同一个对象上再调用另一个角色,会替换掉前一个角色。

行内公式#

行内公式写在 $ 之间:

text`Euler's identity is $e^{i\pi} + 1 = 0$.`;

标签模板形式会保留 LaTeX 的反斜杠。要写字面意义的美元符号,用 \$

独立公式#

独立公式用 math 模板标签:

math`\int_{-\infty}^{\infty} e^{-x^2}\,dx = \sqrt{\pi}`;

字符串形式也可以,但要遵守 JavaScript 的转义规则:

math("\\frac{a}{b}");

FrameSeq 用 KaTeX 渲染公式。不支持的 LaTeX 命令会显示成一处公式错误,而不会让整场演示挂掉。

复杂的局部排版见 Typst integration(英文);想直接复用现成的 LaTeX tabular 片段,见 LaTeX integration(英文)。

代码#

code(`const answer = 42;`, "ts");

第二个参数记录语言,默认 "ts"。0.1 版把代码按原样渲染为预格式化文本,不做语法高亮。

图片#

image("https://example.com/diagram.png", "System diagram");

有信息量的图片一定要写有用的替代文本。如果资源就放在幻灯片源码旁边,交给 Vite 解析 URL:

const diagram = new URL("./assets/diagram.png", import.meta.url).href;
image(diagram, "Compiler pipeline");

图片对象支持常规的尺寸和外观修饰符:

image(diagram, "Compiler pipeline")
  .width(percent(100))
  .radius(18);

图形#

rect()circle()line() 直接在源码里搭可编辑的图:

slide({ name: "Pipeline" }).canvas();

line({ x1: 320, y1: 180, x2: 520, y2: 180 }).arrow("end");
rect("Input").position({ x: 80, y: 125 }).width(240).height(110);
circle("Model").position({ x: 520, y: 100 }).width(160);

填充、描边、箭头方向、坐标行为和自定义 SVG 见 Shapes and connectors(英文);把这些图元组合成不用写坐标的图,见 Diagrams(英文)。

要点列表#

bullets(
  "Linear source code",
  "Useful layout defaults",
  "HTML and PDF output",
);

bullets() 生成一个立即全部可见的无序列表。

分步列表#

steps(
  "Parse the document",
  "Build the page tree",
  "Render the presentation",
);

steps() 生成一个有序列表,翻页时逐条揭示。

想自定义渐进揭示,在任意内容对象上用 showAt():

text("First reveal").showAt(1);
image(diagram, "Diagram").showAt(2);

指标#

metric(value, label) 生成一个小的数据强调对象。第一个参数作为醒目的主值显示,第二个是解释这个值的小标签。

metric("42%", "Growth");

呈现出来的是"42% —— Growth"这种视觉结构。FrameSeq 只显示你给的字符串,不做计算也不做格式化。指标适合短的"数字 + 标签"组合,不适合放句子或段落。

几个可比的事实并排放进网格时,指标最有用:

slide("Results").grid(3);

cell(0); metric("42%", "Growth");
cell(1); metric("18K", "Users");
cell(2); metric("99.9%", "Uptime");

如果网格只占页面的一部分,把指标对象直接传给 gridSection():

text("Quarterly results");

gridSection(
  3,
  metric("42%", "Growth"),
  metric("18K", "Users"),
  metric("99.9%", "Uptime"),
);

text("All targets were exceeded.");

metric() 返回它创建的对象,所以可以继续加样式,或者变成标准卡片:

metric("42%", "Revenue growth")
  .card()
  .background("#eff6ff");

卡片#

card(title, content?) 生成一个带边框的"标题 + 正文"面板,适合短的特性、选项或小结。

card("Portable", "Export HTML, PDF, and editable PPTX.");

普通段落用 text(),关键数值用 metric();当标题和它的说明句应当作为一个整体被阅读时,用 card()

分组#

group(...items) 把多个对象合成一个纵向对象。当某个网格单元里的子项需要不同的文字角色或样式时,它很有用。

group(
  text("Revenue").bold(),
  text("$1.2M").size(42),
).card();

子对象照常创建,然后 group() 把它们变成一个可整体移动、整体加样式的单元。group() 也接受名字(group("a", "b")),这样连局部变量都不需要。每个常用创作函数的简明说明和例子见 Function reference(英文)。