feature image

2026年3月7日 | ブログ記事

お前もSATySFiをやらないか

はじめに

この記事は新歓ブログリレー2026 2日目の記事です。

あいさつ

こんばんは、こんにちは、25Bの@Suimaです。
この記事はお前もLaTeXをやらないかの裏記事です。
この記事は、プログラミングに造詣がある人向けに書いています。

SATySFiって?

皆さんは、LaTeXというものを使ったことはあるでしょうか?
大学の課題などで使ったことがある人も居るかもしれませんね。
LaTeXのように、プログラムのように文字を打ち込んで書類を作成するコンピューター言語を、組版処理言語と言います。

今回紹介するSATySFiは、日本発の組版処理言語の一つです。
スペルはSATySFi(大文字小文字このまま)で、読み方はサティスファイです。

さて、ここまで読んだ感じだと、SATySFiはLaTeXの仲間なんだな、と思っているかもしれません。

その感覚は強ち間違っていませんが、SATySFiは、静的型付け言語である点で大きく区別されます。また、静的型付けによってエラーを検出しやすくしていることも特徴の一つです。

使い方は…なんとこの記事で紹介します。やったね!

SATySFiの使い方

SATySFiには、LaTeXにとってのOverleafのような便利なものは存在しないので、普通にPCにインストールすることになります。

インストール手順は、こちらの記事が詳しいので、参考にしてください。

VSCodeの準備

SATySFiの編集にはVSCodeを用いるのが便利です。また、SATySFi Workshopをインストールしておくことをお薦めします。

SATySFi文書の作り方

先ずは、main.satyという名前(ここの名前は何でもいいですが…)でファイルを作って下さい。

次に、一行目に@require: stdjareportと書いてください。

二行目からが本題です。
SATySFi自体は、OCamlの流れを大きく受ける「関数型言語」です。マクロ展開で全部解決する項書き換え系であるTeXとはその点で大きく異なります。

関数型言語なんですよ。

ぶっちゃけ人類にはやや早い(ように私は思っています。)

という前置きをしてから、stdjareportクラスで文書を書き始める方法をお見せします。

@require: stdjareport
document (|
    title = {お前も\SATySFi;をやらないか};
    author = {\@Suima};
|) '<
    +chapter{はじめに}<
        +p{\SATySFi;での初めての文章}
    >
>

なんといいますか、おおといった感じの構造をしています。

satysfi main.saty

でコンパイルが通ることを確認したら、インデントも解除しつつ、追っかけていきましょう。

まず、@requirestdjareportを読み込みます。
二行目からが本題です。stdjareportで定義されている関数であるdocumentは、次のように引数を取ります。(任意引数は省略した形で書きます)

document: 'a-> block-text -> document

…どういうこっちゃ。

まずはカリー化されているので、解除してみましょう。

document: 'a,block-text->document

どうにも、'ablock-textを受け取って、document(型)を返す関数であるということが分かります。

実装を読んでいくと、

constraint 'a :: (|
      title : inline-text;
      author : inline-text;
    | )

という記述があることから、
document

document(|title: [inline-text];author:[inline-text];|)[block-text]

とすればいいように思われます。

実際に、私が提示した例を見ると、

document (|
    title = {お前も\SATySFi;をやらないか};
    author = {\@Suima};
|)

から始まっているので、どうも正しそうです。

さらに、私が提示した例を見ると、[inline-text]が入るところには{}で囲われたもの、[block-text]が入るところには<>で囲われたものがあるので、どうにも「括弧で型を区別している」ように思われます。

実際に、そうであることが、The SATySFi Book(Boothで無償でPDF版が配布されています。有償版もあるので、金銭に余裕がある人は是非有償版で購入しましょう。)を読むことでわかります。

先の例では、documentに渡している[block-text]'<>と変則的な構造をしていますが、これはパーサーの都合のようです。(ここで通常通り<>とすると、<が不等号だとパースされてしまうようです。)

ここで、ブロックコマンドと、インラインコマンドという概念を提示しておきます。

ブロックコマンドは、+から始まるコマンドで、端的に言えば返値が[block-text]です。(実際には少し違うようですが、ここでは余り区別しません。)

インラインコマンドは、\から始まるコマンドで、端的に言えば返値が[inline-text]です。

ここまで見ると、なんとなく先の例の構造が読めてきます。

関数型言語である以上、最も内側から読んでいけますから、内側から読んでいくと

1.{\SATySFi;での初めての文章}というインラインテキストを、ブロックコマンド+pに渡す

2.<+p{\SATySFi;での初めての文章}>というブロックと、{はじめに}というインラインテキストを、+chapterというブロックコマンドに渡す

3.'<+chapter{はじめに}<+p{\SATySFi;での初めての文章}>>というブロックと、(|title = {お前も\SATySFi;をやらないか};author={\@Suima};|)というものを、documentという関数に渡す

という構造になっていることが分かります。

おお

ちなみに、パラグラフを増やしたいときは次のようにすることで出来ます。

@require: stdjareport
document (|
    title = {お前も\SATySFi;をやらないか};
    author = {\@Suima};
|) '<
    +chapter{はじめに}<
        +p{\SATySFi;での初めての文章}
        +p{第二パラグラフは普通に+pで続ければ良いです。この意味で、ブロックコマンドを\+で始めるのは自然だと感じますね}
    >
>

そんなSATySFiの利点は次の通りです。

  1. エラー検出能力が高い
  2. 構文が見た目上LaTeXに近い点がある
  3. 日本語のサポートが手厚い

おわりに

今回紹介したのは、SATySFiの一端に過ぎません。
興味がある人は是非沼っていってください。


明日の投稿者は@ogu_kazemiyaです。

Suima icon
この記事を書いた人
Suima

LaTeXぺちぺち

この記事をシェア

このエントリーをはてなブックマークに追加
共有

関連する記事

2026年3月6日
DJ無知人(むちんちゅ)によるDJ体験記
vPhos icon vPhos
2026年3月7日
お前もLaTeXをやらないか
Suima icon Suima
2026年3月6日
新歓特設ページを公開しました!
quarantineeeeeeeeee icon quarantineeeeeeeeee
2026年3月6日
新歓ブログリレー始まります 2026
n3 icon n3
記事一覧 タグ一覧 Google アナリティクスについて 特定商取引法に基づく表記