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年4月18日
1日かけて線路沿いを歩いてみた話(京王線/後篇)
Alt--er icon Alt--er
2026年4月11日
1日かけて線路沿いを歩いてみた話(京王線/前篇)
Alt--er icon Alt--er
2026年4月18日
イラストを始めてみよう!!
nemlos5 icon nemlos5
2026年4月13日
CTFをはじめよう
kavos icon kavos
2026年4月8日
実際無料プラグインってどうなの?って話
vPhos icon vPhos
2026年3月20日
2048でショートコーディング
quarantineeeeeeeeee icon quarantineeeeeeeeee
記事一覧 タグ一覧 Google アナリティクスについて 特定商取引法に基づく表記