🦋

Typstの中でJuliaのコードを実行する

2024/12/15に公開

Typst Advent Calendar 2024 の14日目の代わりの記事です。

https://qiita.com/advent-calendar/2024/typst

Julia Advent Calendar 2024 (シリーズ2)の15日目にも入れました。

https://qiita.com/advent-calendar/2024/julia

はじめに

Xで次のようなポストが流れてきました。

https://x.com/JuliaHub_Inc/status/1866894975868227898

今年のJuliCon2024のAndreas Kröpelin さんの Jlyfish: Reproducible documents with Julia and Typst という発表でした。

https://youtu.be/Kgjl-DVjOMI?si=FcP-dMivoA44yHFP

この動画を見ると,Typst*.typ のファイルにJuliaのコードを書いて,そのまま実行して,その結果を表示するものでした。Julia側でTypstのファイルの変更を監視して,*-jlyfish.jsonの中間ファイルと作り,Typstに反映させていました。

いい感じだったので,その報告です。

Jlyfishのパッケージ

こちらはTypstのパッケージをまとめてあるサイトにあります。

https://typst.app/universe/package/jlyfish/

このサイトの手順に沿って,やってみました。

Julia側のパッケージの追加

まず,juliaREPLTypstJlyfish.jlパッケージを追加します。

julia
julia> ]

(@v1.10) pkg> add TypstJlyfish

Typst側のコード

次にTypst側にパッケージを利用するためのコードを追加します。(1行目)
2行目はjsonファイルを参照するためのものです。
3行目の#jl( )の括弧の中にJuliaのコードを書きます。

Typst
#import "@preview/jlyfish:0.1.0": *

#read-julia-output(json("your-document-jlyfish.json"))

What is the sum of the whole numbers from one to a hundred? #jl(`sum(1:100)`)

Juliaとの連携

今度はJuliaREPLからTypstJlyfish.jlを読み込み,ターゲットとなるTypstのファイルを監視します。TypstJuliaのコードが変更されるとコードが実行され,その結果が*-jlyfish.jsonに書き込まれ,*.typに反映される仕組みです。

Julia
julia> import TypstJlyfish

julia> TypstJlyfish.watch("your-document.typ")

また,Juliaでまだ追加されていないパッケージが想定される場合は

Julia
#jl-pkg("Colors", "Typstry", "Makie", "CairoMakie")

などとTypstのファイルの書いておくと,パッケージの追加も行われます。(すでにパッケージが追加されている場合は,なくても大丈夫です。)

参考コード

私がサンプルで作成したコードです。

121502.typ

#import "@preview/jlyfish:0.1.0": *

#read-julia-output(json("121502-jlyfish.json"))


== $y=sin x$ のグラフ

#jl(
  ```julia
  using Plots
  plot(sin)
  ```)


私のMacではVSCodeの環境でやってみました。

別のファイルですが,Xに動画もポストしてあります。

https://x.com/dannchu/status/1867909619441656202

Enjoy typst and julia life!

Discussion