SATySFiを導入した

ホームへ

レポート作成のためにSATySFiの環境構築をしようとしたら(無知と不慣れのせいで)数時間かかって少し苦労したので、行動記録をつけておきます。

何をしたかったか

SATySFiを、Easytableを導入して使おうとしていました。

失敗

まずSATySFi Documentsを参照しました。satyrographosをインストールしたのち、それを使ってSATySFiを導入しようとしたところまで覚えています。が、その後のどこかの段階で失敗しました(記憶がない)。不確かですが、SATySFiのインストールには成功し、「Hello SATySFi!」にも成功したものの、Easytableの導入に失敗したような気がします。この時点では殆ど闇雲に試行していたので、続行を諦め、他の文書を当たりました。

次に、本家のREADMEに従って導入を試みました。この文書では二つのインストール方法が示されています。しかし私はそれに気が付かず、それら二つを続けて実行することが求められているものと捉えてしまったため、すでに「Satyrographos を使ったインストール方法」に当たる操作を済ませていたにも関わらず、「OPAM を使ったインストール方法」を重ねて実行しました。当然コンフリクトを起こし(「セットアップ」節の./install-libs.shの段階だったかな)、これも放棄することにしました。

また、ブラウザでSATySFiをコンパイルする方法を探し、例えばSATYSFI Playgroundを試すなどしましたが、Easytableを呼ぶことに失敗したため、やはり諦めることになりました。なお、高校生の頃にOverleafをSATySFiをブラウザから編集する環境として推奨されたことがあり、それをまず試そうと思ったものの名前を思い出せなかったために他をあたるなどしていました(記事を書いているうちに思い出しました)。

ところで、ここまでの段階で一度も最初からやり直すと言うことをしていないのは、その発想がなかったのに加え、実行してきたコマンドが具体的に何をどこに生成しているのかを理解していなかったためです。しかし、手当たり次第に調べるうちに到達したページで、次の記述を見つけました:

それでもだめなら、opamを再インストールしてみましょう。 ~/.opam を削除した上でこのページの手順を最初からやり直してみてください。

ここでやっと「やり直し」という概念を手に入れた私は、~/.opamを削除し、brew uninstall opamを実行しました。

成功

まず、次のページを必要に応じて参照していたことを附記しておきます:SATySFi インストール手引き 2021年5月版

再び本家のREADMEを参照したところ、「Satyrographos を使ったインストール方法」のみを実行すればいいことに気がついたため、己の注意力を心配しつつ、再び導入を始めました。以下引用:

brew update
brew install opam

# 共通 OPAM の設定
opam init
eval $(opam env)
opam repository add satysfi-external https://github.com/gfngfn/satysfi-external-repo.git
opam repository add satyrographos https://github.com/na4zagin3/satyrographos-repo.git
opam update

# 共通 SATySFi のインストール
opam depext satysfi satysfi-dist satyrographos
opam install satysfi satysfi-dist satyrographos

# 共通 SATySFi 標準ライブラリのセットアップ
satyrographos install

するとsatyrographos installの段階でcommand not found: satyrographosとエラーを吐かれましたが、「Satyrographos でパッケージの簡単インストール」によればeval $(opam env)の実行が必要とのことだったので従い、再び実行して事無きを得ました。

これでインストールが完了したので、デモファイルを実行し、成功しました(本家参照):

git clone https://github.com/gfngfn/SATySFi.git
cd SATySFi/demo
make

ところで、Easytableは外部ライブラリです。よって何らかの方法で導入する必要があり、その方法については再び「Satyrographos でパッケージの簡単インストール」に記載がありました。Easytableはsatyrographos-repoに含まれていたため、次を実行するだけで済みました。

opam install satysfi-easytable
satyrographos install
eval $(opam env)

なお、satyrographos installにより、目的のライブラリは次の場所にコピーされます:~/.satysfi/dist/packages/easytable/easytable.satyh。よって、Easytableのドキュメントには@require: easytableとありますが、これは@require: easytable/easytableの誤りであるようです(@yatabashiと@puripuri2100の会話を参照)。

また、open EasyTableAliasの後にはinが必要です。コマンド定義の最後に必要という記事を見つけたためそれに倣いましたが、一般にdocument宣言の前で操作を行う場合には末尾に必要になるようです(@puripuri2100の説明)。

延長線

ここまでで当初の意図は達されましたが、キリル文字を表示しようと思ったら詰まったので、それにも言及しておきます。

軽く調べたところ、Fonts-Theanoというパッケージが見つかりました。これもsatyrographos-repo内にあるので

opam install satysfi-fonts-theano
satyrographos install

によりインストールし、用例(参照1参照2)を参考に(あまり理解しないまま)次を追記し、

let-inline ctx \cyrillic it = 
  let ctx =
    ctx |> set-font OtherScript (`fonts-theano:TheanoOldStyle`, 1., 0.)
  in
  read-inline ctx it

本文中のキリル文字部分を\cyrillic{}で囲うことで目的を達成しました。

完成品

後日談(2023年8月20日追記)

stdjaで採用される欧字フォント(Junicode)に、Theanoがどうもそぐわなかったので、自前でEBGaramondを入れることにしました。ライブラリ化はせず(一つには面倒に感じ、もう一つにはやり方を知りません)、ただ該当フォントファイルを~/.satysfi/dist/fontsに手動で投げ込んだだけなので、フォントの入ったディレクトリ、他のライブラリに関する操作を加えた際にはその都度入れ直す必要があります(satyrographos installによって削除されます)。また、アラビア文字も表示できるようにと同様の処置をしました(フォントはAmiri)が、SATySFiは今のところ(バージョン0.0.8)RTLに対応していないようです。

また、フッターに表示されるページ数を無駄に大きな値にしたかったのでそのやり方を考えて唸っていたところSATySFi作者本人から直接救いの手が差し伸べられたので、指示に従ってクラスファイルstdja.satyhの388行目

let it-pageno = embed-string (arabic pbinfo#page-number) in

let it-pageno = embed-string (arabic (pbinfo#page-number + 64)) in

に変更したファイルをmystdja.satyhとし、~/.satysfi/dist/packagesに置いて読ませることにしました。