title: Markdown 语法

Markdown 语法 {#markdown-syntax}

幻灯片通过 一个 markdown 文件 编写而成 (默认会使用 ./slides.md)。

你可以像平时编写 markdown 一样使用 Markdown 的相关特性,同时还支持内联的 HTML 和 Vue 组件。也支持使用 Windi CSS 来编写样式。使用 --- 添加分隔符来分隔你的幻灯片。

  1. # Slidev
  2. Hello, World!
  3. ---
  4. # Page 2
  5. Directly use code blocks for highlighting
  6. //```ts
  7. console.log('Hello, World!')
  8. //```
  9. ---
  10. # Page 3
  11. You can directly use Windi CSS and Vue components to style and enrich your slides.
  12. <div class="p-3">
  13. <Tweet id="20" />
  14. </div>

扉页及布局 {#front-matter-layouts}

你可以通过将分隔符转换为 扉页块 (front matter),为每张幻灯片指定布局 (layout) 和其他元数据。每个扉页信息都以分隔符 --- 开始,以另一个分隔符 --- 结束。两个分隔符之间的文本是 YAML 格式的数据对象。具体示例如下:

  1. ---
  2. layout: cover
  3. ---
  4. # Slidev
  5. This is the cover page.
  6. ---
  7. layout: center
  8. background: './images/background-1.png'
  9. class: 'text-white'
  10. ---​
  11. # Page 2
  12. This is a page with the layout `center` and a background image.
  13. ---
  14. # Page 3
  15. This is a default page without any additional metadata.

欲了解更多,请参阅 自定义 章节。

代码块 {#code-blocks}

建立 Slidev 一个非常重要的原因就是为了让代码在幻灯片中拥有正确的高亮。如你所见,你可以使用 Markdown 风格的代码块,以使得你的代码高亮。

  1. //```ts
  2. console.log('Hello, World!')
  3. //```

我们支持 PrismShiki 作为语法高亮器。请参阅 语法高亮器 获取更多细节。

特定行高亮 {#line-highlighting}

如需针对特定行进行高亮展示,只需在 {} 内添加对应的行号。行号从 1 开始计算。

  1. //```ts {2,3}
  2. function add(
  3. a: Ref<number> | number,
  4. b: Ref<number> | number
  5. ) {
  6. return computed(() => unref(a) + unref(b))
  7. }
  8. //```

如果要在多个步骤中改变高亮,你可以用 | 分隔它们。比如:

  1. //```ts {2-3|5|all}
  2. function add(
  3. a: Ref<number> | number,
  4. b: Ref<number> | number
  5. ) {
  6. return computed(() => unref(a) + unref(b))
  7. }
  8. //```

这段代码会先对 a: Ref<number> | numberb: Ref<number> | number 进行高亮展示,当你点击幻灯片后,会高亮展示 return computed(() => unref(a) + unref(b)),最后,会对整个块进行高亮展示。你可以在 动画指南 中了解更多。

Monaco 编辑器 {#monaco-editor}

当你需要在演示文稿中做修改时,只需在语言 id 后添加 {monaco} —— 即可将该代码块变为一个功能齐全的 Monaco 编辑器。

  1. //```ts {monaco}
  2. console.log('HelloWorld')
  3. //```

欲了解更多,请参阅 配置 Monaco

内联样式 {#embedded-styles}

你可以在 Markdown 中直接使用 <style> 标签来覆盖当前幻灯片的样式。

  1. # This is Red
  2. <style>
  3. h1 {
  4. color: red
  5. }
  6. </style>
  7. ---
  8. # Next slide is not affected

Markdown 中的 <style> 标签均为 scoped。如果想覆盖全局样式,请查阅 项目结构

Windi CSS 的支持下,你可以直接使用嵌套的 CSS 和 指令集。(例如,@apply)

  1. # Slidev
  2. > Hello `world`
  3. <style>
  4. blockquote {
  5. code {
  6. @apply text-teal-500 dark:text-teal-400;
  7. }
  8. }
  9. </style>

静态资源 {#static-assets}

和编写 Markdown 的方式一样,你可以使用本地或远程的 URL 的图片。

如果是远程资源,内置的 vite-plugin-remote-assets 将在第一次运行时把它们缓存到磁盘中,即便是大图也能实现立即加载。

  1. ![Remote Image](https://sli.dev/favicon.png)

如果是本地资源,请将资源放置到 public 文件夹 中并使用 / 开头的 URL 来引用它们。

  1. ![Local Image](/pic.png)

如果你想使用自定义的尺寸或样式,可以使用 <img> 标签

  1. <img src="/pic.png" class="m-40 h-40 rounded shadow" />

备注 {#notes}

你也可以为每张幻灯片编写备注。它们将展示在 演讲者模式 中,供你在演示时参考。

在 Markdown 中,每张幻灯片中的最后一个注释块将被视为备注。

  1. ---
  2. layout: cover
  3. ---
  4. # 第 1 页
  5. This is the cover page.
  6. <!-- 这是一条备注 -->
  7. ---
  8. # 第 2 页
  9. <!-- 这不是一条备注,因为它在幻灯片内容前 -->
  10. The second page
  11. <!--
  12. 这是另一条备注
  13. -->

图标 {#icons}

Slidev 允许你在 Markdown 中直接访问几乎所有的开源的图标集。这得益于 vite-plugin-iconsIconify

图标 ID 遵循 Iconify 的命名规则 {collection-name}-{icon-name}。例如:

  • 使用 Material Design Icons,其规则为 <mdi-account-circle /> -
  • 使用 Carbon,其规则为 <carbon-badge /> -
  • 使用 Unicons Monochrome,其规则为 <uim-rocket /> -
  • 使用 Twemoji,其规则为 <twemoji-cat-with-tears-of-joy /> -
  • 使用 SVG Logos,其规则为 <logos-vue /> -
  • 还有更多…

你可以通过 Icônes 来浏览访问所有可用的图标。

调整图标样式 {#styling-icons}

你可以像其他 HTML 元素一样对图标的样式进行修改。例如:

  1. <uim-rocket />
  2. <uim-rocket class="text-3xl text-red-400 mx-2" />
  3. <uim-rocket class="text-3xl text-orange-400 animate-ping" />

插槽 {#slots}

自 v0.18 开始可用

一些布局可以使用 Vue 的具名插槽

例如,在 two-cols 布局 中,你可以采用左(default 插槽)右(right 插槽)两列的布局方式。

  1. ---
  2. layout: two-cols
  3. ---
  4. <template v-slot:default>
  5. # Left
  6. This shows on the left
  7. </template>
  8. <template v-slot:right>
  9. # Right
  10. This shows on the right
  11. </template>

Left

This shows on the left

Right

This shows on the right

我们还为具名插槽提供了一个语法糖 ::name::。下述示例与上述示例的工作原理完全相同。

  1. ---
  2. layout: two-cols
  3. ---
  4. # Left
  5. This shows on the left
  6. ::right::
  7. # Right
  8. This shows on the right

你也可以明确的指定默认插槽,并按自定义顺序展示。

  1. ---
  2. layout: two-cols
  3. ---
  4. ::right::
  5. # Right
  6. This shows on the right
  7. ::default::
  8. # Left
  9. This shows on the left

配置 {#configurations}

依赖的所有配置都可以在 Markdown 文件中定义,比如:

  1. ---
  2. theme: seriph
  3. layout: cover
  4. background: 'https://source.unsplash.com/1600x900/?nature,water'
  5. ---
  6. # Slidev
  7. This is the cover page.

欲了解更多,请参阅 扉页配置 章节。

LaTeX {#latex}

Slidev 开箱即有对 LaTeX 的支持,得益于 KaTeX

内联 {#inline}

在你的 LaTeX 语法左右各加一个 $,用于内联渲染。

  1. $\sqrt{3x-1}+(1+x)^2$

块 {#block}

当使用两个 ($$) 时,会进行块级渲染。这种模式会使用更大的符号,并将结果居中。

  1. $$
  2. \begin{array}{c}
  3. \nabla \times \vec{\mathbf{B}} -\, \frac1c\, \frac{\partial\vec{\mathbf{E}}}{\partial t} &
  4. = \frac{4\pi}{c}\vec{\mathbf{j}} \nabla \cdot \vec{\mathbf{E}} & = 4 \pi \rho \\
  5. \nabla \times \vec{\mathbf{E}}\, +\, \frac1c\, \frac{\partial\vec{\mathbf{B}}}{\partial t} & = \vec{\mathbf{0}} \\
  6. \nabla \cdot \vec{\mathbf{B}} & = 0
  7. \end{array}
  8. $$

了解更多:Demo | KaTeX | markdown-it-katex

图表 {#diagrams}

你也可以在 Markdown 的文本描述中创建图形或图表,得益于 Mermaid

被标记为 mermaid 的代码块将被转换为图形,例如:

  1. //```mermaid
  2. sequenceDiagram
  3. Alice->John: Hello John, how are you?
  4. Note over Alice,John: A typical interaction
  5. //```

你可以向它传递一个配置项来指定缩放和主题。该对象的语法是 JavaScript 的对象字面量,你需要对字符串添加引号 ('),并在键与键之间使用(,)。

  1. //```mermaid {theme: 'neutral', scale: 0.8}
  2. graph TD
  3. B[Text] --> C{Decision}
  4. C -->|One| D[Result 1]
  5. C -->|Two| E[Result 2]
  6. //```

了解更多:Demo | Mermaid

多个入口点 {#multiple-entries}

自 v0.15 开始可用

这意味着你可以将 slides.md 分割成多个文件,并可以按照你的需求组织它们。

slides.md :

  1. # Page 1
  2. This is a normal page
  3. ---
  4. src: ./subpage2.md
  5. ---
  6. <!-- this page will be loaded from './subpage2.md' -->
  7. Inline content will be ignored

subpage2.md :

  1. # Page 2
  2. This page is from another file

合并 Frontmatter {#frontmatter-merging}

你可以为主入口点和外部 markdown 页面提供 frontmatter。如果其中有相同的 key,主入口点的 key 拥有更高的优先级。例如:

slides.md :

  1. ---
  2. src: ./cover.md
  3. background: https://sli.dev/bar.png
  4. class: text-center
  5. ---

cover.md :

  1. ---
  2. layout: cover
  3. background: https://sli.dev/foo.png
  4. ---
  5. # Cover
  6. Cover Page

其效果最终与下述页面相同:

  1. ---
  2. layout: cover
  3. background: https://sli.dev/bar.png
  4. class: text-center
  5. ---
  6. # Cover
  7. Cover Page

页面复用 {#page-reusing}

有了多入口点的加持,对页面进行重用变得很容易。例如:

  1. ---
  2. src: ./cover.md
  3. ---
  4. ---
  5. src: ./intro.md
  6. ---
  7. ---
  8. src: ./content.md
  9. ---
  10. ---
  11. # reuse
  12. src: ./content.md
  13. ---