マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

チョットTypstしてみた話

Typstって何

Typstは今年(2023年)の3月頃に一般公開された、新しい組版エンジンです(現在はベータ版)。

詳細については以下の記事を参照しましょう。

zenn.dev

開発も活発に続けられていて、5月20日リリースの0.4.0版では、なんと、日本語組版のサポートが始まりました😲 今も着実に改良が加えられているようです。

というわけで、早速Typstでチョット文書を作ってみました。

Typstでナベアツする件

プログラマブル組版ソフトウェアで何か文書を作るとなれば、最初にやるべきなのはやっぱりNabeAzzですね。元ネタはもう忘れ去られていると思うので、改めて問題の内容を説明しておきます。

「NabeAzz問題」は以下の版面出力を行うプログラムを実装する問題です。

  • 与えられた正整数 n に対して、1から n までの整数の十進表記を順に空白区切りで出力する。
  • ただし、整数が「3の倍数である」または「その十進表記に数字3を含む」場合は、“アホなフォント”に切り替えて出力する。

「フォントを変えて出力する」という要件があるので組版用プログラム言語専用の問題といえます。これまでTeXPostScriptMetaPostでの実装が知られています。

やってみた

#import "zrsimple.typ"

#show: zrsimple.doc.with(
  paper: "a5",
  title: "NabeAzz with Typst",
  author: "ZR"
)

// "アホなフォント"のファミリ名
#let aho-font = "Allura"
// nabeazz(n integer) -> content
// 入力がnのときの"NabeAzz問題"の出力.
#let nabeazz(lmt) = {
  range(1, lmt+1).map(n => {
    if calc.rem(n, 3) == 0 or "3" in str(n) {
      text(size: 2em, font: aho-font, str(n))
    } else {
      str(n)
    }
  }).join([ ])
}

#nabeazz(40)

Typstでドドスコする件

TypstでNabeAzzができたとなると、当然の帰結として次はドドスコをやりたくなりますね🙃

「ドドスコ問題」は次のようなプログラムを実装する問題です。

この問題には組版的要件が含まれないため、イロイロな言語での実装が行われています。組版用言語に限ると、TeXSATySFiでの実装があります。

やってみた

#import "zrjasimple.typ"

#show: zrjasimple.doc.with(
  title: "Typst でドドスコしてみた",
  author: "某 ZR"
)

// ddsk(seed integer) -> string
// 乱数種をseedとしたときの"ドドスコ問題"の出力の文字列.
#let ddsk(seed) = {
  let (m, a) = (0x7FFFFFFF, 16807)
  let next(v) = calc.rem(v * a, m)
  let r = next(next(seed))
  let s = 0
  while s != 0x888 {
    let b = calc.odd(int(r / 0x4000))
    s = calc.rem(s * 2 + int(b), 0x1000)
    if b {"ドド"} else {"スコ"}
    r = next(r)
  }
  "ラブ注入♡"
}

#ddsk(80000)

まとめ

現在のところ、TeXやSATySFiと比べるとTypstには以下のような大きなメリットがあります。

というわけで、皆さんも、Typstでイロイロやってみましょう!💁