Skip to content

Instantly share code, notes, and snippets.

@zr-tex8r
Last active April 19, 2025 14:20
Show Gist options
  • Save zr-tex8r/c115c2395c97f491f518507d0a24dc50 to your computer and use it in GitHub Desktop.
Save zr-tex8r/c115c2395c97f491f518507d0a24dc50 to your computer and use it in GitHub Desktop.
Typst:Typst上でKaTeXを動作させる

k-tie

Typst:Typst上でKaTeXを動作させる

インストール&パッケージ読込

準備:

  • KaTeXのReleaseのページからリリース版アーカイブを取得する。
  • アーカイブ中からkatex.min.jsファイルを抽出する。

パッケージとしてローカルにインストールする場合:

katex.min.jsk-tie.typと同階層に置く形でローカルレポジトリにインストールする。 パッケージの読込は以下の通り。

#import "@local/k-tie:0.2.0"

単純にモジュールとして使用する場合:

katex.min.jsk-tie.typをカレントディレクトリに配置する。 モジュールの読込は以下の通り。

#import "k-tie.typ"

使用法

  • to-mathml(«LaTeX記述», …)[str]: LaTeXコードをKaTeXを用いてMathMLコードに変換する。«LaTeX記述»は複数指定可能(可変長)で、改行区切りで連結した文字列がKaTeXに渡される。
    • «LaTeX記述»[str|content]: LaTeXコードの文字列。str値またはrawテキストで指定する。
  • to-string(«LaTeX記述», …)[str]: to-mathmlでMathMLに変換した後に、結果のMathMLデータに含まれる文字だけを抽出した文字列を返す。
    • «LaTeX記述»[str|content]: LaTeXコードの文字列。str値またはrawテキストで指定する。
  • dumb-parse(«MathML記述»)[str]: MathMLデータの中の文字だけを抽出して文字列に変換する。
    • «MathML記述»[str]: MathMLデータの文字列。
#import "@local/k-tie:0.2.0"
#k-tie.to-string(`\alpha\otimes\beta`)
#k-tie.to-mathml(`\alpha\otimes\beta`)
// k-tie.typ : Typst上でKaTeXを動かすやつ
#let (
to-mathml,
dumb-parse,
to-string,
) = {
import "@preview/jogs:0.2.4"
// katex.min.js の前に追加するJavaScriptコード
let prologue = ```
let self = {}
```
// katex.min.js の後に追加するJavaScriptコード
let epilogue = ```
function convertToMathML(source) {
return self.katex.renderToString(
source,
{ output: "mathml" },
);
}
```
let bytecode = jogs.compile-js((
prologue.text,
read("./katex.min.js"),
epilogue.text,
).join("\n"))
// 入力の"テキスト"をstr値に変換する.
let stringify(it) = {
// textプロパティをもつコンテンツ(rawテキスト等が該当)の
// 場合はその値を取得
if type(it) == content and it.has("text") {
it = it.text
}
assert(
type(it) == str,
message: "unexpected " + str(type(it)),
)
return it
}
// XMLデータの中の文字列だけを抜き出す.
let dumb-parse(data) = {
if type(data) == array {
data.map(dumb-parse).join()
} else if type(data) == dictionary {
// annotation要素は無視する
if data.tag != "annotation" {
dumb-parse(data.children)
}
} else if type(data) == str {
data
}
}
// TeXコードをMathMLに変換する.
let to-mathml(..args) = {
// 全ての引数を文字列に変換して連結する
let source = args.pos().map(stringify).join("\n")
// 数式前提なので空行(改段落)を消す
source = source.replace(regex("\n+"), "\n")
// KaTeXの機能を呼び出す
jogs.call-js-function(bytecode, "convertToMathML", source)
}
// TeXコードを数式に描出しその中の文字列情報を抽出する.
// ※動作確認用.
let to-string(..args) = {
dumb-parse(xml(bytes(to-mathml(..args))))
}
( // エクスポート
to-mathml,
dumb-parse,
to-string,
)
}
[package]
name = "k-tie"
version = "0.2.0"
entrypoint = "k-tie.typ"
compiler = "0.13.0"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment