2024年4月23日

とりあえずTypstで行取りしてみた.

#let gyodori(lines: 2,x) ={
  context{
    // 和文文字の縦方向長さ(!= 横幅?)
    let letter_height = measure(box[阿]).height
    // 段落間の長さ(block(spacing:**)のやつ)を計測
    let block_spacing = measure(block[#par[阿];#par[阿]]).height - 2 * letter_height
    // 本文のテキスト長さの計算
    let textlen = page.width - {
      if page.margin == auto {
        (5/21) * {
          if page.width < page.height { page.width}
          else { page.height }
        }
      } else {
        page.margin.left + page.margin.right
      }
    }
    // とりあえずブロックに入れる
    let b = block(width: textlen, x)
    // 長さ計算
    let total_len = (letter_height + par.leading) * lines + par.leading
    let ue = (total_len - measure(b).height)/2
    let shita = ue
    block[
      #v(-block_spacing + ue)
      #b
      #v(-block_spacing + shita)
    ]
  }
}
ああああああああああ
#gyodori(lines: 4)[かきくけこ]
ああああああああああ

2024年4月14日

Typst始めました

しばらく前に現れた新しい組版エンジンTypst,使ってみようと思いつつなかなかできていなかったのだけどようやく少し使ってみた.LaTeXよりもいろいろフットワークが軽い.とにかくコンパイルがめちゃくちゃ速い.リアルタイムで変更される.もう日本語もかなりの精度でサポートしているようだ.(数式と和文の間の四分空きがあかないとか問題が残っていたりもするけど.)メモ代わりに.Typst 0.11.0

インストール

Typstのページを見るとWebアプリで使ってほしそうだけど,手元にインストールして使うことにした.といってもwingetに入っているのでコマンドプロンプトからwingetたたくだけ.

winget install Typst

らくちん.エディタはVSCodeを使うことにした.すでにプラグインが作られている.あんまりよくわかっていないがTypst LSPとTypst Preview,Typst Mathの三つをインストールした.Ctrl + K, Vとするとプレビューされる.多分Typst Mathの効果なんだろうけど,編集中のテキスト内で数式が簡単にプレビューされるのよさげ.数式が複雑になるとソース内で対応する箇所探すの疲れるんだよね.

カーソルを持って行くとソースに戻る.

構文

ReferenceのSyntaxにまとまっている.

  • 書いたものは大体そのまま出る.と書くと「あ」と出る.空の行を入れると改段落(LaTeXと同じ).
  • 一行コメントが// (コメント),ブロックコメントが/* (コメント) */ (C言語と同じ)
  • = 見出しとすると見出しになる.より深い見出しにしたいならば== 見出し2=を増やしていく.
  • #から始まるのが命令.(正確には#で「コードモード」に入り,すでに定義された命令を実行している.)引数は()で囲まれたり[]で囲まれたり.
  • $で囲むと数式.ディスプレイ数式を出すには$ f(x) = x^2 $と空白を前後に入れる.
  • *強調*で強調,などなど.

いろいろ入れるとこんな感じ.

// Typstサンプル
= Typst
Typstとは新しい組版ソフトウェアである.
LaTeXを意識しているのか#link("https://typst.app/docs/guides/guide-for-latex-users/")[Guide for LaTeX Users]というページも用意されている.
/*
Guide for plain TeX Usersというページは見当たらない.
*/

// 新しい段落を始める
数式も$lim_(x arrow.r 0) sin(x)/x = 1$と出力できる.
独自の構文を持っている.
特に数式がTeXと結構異なるのは面白い.
コンパイルが速いのはうれしい.

== 歴史
開発が始まったのは*2019年*から,_コロナ禍前_/*弱い強調*/である.

設定

デフォルトだとゴシックになって気持ち悪いので,とりあえずフォント設定をする.

#set text(
  lang:"ja", // 言語を日本語にする
  // フォントの設定.デフォルトをNew Computer Modernとし,New Computer Modernに文字が見つからなかったら(和文文字が基本的に該当)
  // 游明朝を使う..
  font: ("New Computer Modern", "Yu Mincho"),
)

利用可能なフォントの一覧はコマンドプロンプトからtypst fontsと打つと確認できる.そのほかの設定.

#set par(
  // 段落行頭は一文字字下げ
  first-line-indent: 1em,
  // 行間は一文字分の空き
  leading: 1em,
  // 行そろえを有効にする.
  justify: true
)
// 段落間の空きも一文字分に
#set block(spacing: 1em)

leadingとspacingの値はよくわからない.最初\baselineskip=1.7zwと同等のつもりで0.7emを設定したのだが想定よりも狭く感じたのでとりあえず1emで設定している.

// 見出しの番号付けを「1」「1.1」「1.1.1」のようにする.
#set heading(numbering: "1.1.1",)
// 見出しの和文フォントをYu Gothicに
#show heading: set text(font: ("New Computer Modern", "Yu Gothic"))

このスタイル設定にはset ruleとshow-set ruleを利用する.set <設定したいもの>(<設定項目>)およびshow <設定したい対象> : set <設定したいもの>(<設定項目>)というように使う.次のように一番上の見出しだけ別設定にすることもできる.

// トップレベルの見出しの採番を「1章」「2章」……とする.
#show heading.where(level: 1):set heading(numbering: "1章")
// フォントは明朝
#show heading.where(level: 1):set text(font: ("New Computer Modern", "Yu Mincho"))

そういう記述が見つけられていないのだが,例えば段落を出力する際にTypstはparという関数を呼び出していて,#set parはそのデフォルト引数を取り替える働きをしているように見える.なお,parという関数はきちんと存在していて,#par[first-line-indent: 2em](テスト)とすると段落行頭が2文字分字下げされている段落が出力される.

数式

数式は$で囲む.ディスプレイ数式を出すには$ f(x) = x^2 $と空白を前後に入れる.数式の中では二文字以上が命令を解釈される.例えば$alpha$は$\alpha$を出力する.一文字はそのまま.なので$\alpha = ab$と出力するには$alpha = a b$とする.(間違って$alpha = ab$と書くとエラー.)上付き下付はLaTeXと同様^_だが,LaTeXと異なり()で囲む.e^(2 pi sqrt(-1))のように.

(a b)/(c d)とすると分数$\frac{ab}{cd}$が出る.$G/H$としたければG slash Hとする.

命令はLaTeXと異なる部分も多い.LaTeXとTypstの対応する命令たちがまとまっているPDFが見つかった.

相互参照

<label>でラベルをつけて@labelで参照できる.

= はじめに <はじめに>
本論文では……

= 定義
@はじめに における記号を用いる.

これで「節1における記号を用いる」と出る.この「節1」を「章1」とするにはset ruleでheading(supplement: )を書き換える.

#set heading(supplement: [章])
// でも普通は「1章」だよね,という時にはこうする
// it に対して[#it.depth;章]を返す関数を与えている.
#set heading(supplement: it => [#it.depth;章])

なお「@はじめに」の後の空白は消えているわけではなく,きちんと入っている.ただ今の場合はちょうど和文文字と欧文文字との間の四分空きに見えてあまり気にならないはず.空白を入れたくなければ#ref(label("はじめに"))における記号とすれば可能だけど,もっと簡単にできるのだろうか.

コマンド定義

#letで自分で命令を定義できます.使うときは#を前置して呼び出します.

#let myname = "山田太郎"
#let Hom = $op(Hom)$ // 数式内で使うコマンドの定義.

#myname が  // 山田太郎 が

$Hom_A(M,N)$ // 数式内で使う時は#は不要.

#mynameの後の空白は命令の区切りのために必要なのですが,出力にも空白が出てしまいます.なので#myname;がとする方がこの場合はよいでしょう.引数をとる命令を定義することももちろんできます.

// 引数を一つとり赤字で出力する命令
#let alert(word) = [
  #set text(red)
  #word // #をつけて参照できる.
]

#alert[言葉]
// こっちでもよい
#alert("言葉")

呼び出す際の括弧の違いにより引数がどのモードで解釈されるかがかわる.[]で囲まれている場合はマークアップモード,つまり地の文を書いているのと同じルールでの解釈が行われる.()で囲まれている場合はコードモードで解釈される(正確には頭の#でコードモードに移行しそのまま続いている)ので,よくあるプログラミング言語のように解釈される.

この違いはletでの命令定義でも同じで,#let <命令名> = の後を上のように[]で囲めば中身はマークアップモードで解釈されるが,{}で囲めばコードモードで出力される.上の定義をコードモードで定義すると次のようになる.

#let alert(word) = {
  // コードモードでの呼び出しは#は不要
  set text(red)
  word
  // text関数を呼び出して出力することもできる.
  // text(red,word)
  // これでもよい
  // text(red)[#word]
}

その他,複数引数やオプション引数など.

#let address(name,univ) = [#name(#univ)]
#address[バカボンのパパ][バカ田大学]

// univはオプション引数で,省略されるとnoneになる
#let address2(name, univ: none) = {
  if univ == none [#name] // []で囲むことでマークアップモードに移行
  else [#name(#univ)]
}
#address2(univ: "バカ田大学")[バカボンのパパ]
#address2[バカボン]

タイトル作る命令

#let maketitle(body, author : "") = {
    block(width:100%)[
    #set text(
      size: 2em,
      font: ("New Computer Modern", "Yu Gothic"),
      weight: "bold"
    )
    #set align(center)
    #body
    #set text(
      size: 0.5em,
      font: ("New Computer Modern", "Yu Mincho"),
      weight: "regular",
    )

    #author
  ]
}
#maketitle(author: "ああああ")[タイトル]

見出し後のインデント

#set para(first-line-indent: 1em")していても見出しの後のインデントが入らない.Issueがたっているがまだ解決されていないようなので,とりあえずのワークアラウンド.ついでに見出しの体裁もちょっと調整.

#show heading.where(level: 1): it  => {
  block(width: 100%)[
    #set text(
      font: ("New Computer Modern", "Yu Gothic"),
      weight: "bold"
    )
    #v(0.5em)
    // headingのカウンターを取得
    #counter(heading).display("1")#h(1em)#it.body
    #v(0.5em)
  ]
  // これを入れるとインデントが入るようになる
  // でもちょっと縦方向にも空白が入っちゃう
  par()[#text(size:0.5em)[#h(0.0em)]]
}

パッケージ

Typst Universeにたくさん登録されているのが使えます.必要に応じて勝手にダウンロードしてくれるので,あらかじめ手元にインストールしておく必要はありません.次のようにすると読み込めます.

#import "@preview/<パッケージ名>:<バージョン>" *

最後の*を書かないとパッケージ名の名前空間に展開されます.

定理環境

というわけでctheoremsパッケージを使って定理環境を使う.

#import "@preview/ctheorems:1.1.2": *
#show: thmrules
#let thm = thmbox(
  "thm", // 識別子,同じ番号を指定すると番号が共有される
  "定理", // 
  separator: [#h(1em)], // 「定理1」と本文の間の空き.h(<寸法>)は空白を入れる命令
  inset: 0pt // 定理全体が入っている箱と定理本文との間の空き.
)

#thm[強力な定理] <strong>

#thm("Schurの補題")[閉体上の有限次元既約表現の自己準同型は定数倍に限る] <Schur>

@Schur の証明には@strong は不要.

2024年4月13日

桜は月曜日が一番よかったのかなぁ.キャンパスの桜を少し見てみたけど綺麗に咲いていた.今日家の近くを回った限りでは結構散り始めていることが多い.といってももう四月も中旬,普段ならばとっくの昔に散っているのだが.それのせいなのか葉が多いように思える.先週見ていたときから思っていたのだが,まだ花が咲ききっていないのにもう葉っぱがでているということがしばしば.葉っぱはいつも通り出たけど花が遅いという感じ.

2024年4月9日

すごい雨.郵便局員さんごめんなさい再配達今日で頼んじゃった.

2024年4月6日

さくらをみに散歩.今年は開花が遅く,予想しながら出たがまだ早かった.とはいえある程度は咲いていたしまぁ満足.来週末じゃ危なそうだしねぇ.

2024年4月3日

今日は入進学式とガイダンス.学期が始まるー.