📝

Typst でルビをふる

2023/04/11に公開

Typst という組版ソフトが使いやすくて良い。 これまで組版ソフトをいくつか検討したが Windows で動作しないか、動作したとしても導入するのがあまりにも面倒だったりしたので Typst の登場はとてもありがたい。

残念なことに新興である分だけ機能不足もある。 スクリプトを書くことで色々と制御できるようになっているので用意されていない機能は自分でなんとかしてみようと考え、私が使うにあたってまず欲しいと思ったルビ (読み仮名) をふる関数を定義してみた。

#set page(width: 20em, height: 14em, margin: (rest: 1em))
#set par(justify: true)
#set text(lang: "ja")

#let ruby(rt, rb, size: 0.4em, alignment: "between") = {
    let gutter = if (alignment=="center" or alignment=="start") {h(0pt)} else if (alignment=="between" or alignment=="around") {h(1fr)}
    let chars = if(alignment=="around") {
        [#h(0.5fr)#rt.clusters().join(gutter)#h(0.5fr)]
    } else {
        rt.clusters().join(gutter)
    }
    style(st=> {
        let bodysize = measure(rb, st)
        let rt_plain = text(size: size, rt)
        let width = if(measure(rt_plain, st).width > bodysize.width) {measure(rt_plain, st).width} else {bodysize.width}
        let rubytext = box(width: width, align(if(alignment=="start"){left}else{center}, text(size: size, chars)))
        let textsize = measure(rubytext, st)
        let x = if(alignment=="start"){0pt}else{bodysize.width/2-textsize.width/2}
        box[#place(top+left, dx: x, dy: -size*1.2, rubytext)#rb]
    })
}

= ルビの使用例

ルビを#ruby("つ")[付]ける#ruby("かんいてき")[簡易的]なスクリプトを#ruby("か")[書]いてみました。
#ruby(alignment: "between", "きんとうわ")[均等割]りや#ruby(alignment: "start", "かたつ")[肩付]き、そして#ruby(alignment: "center", "ちゅうおうそろ")[中央揃]えも#ruby(alignment: "around", "でき")[出来]ます。

HTMLでいうところの`space-around`の#ruby("やくご")[訳語]がわかりませんがそれに#ruby("そうとう")[相当]することも#ruby(alignment: "around", "でき")[出来]ます。
たとえば#ruby(alignment: "around", "レールガン")[超電磁砲]のように。

組版の結果

実際に使うとなれば色々と不備はあるだろうがとりあえず場当たり的な実装としてはまあまあなものになったと思う。

Discussion