はじめに
この記事は新歓ブログリレー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
でコンパイルが通ることを確認したら、インデントも解除しつつ、追っかけていきましょう。
まず、@requireでstdjareportを読み込みます。
二行目からが本題です。stdjareportで定義されている関数であるdocumentは、次のように引数を取ります。(任意引数は省略した形で書きます)
document: 'a-> block-text -> document
…どういうこっちゃ。
まずはカリー化されているので、解除してみましょう。
document: 'a,block-text->document
どうにも、'aとblock-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の利点は次の通りです。
- エラー検出能力が高い
- 構文が見た目上LaTeXに近い点がある
- 日本語のサポートが手厚い
おわりに
今回紹介したのは、SATySFiの一端に過ぎません。
興味がある人は是非沼っていってください。
明日の投稿者は@ogu_kazemiyaです。