打倒 LaTeX

このページどこかに移動したい(見出しを表示できて、編集がめちゃくちゃ簡単で、コードのシンタックスハイライトがあると、うれしい)

PDF埋め込み

  • pdf2svg でsvgに変換して読み込めば問題ない気がする
for i in {1..100} ; do
  pdf2svg "<PDF file>" "<output_prefix>_${i}.svg" $i 2>&1 > /dev/null || exit 0
done
#for i in range(1, <ページ数+1>) [
    #figure(image("<output_prefix>_"+str(i)+".svg"))
]

段落最初の字下げ

  • par functionが持っている first-line-indent でおわり
  • 昔は色々やらなければならなかったが、今(0.13.0以降)は all オプションなるものが登場したので、ほんとうにこれだけでおわりです
v0.13.0以前の対処方法
  • #set par(first-line-indent: 1em, all: true)
  • ……かと思いきや、見出しの直後にある段落に対して字下げが行われない
    • ドキュメントにも書いてある:
    • By typographic convention, paragraph breaks are indicated either by some space between paragraphs or by indented first lines

    • 組版の慣習により、段落区切りは段落間にある空白もしくは最初のインデントされた行のいずれかによって表されます

      • なんだその慣習!海外の慣習か??
        • ひとまず「リーダブルコード」と「マスタリングTCP/IP」において、そのような組版が行われていない(見出し直後にもインデントがある)ことを確認した
        • Software Engineering at Google では文頭のインデントではなく、段落間の(垂直方向の)間隔で段落が示されていた
          • こうであるべきだ……
  • figure 直後の段落にも同様の現象が発生するらしい;上記コードにおいて s/heading/figure/したものを使って解決
    • というか何にでも発生したりしませんか?
      • 改行を含む数式、columns、rectの後などでも発生
        • 改行を含まない数式の直後はインデントが入る(inlineだったらparにwrapされているのかな?)
  • で、これらの要素は block によってwrapされているらしい
  • というわけで、見出しの直後に見えない段落を挿入して、見出しの直後を常に2段落目にしましょう
    #set par(first-line-indent: 1em)
    #show block: it => {
      it
      par(text(size: 0pt, ""))
    }
    • これで各段落ごとに1字分(1em)のインデントを挿入することができる
      • この解決方法を用いると、#bibliography の下に謎の空白が挿入される
        • text の size を 0pt にしていても、サイズ0の要素にはならない
        • 謎空白を作成している block 要素 it について、 it.body == auto が成り立つため、上のコードの代わりに以下を用いることで解決?
          #show block: it => {
            if it.body == auto { return it }
            it
            par(text(size: 0pt, ""))
          }
        • これだと list の後が字下げされない
          • ふざけんなマジで
          • そもそも list に対してこの解決方法を適用しようとすると、下方向のみ空白ができて渋い
          • list は特別扱いしましょうね~
            #show list: it => {
              par(text(size: 0pt, ""))
              it
              par(text(size: 0pt, ""))
            }
            • これで上下に等しく空白ができる
              • 空白なしにはできない?

ソースコードのフォント変更

  • raw function (\```)内部で日本語が重なっちゃうよ~というときはフォントを変えると直ります(たぶん)
  • #show raw: set text(font: <フォント名>)

BibTeXの howpublished が無視される

  • howpublished = {\url{https://example.com}}とか書いてもBibliographyにURLが表示されないよ〜
  • Hayagriva使えばいいんじゃないですか(てきとう)
    • yamlで記述するやつ
    • ドキュメントが用意されていて、うれしい
    • 変換ツールがないが、LLMにやってもらえばよさそう?
      • cargo install hayagriva --features cli してhayagrivaコマンドを用意し、hayagriva input.bib > output.yml とすれば変換してくれるらしい

段落間の行間をなくす

#set par(spacing: 0.65em)
あったほうが見やすいと思うんだけどなあ

SVGが一部表示されない

  • Base64でエンコードされた画像がSVGに含まれているとき、その画像部分が表示されないらしいですよ
    • Issue#1084 見たら出来そうに思えるんだけどなあ
  • PNGとかにしよう

nCr のような下付き文字を書く

LaTeXでいうところの {}_nC_rzws を使えば良いっぽい
$zws_n C_r$
ベストプラクティスかどうかわからないけど
(以前は space.nobreak で良いと思っていたが、例えば $Sigma space.nobreak_n$ のように、場合によってはスペースが空いてしまうことがあるらしい)

Cheat sheet

Syntax – Typst Documentation

表のタイトルを表の下ではなく上に表示する

#show figure.where(kind: table): set figure.caption(position: top)
(tableにcaptionをつけたい時は #figure(table(...)) のようにfigureで囲む必要がある)

図の参照を行うときに “Figure” ではなく “図” としてほしい

#show figure.where(kind: image): set figure(supplement: "図")
#figure(image("/path/to/file"), caption: "foobar") <fig:foobar>
@fig:foobar // => "図1"

s/image/table/g したら表が対象になるよ

個人的table template

#let color_dark = luma(40)
#let color_light = luma(240)
#set table(
  stroke: (x, y) => if y == 0 {
    color_dark
  },
  fill: (x, y) => if y == 0 {
    color_dark
  } else if calc.rem(y, 2) == 0 {
    color_light
  },
)
#set table.vline(stroke: color_dark)
#set table.cell(align: horizon)
#show table.cell: it => if it.y == 0 {
  show text: s => text(fill: color_light, strong(s))
  align(center, it)
} else {
  align(left, it)
}

上記の設定を適用して作成した表(ネットワークの授業で作ったレポートの一部)を以下に示す

ページを横向き (landscape) にしたい

#set page(paper: "a4", flipped: true)

ページ番号を表示したい

全てのページで表示したいなら #set page(numbering: "1") など
number-align で位置も設定できる(center+leftなど)

任意の位置でページ番号を出力したければ #context(here().page())