SATySFiでカスタマイズが容易なクラスファイルを作成した

これは「[SATySFi Advent Calendar 2018](https://adventar.org/calendars/3418)」の1日目の記事です。（2日目はhanachinさんです。）

とうとう始まりました*SATySFi Advent Calendar 2018*！

頑張ってSATySFi関連の記事を増やしていきましょう。


# はじめに

「SATySFiをいろいろな場面に使いたいので汎用性と高くしたい、けれども使いにくいのは嫌だ」という個人的な気持ちから、それらを両立するExDesignクラスを作成しています。

ある程度使えなくもない程度までできたのでここで、SATySFi ACを機に公開したいと思います。

GitHubで管理しています。リポジトリは以下の場所です。

- https://github.com/puripuri2100/exdesign

この記事を読んで面白そうと思ったら是非使ってみてください。

# 動作保証環境

SATySFi v0.0.3と、SATySFi for Windows Version 20180708での動作を確認しています。

# パッケージの導入の仕方

## Linux系統の場合

```
$ git clone https://github.com/puripuri2100/exdesign.git
```

でリポジトリをcloneしてきます。

そして

```
$ cd exdesign
```

でフォルダに移動し、

```
$ chmod u+x Installer.sh
$ ./Installer.sh
```

を打ち込めば導入が終了します（パッケージ等が`~/.satysfi/dist/packages`にある場合のみ有効）。

Ubuntu on WSLでは成功しましたが、失敗する環境があれば教えてください。


## SATySFi for Windowsの場合

```
$ git clone https://github.com/puripuri2100/exdesign.git
```

でcloneしてくるところまでは同じですが、`exdesign\satysfi-for-windows-ver`というフォルダ内にあるファイルをコピーしてSATySFi for Windowsでパッケージが収められているところ（標準ならば `C:\Program Files\SATySFi\lib\dist\packages` ）に移動させます。

## OS Xの場合

Linuxと同じようにやってダメならば、ファイルをコピーしてSATySFiが読み込む場所においてください。

このOSは持っていないので、報告があると嬉しいです。

# 使い方

このパッケージでは、根幹となる`exdesign.satyh`と、その補助パッケージがついてきます。
使う際にはこれらを読み込み、提供される関数を利用する必要があります。

documentの1つ目の引数のレコード型の中身は9つです。

`title`ではタイトルを入力します。

`author`では作者名を入力します。

`date`では日付を入力します。

`style`ではページサイズや余白、基本となるフォントサイズの設定を行います。

`design`では`+section`等のコマンドのデザインについての設定を行います。

`header-footer`では、ヘッダーやフッターに出力する内容を設定します。

`fonts`では、使用するフォントを設定します。

基本的には以下のように書けばよいです。

```
@require: exdesign
@require: article-ja

document (|
        title = {title};
        author = {puripuri2100};
        date = {2018/11/04};
        show-title = true;
        show-toc = true;
        style = ArticleJa.a4paper;
        design = ArticleJa.article;
        header-footer = ArticleJa.normalHF;
        fonts = ArticleJa.fonts;
|) '<
    +p{test}
>
```

- `ArticleJa.a4paper`
- `ArticleJa.article`
- `ArticleJa.normalHF`
- `ArticleJa.fonts`

は`article-ja.satyh`によって提供されているものです。

ちなみに、`article-ja.satyh`では他にも`b5paper`と`report`という関数も提供しています。

ExDesignパッケージが提供しているコマンドについては`doc/manual.saty`をコンパイルして読んでください。使い方は基本的にstdjabookクラスと似たようなものになっているはずです。

# 仕組み

いきなり補助パッケージどうのこうの言われてもわからないと思うので説明します。

そもそもとして、世の中にあるクラスファイルというものの中身は、フォントサイズ等の値を変えるても機能を失わないものと、`+section`等の仕組みとして提供しなければならないものにわかれています。

そこで、その仕組みとして提供しなければ成立しないようなものを提供し、値を変えられるものについてはユーザーが全て指定してレイアウトを作っていくという使い方を想定したクラスファイルを作成しました。それがこのExDesignクラスです。

しかし、値を変えられるものについて、文書ごとに全て指定していくのは非常に辛いものがありすので、頻繁に使うであろう設定をまとめて提供することにしました。それが補助パッケージです。

構造としては次の画像のようなものになっています。

![構造](https://qiita-image-store.s3.amazonaws.com/0/222743/108cbf3c-8a2d-b342-f0b9-0bccd98a803c.png)


# これを使うと嬉しいこと

ページのサイズを自由に変更したり、自分好みのフォントを使ったりすることができるようになります。
また、よく使う設定はパッケージとして自分用にまとめておけばさらに楽に使うことができます。

「どうしてもヒラ◯ノフォントを使いたい！」といった人も、フォント名を設定した関数を定義しておけばいつでも使えるわけです。

例えば、「B5のサイズでレポート書いてきて」と言われたとき、stdjareport等では中身に直接手を加える必要がありましたが、ExDesignクラスと自分用の補助パッケージを使えば

```
@require: exdesign
@require: mysettings

document (|
        title = {雪だるまの可愛さ};
        author = {puripuri2100};
        date = {2018/12/01};
        show-title = true;
        show-toc = false;
        style = MySettings.b5paper;
        design = MySettings.report;
        header-footer = MySettings.myHF;
        fonts = MySettings.kozuka;
|) '<
    +p{雪だるまは可愛いです。}
>
```

のようにしてすぐに書き始めることができます。**非常に便利です**！是非使ってみてください。

# さいごに

現在もこのクラスファイルは開発を続けています。多くの人が多種多様な補助パッケージを作成してくださると嬉しいです。また、新しい機能を提案してくださるともっともっと嬉しいです。お待ちしています。