Kodama Tutorials [index-en-US]

Backlinks

Kodama 教程 [tutorials]

安装 [install]

你可以根据目标设备的架构直接从 Github Release 页面下载二进制文件. 在 Termux 等 Android 环境中使用请选择 aarch64-unknown-linux-musl 架构.

  • 确保 Kodama 位于可执行目录.
  • 确保 Kodama 有可执行权限.
  • 如果你乐意, 将 Kodama 添加到环境变量.
  • Kodama 不内置 Typst, 因此如果你的内容涉及 Typst 文本, 你需要保证环境变量中有可用的 Typst 程序.

Github Release 页面缺少适合你设备的文件时, 你可以从 源代码 开始自己构建, 这也很容易.

编译 [compile]

指令 kodama compile 或缩写为 kodama c 将根据输入的 Markdown 工作区路径构建出 HTML 文件. 默认位于工作区路径的 publish 文件夹下.
尽管有 --root 参数, 但仍然建议所有用户在 index.md 文件所在的目录下执行 kodama c.

shell [compile-help]

$ kodama c --help
Compile current workspace dir to HTMLs

Usage: kodama.exe compile [OPTIONS]

OOptions:
  -b, --base <BASE>                Base URL or publish URL (e.g. https://www.example.com/) [default: /] 
  -o, --output <OUTPUT>            Path to output dir [default: ./publish]
  -r, --root <ROOT>                Configures the project root (for absolute paths) [default: ./]       
  -d, --disable-pretty-urls        Disable pretty urls (`/page` to `/page.html`)
  -s, --short-slug                 Hide parents part in slug (e.g. `tutorials/install` to `install`)    
  -f, --footer-mode <FOOTER_MODE>  Specify the inline mode for the footer sections [default: link] [possible values: link, embed]
  -h, --help                       Print help

举例来说, 如果最终部署到的 URL 为 https://www.example.com/blog, 这并非该域名的根目录, 为了保证生成链接的正确性, 用户应该指定 --base 这一编译参数, 即

kodama c -b=https://www.example.com/blog

注意. 当然, 如果用户只是在本地使用, 就不必考虑这个问题了.

本地预览 [publish]

如果你希望在本地查看生成页面 publish/ 的效果, 通常你需要一个本地 http 服务器. 你可以使用任何你熟悉的工具完成这件事. 此处推荐 miniserve, 安装后在 Kodama 项目的根路径执行如下指令即可.

miniserve ./publish --index index.html --pretty-urls

链接规则 [link-rules]

虽然 Kodama 所处理的 Markdown 文件从语法上说是完全符合 CommonMark 标准的, 但是由于它实现了 CommonMark 之外的许多功能, 为了从语法上区分开来, 用户在使用这些额外的功能时, 请务必遵循下面的规则.

首先需要强调的是, 无论是嵌入文件 1 还是内部链接 2 的路径, 都应该是以 / 开头的相对于当前工作区的绝对路径.

嵌入语法 [embed-syntax]

嵌入语法和标准链接语法 [text](url) 的区别在于, 嵌入的 url 带有特殊的后缀, 并且只能是以下几种:

  • .md#:embed, 嵌入 Markdown.
  • .typ#:block, 嵌入 Typst 编译后的 SVG, 并居中展示为块级元素.
  • .typ#:span, 嵌入 Typst 编译后的 SVG, 并展示为行间元素 (不常用).
  • .typ#:shared, 在当前文件的上下文中导入该 Typst 文件, 此时 text 用于提供被导入的定义范围, 如所有定义 *. 配合内联 Typst 语法使用.

这些特殊后缀采用这种语法的一个原因是, 许多 Markdown 编辑器 1 能够正确识别从而享受文件之间的跳转功能.

大部分时候, 嵌入语法的 text 都是空着的, 不过由于只有 Markdown 的嵌入才会产生子 section, 此时 text 能用于设置 section 默认是否展开以及在目录中的状态. 这些设置由一系列特定字符构成, 它们对应的功能彼此独立, 因此书写的先后顺序可以任意.

  • +, 表示当前 section 使用计数器.
  • -, 默认折叠当前 section. 相应的, 如果这个 section 也有一系列子 section, 这些子 section 将不会出现在当前页面的目录里.
  • ., 在当前页面的目录里隐藏这个 section.

很多时候, 对于相当简单的 Typst 文本, 用户会希望有一种方式在展示上对应于 KaTeX\KaTeX 语境下的行内公式, 这就是内联 Typst.

内联语法 [inline-syntax]

内联 Typst 也许是 Kodama 真正的优势所在, 因为设计者做了许多努力使其表现的就和 KaTeX\KaTeX 行内公式一样或者至少非常接近, 从而不会让 Typst 的那部分行内公式在与 KaTeX\KaTeX 混合编排时显得廉价.

内联 Typst 也采用 链接类语法, 但是此时不会有任何文件被链接. url 部分用于指定内联模式和 margin 参数, 绝大部分情况下, 用户都不需要自己手动设置 margin 参数便可以取得较好的呈现效果. 内联模式是一个为了方便 Markdown 编辑器本身的预览功能而设计的参数, 当用户填入 math 时, text 部分的内容就会被自动加上 ${}$ 再交给 Typst 编译. 以下是一些例子:

  • [$x^2$](inline), x^2 同时是合法的 KaTeX\KaTeX 公式和 Typst 公式, 此时 Markdown 编辑器本身的预览功能可将它正确呈现为 x2x^2. 虽然这个例子简单到根本没有任何理由使用 Typst.
  • # 在 Typst 当中是一个高频率使用的字符, 此时如果依然手写 ${}$ 则会导致编辑器内 Markdown 预览的体验不佳, 这就是内联模式参数 math 的意义. 现在你可以将第一个例子写为 [x^2](inline-math).
  • 各个参数的值之间使用 - 分隔. mathmargin 的位置是固定的, 换言之, 如果这两个参数同时出现, 你只能将 margin 写在 math 之后. margin 由形如 {x}-{y} 的文本构成, xy 是任何有效的 Typst 长度值, 如 0pt-2pt. 当 y 缺失时, y 会采用 x 的值.

持续集成 [github-workflow]

一个可供参考的 Github Workflow 配置 如下 1. 唯一需要注意的是环境变量 $PAGE_URL, 用于 指定待部署页面的 URL, 你可以在仓库的 settings/variables/actions 设置 它们.

workflow.yml [workflow-yml]

name: Deploy Kodama site to Pages

on:
  # Runs on pushes targeting the default branch
  push:
    branches: ["main"]

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions:
  contents: read
  pages: write
  id-token: write

# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
concurrency:
  group: "pages"
  cancel-in-progress: false

# Default to bash
defaults:
  run:
    shell: bash

jobs:
  # Build job
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Install Kodama & Typst
        run: |
          cargo install --git https://github.com/kokic/kodama.git
          sudo snap install typst
      - name: Checkout
        uses: actions/checkout@v4
        with:
          submodules: recursive
      - name: Setup Pages
        id: pages
        uses: actions/configure-pages@v5
      - name: Build with Kodama
        run: |
          kodama c -b $PAGE_URL
      - name: Upload artifact
        uses: actions/upload-pages-artifact@v3
        with:
          path: ./publish

# Deployment job
  deploy:
    environment:
      name: github-pages
      url: $PAGE_URL
    runs-on: ubuntu-latest
    needs: build
    steps:
      - name: Deploy to GitHub Pages
        id: deployment
        uses: actions/deploy-pages@v4

1

Hong Jiarong 提供.