🐷

Typst最初の段落の字下げの調整方法

2024/01/17に公開

Typstを使っていて、最初に出遭ってしまう問題の一つとして、章段の最初の段落がインデントされないというのがあります。欧文ならば最初の段落は字下げしなくても良さそうですが、CJK(和文)の組版で問題になります。

これはTypstの知られている典型的な問題(#311)の一つで、非常に困ってしまうわけですが、いずれは解決されそうです。なので、ご覧になっている時点では解決されているかもしれませんが、すくなくとも現時点のTypstv0.10.0ではまだ修正されていません。

ただし、以下で述べるいくつかの任意の一つのハックの方法で一時的には解消されます。

問題

デフォルトでは、以下のように、段落の最初の行であっても、他の行と同じように字下げ(indent)はなく、同じ位置に留められています。

#set text(font: "Noto Serif CJK JP") // 以下略
#import "@preview/roremu:0.1.0": roremu // 筆者が作ったダミーテキスト生成パッケージ、以下略

#roremu(150)

段落に字下げを追加したい場合、par()段落関数のfirst-line-indentを指定すればできるようになります。

#set par(first-line-indent: 1em)

= 『吾輩は猫である』

#roremu(150)

#roremu(150)

#roremu(150)

しかし、ご覧のように、なぜか最初の段落だけ字下げされていない。これを解決するには以下の方法があります。

修正法

見出しの下に空白の段落を追加する

最初の段落だけ字下げが抜けているので、見出しの下に空白の段落を追加すれば、元の最初の段落が第二段落になり、字下げされるようになります。具体的には、showルールを用いて、見出しをそれ自体と空白段落を結合したものに置き換える、即ち、すべての見出しの後ろに横幅が0pt("")の縦幅が0pt(#text(size:0pt)[])のテキストが入った空白の段落を挿入すればよいということです。具体的な実装は以下である。

#set par(first-line-indent: 1em)

#show heading: it => {
    it
    par(text(size: 0pt, ""))
}

= 『吾輩は猫である』

#roremu(150)

#roremu(150)

#roremu(150)

また、ついでに、見出しと文の間隔を確保することもできます。

// ...
#show heading: it =>  {
    it
    par(text(size:0.5em, ""))
}
// ...

""#hに置き換えても同様です。

負の突き出しインデントとパディング

逆に、突き出しインデント(hanging-indent、最初の行はそのまま、それ以外の行は字下げするインデント)を負に設定することで、すべての段落の第二行以降をすべて左に突き出すことができます。しかし、それだと全体が左にズレてしまうので、逆に右に同じサイズをずらすことで、綺麗に段落をインデントできます。

#let indented(body) = {
  show par: par.with(hanging-indent: -1em)
  show par: it => pad(left: 1em, it)
  body
}

= 『吾輩は猫である』
#indented[
  #roremu(150)

  #roremu(150)

  #roremu(150)
]

手動でインデントする

もちろん、手動で最初の行の前に横間隔#h(1em)を入れることもできます。

#set par(first-line-indent: 1em)
#h(1em)#roremu(150)

= 『吾輩は猫である』
  #h(1em)#roremu(150)

  #roremu(150)

= 『吾輩は猫である』
  #h(1em)#roremu(150)

  #roremu(150)

また、調整しやすいように、変数として保存しておくこともできます。

#let indent = 1em
#set par(first-line-indent: indent)
#let i = h(indent)

#i#roremu(150)

= 『吾輩は猫である』
#i#roremu(150)

#roremu(150)

= 『吾輩は猫である』
#i#roremu(150)

#roremu(150)

他の方法

他にもいくつか方法があります。具体的には上の方法のバリエーション(例えばparboxに置き換えたりすることもできます)や組み合わせ、他の色んなハックがあり得ますが、前述の方法は比較的に簡単で使いやすいものになります。一日も早く公式からサポートされるようになることを心待ちにしています。

参考文献

コミュニティ

「くみはんクラブ」というコミュニティを創設しました。そこで、Typstに関する話もされますので、何か質問や不明点があれば、ぜひいらしてください。

https://discord.gg/dHRaAsBeRY

https://x.com/mkpoli/status/1746874400618815813?s=20

Discussion