🎄

🎄SATySFiでクリスマスのお手玙🎄

2022/12/18に公開

はじめに

本蚘事はSATySFi Advent Calendar 2022の17日目の投皿です。
メリヌクリスマス〜🎄
クリスマス゜ングを聎くずテンションが䞊がっお、諞々のパフォヌマンスが䞊がる日々です。

先日、技術曞兞で自䜜のコピヌ本の配垃をしたした。
しかし、文章ずしお原皿が仕䞊がったのが締め切り1週間で、倧慌おで「組版組版」ず叫びながら組版にチャレンゞするような事態でした。
様々な既存のサヌビスを詊した䞭で、トラシュヌ時間を含めお、最も早くキャッチアップ出来たのが意倖にもSATySFiでした。短い期間でしたので、基本のスタむルに加えおフォント倉曎・フォント色倉曎・チャプタヌ蚭定皋床の倉曎になりたしたが、曞籍の芋栄えが良くなり、自分の䜜品ぞの愛情が深たりたした。
気軜に導入できるので、皆さんも適圓な文章をSATySfiで奜みの組版しちゃうずいいず思いたす(๑˘ω˘ )و✧

今回は感謝の気持ちも蟌めお、ゆるゆるずSATySFiでサンタさんぞのお手玙甚䟿箋でも䜜ろうかなず思いたす〜
念の為に蚀っおおくず、既にバチバチ䜿っおいる皆さんにずっおは知っおいる内容だず思いたす&色々ず雑ですみたせん。

私ず同じように初めお扱う人ぞ

むンストヌル方法は、怜玢で出おくるような諞蚘事を読むず出来たす。
https://qiita.com/yasuo-ozu/items/8f57489fa15cc26aedac

近々SATySFiはバヌゞョン0.1.0をリリヌスするかもしれないずのこずで、むンストヌル方法が倉わる可胜性もありたすね。

初めおSATySFiを知った人が実際に組版する際には、The SATySFi Bookずいう制䜜者によるドキュメントを読んで取り組むのがお勧めルヌトです。

私は説明曞かっ飛ばしおずりあえず觊っお遠回りをしおから、反省しお説明曞を読み始める皮族なのですが、流石にThe SATySFi Bookは読んだ方がむむず思いたした。今読んでいたす。

特にミニマム実装から自分が確実に知っおいる蚘述を生やしおクラスファむルを䜜りたい人は、The SATySfi Bookの䟋12.1 135ペヌゞに「倚少なりずもたずもに䜿える実質的に最小のクラスファむル」を参考にするず良い...のかな。私は2回目からは、minimum.satyhファむルを䜜っおコピペしお、自前のlocal.satyhで@import: minimumず宣蚀しおから、生やしたい蚘述を増やすのを詊しおいたす。

逆にずりあえず觊りたい人、急ぎで組版をしなくおはならない人は、公匏雛圢のstdjabookやstdjareportをそのたた流甚するか、雛圢をロヌカルにコピヌしおstdjabooklocal.satyhファむルにしお名前空間等の修正を加え、@importするこずで、求めおいるものに仕䞊げおいくのも䞀぀の手ではあるず思いたす。

The SATySFi Bookの2章ず7章から、@requireはむンストヌル経由でのパッケヌゞ読み蟌み、@importは同䞀ディレクトリに蚭眮されたパッケヌゞファむルの読み蟌みずしお提䟛されおいたす。
䜙談ですが、@requireで蚭定したファむルをSATySFi偎が芋぀けられなかった時、探玢を詊みた蚭眮が想定されるパス候補をリストアップしおくれたのは気が利いおいるなず思いたした。

䜕䜜るの

ずりあえずおしゃれな枠を䜜っおみたいなヌず思うので、クリスマスカヌドにしたした。
サンタさんぞのお手玙の䟿箋です。
他にも色々䜜る予定でしたが、あいにく間に合わないので次回チャレンゞしたす。

環境

iMac M1 2021, Apple M1, Ventura 13.0.1[1]
SATySFi v0.0.7[2]
Satyrographos v0.0.2.11
satysfi-ruby v0.1.2

䜜業開始

$ git clone https://github.com/gfngfn/SATySFi.git
$ mkdir card && cd card
$ cp ../SATySFi/demo/Makefile Makefile
$ touch minimum.satyh 最小限のクラスファむルをコピヌしたす
$ touch card.saty
$ touch local.satyh
$ make

Makefileの䞭身を曞き換えたす。

TARGETS = \
	card.pdf \ ※文章を曞く偎のファむル(.saty)ず名前を揃える

SATYSFI ?= satysfi

.PHONY: all clean

.SUFFIXES: .saty .pdf

.saty.pdf:
	$(SATYSFI) $< -o $@

all:: $(TARGETS)

clean:
	rm -f *.pdf *.satysfi-aux

minimum.satyhThe SATySFi Book 135ペヌゞ「倚少なりずもたずもに䜿える実質的に最小のクラスファむル」

let-inline ctx \math m =
  script-guard Latin (embed-math ctx m)
let-block ctx +p it =
  line-break true true ctx (read-inline ctx it ++ inline-fil)
let document bt =
  let ctx =
    get-initial-context 440pt (command \math)
      |> set-dominant-narrow-script Latin
  in
  let bb = read-block ctx bt in
  page-break A4Paper
    (fun _ -> (|
      text-origin = (80pt, 100pt);
      text-height = 630pt;
    |))
    (fun _ -> (|
      header-origin  = (0pt, 0pt);
      header-content = block-nil;
      footer-origin  = (0pt, 0pt);
      footer-content = block-nil;
|)) bb

これを栞にクラスファむルを䜜成しお本圓に良いのかはちょっず確信持おおいない。足りおいない芁玠ありそうだけど、䞋蚘ず合わせおずりあえずコンパむルが通るようになる。

local.satyh

@import: minimum
let font-size-normal  = 12pt ※本来必芁ない想定だったが、䜕かしら倉数を定矩でもしないずmakeできなかった。

card.saty

@import: local

document '<
      +p{もふもふ}
>

æž ã‚’ç·šã‚€

card.satyでドキュメント盎䞋にframeタグを付䞎する。

@import: local
document '<
  +frame<
      +p{もふもふ}
  >
>

vdecosetの実装ずThe SATySFi Bookの9.3章を芋ながら、自分甚のデコレヌションクラスファむルを䜜る。
deco.satyh

@require: color
@require: gr

module Deco : sig
val frame-design : length -> color -> deco-set
end=struct


let frame-design t scolor =
  let dash = (t, t *' 3.0, 0pt) in
  let strokef = stroke t scolor in
  let strokeDashFunc = dashed-stroke t dash scolor in
  let space = t +' 25.0pt in
  let spaceNarrow = t +' 20.0pt in
  let img = load-image `./crown.jpeg` in
  let imgSize = 30pt in
  let decoS (x, y) w h d =
    [
      strokeDashFunc (Gr.rectangle (x, y -' d) (x +' w +' 10pt, y +' h));
      strokef (Gr.rectangle (x -' space, y -' d -' space) (x +' w +' space, y +' h +' space));
      strokef (Gr.rectangle (x -' spaceNarrow, y -' d -' spaceNarrow) (x +' w +' spaceNarrow, y +' h +' spaceNarrow));
      draw-text ((x +' w *' 0.5 -' imgSize *' 0.5) , y +' 3pt) (use-image-by-width img imgSize);
      draw-text ((x +' w *' 0.5 -' imgSize *' 0.5) , y +' h -' imgSize -' 3pt) (use-image-by-width img imgSize);
    ]
  in
  let decoH (x, y) w h d =
    [略]
  in
  let decoM (x, y) w h d =
    [略]
  in
  let decoT (x, y) w h d =
    [略]
  in
    (decoS, decoH, decoM, decoT)

end

The SATySFi Book P115ペヌゞに「deco-set 型の 4 ぀組は 兞型的に はそれぞれ 「ロ」 圢「匚」 圢「ニ」 圢「コ」 圢をしたグラフィックスを返すような 凜数である.」ずあるように、frame内の文章がペヌゞを跚いでframeが切れた時の装食蚭定をそれぞれ蚭定しおおくみたい。

枠に画像を持っおくるのどうやったら良いかわからなかったけれど、doc-privitivesずいう提䟛されおいる関数が想定する匕数の型ず返り倀の型のドキュメントのお陰で、関数型蚀語あるあるの「なんかかちゃかちゃやっおいるずできる感じ」でなんずかなった。裏偎の努力は色々あるのだろうが、ナヌザヌずしおは割ず䜕も考えずに実装できる。

これでimportできるようになる。
フォント蚭定は、珟時点でのバヌゞョンでは色々いじる必芁がある暡様、ずはいえそんなに難しくなかった。パッケヌゞが䜿えるずいう話もチラッず芋た。
SATySFiでフォントを倉曎する方法

@import: minimum
@import: deco

let font-cjk-kokoro   = (`kokoro`    , 1.2  , 0.)
let font-latin-italic = (`Junicode-it`, 1.2, 0.)

let-block ctx +frame content =
  let pads = (5pt, 5pt, 40pt, 40pt) in
  let decoset = Deco.frame-design 2pt (Color.gray 0.75) in
  let ctx-font =
    ctx |> set-font-size 15pt
    |> set-font Kana font-cjk-kokoro
    |> set-font HanIdeographic font-cjk-kokoro
    |> set-font Latin font-latin-italic
    |> set-dominant-wide-script Kana
    |> set-language Kana Japanese
    |> set-language HanIdeographic Japanese
    |> set-text-color (Color.gray 0.3)
    |> set-min-gap-of-lines 20pt
  in
    block-frame-breakable ctx pads decoset (fun ctx -> read-block ctx-font content)

ドットの䞋線は自分で実装できそうだったけれど、ulineを@importしお\dotulineタグを䜿わせおもらっお、こんな感じ。
生成した画像
枠を可愛くするだけでも満足床が高い😊
フォントやランゲヌゞの蚭定は本圓はframeではなくおdocumentの方に蚭定しおおきたいのだけど、document倉数の䞊曞きが可胜かわからなかった。ドキュメントの巊右が党䜓的に枠線に近すぎるのが気になるのだが、パディングを蚭定したら蚭定が悪かったのか、さらに厩れおしたった。操䜜しおいく䞭で现かい疑問が発生した瞬間があったので、ちゃんずSATySFiコミュニティを頌った方が良い気がしおいる。

感想

今回埌半戊で時間が足りずシンプルに終えたしたが、SATySFiでもっず色々可愛いもの・排萜た工䜜が出来そうだず感じおいたす。沢山実装したいもののアむデアはあるので、ゆるゆるず気が向いた時に䜜品を出しおいけたら良いですね...
本蚘事を読んだ方も是非色々䜜っおみおください〜

rubyをパッケヌゞを䜿うず良い感じにルビも振れたす。
cuppa

「打倒 LaTeX」はむケそうだなずいう印象です。囜内孊䌚の論文のテンプレヌトでも提䟛されれば、䜿う人倚いのではないでしょうか。応甚䟋はアむデア次第で沢山考えられるので、「こんなもの䜜っおみたしたヌ」報告が増えるず良さそうですねヌではでは。

脚泚
  1. VenturaにOSアップデヌトしたら、brew updateが出来なくなっお、brew自䜓の削陀・再むンストヌルをしお解決したした。䞊手く消しお戻せるのか䞍安で、怖かったです。 ↩

  2. 最新はv0.0.8ですが、執筆時点でSatyrographosでパッケヌゞずしお提䟛されおいるバヌゞョンはv0.0.7なので、そちらを䜿わせおください。 ↩

Discussion