Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

ユーザーがカスタマイズできるクラスファイル ―v0.0.x と v0.1.x それぞれでの実装 ―

puripuri2100
September 24, 2022

ユーザーがカスタマイズできるクラスファイル ―v0.0.x と v0.1.x それぞれでの実装 ―

SATySFi Conf 2022で発表したスライドです
SATySFiのクラスファイルでカスタマイズ性を高めるためのテクニックや、今後リリース予定のv0.1.xでの実装例を紹介しています

puripuri2100

September 24, 2022
Tweet

More Decks by puripuri2100

Other Decks in Programming

Transcript

  1. 3/14 SATYSFIのクラスファイルの特徴 document 型を生成するための document 関数を提供する document 関数の引数として一つ目にオプション指定のレコードなどを、二つ目 に文書の内容の bock-text

    を取る 実装が隠蔽された文章構造や簡単な装飾に関するコマンドを提供する などの特徴がある。 フォントの設定やデザインについても各コマンドの実装がモジュールで隠されるた め、上書きが不可能であり、各クラスファイルが独自に提供する設定の変更方法を使 うしか方法が無い。
  2. 4/14 標準ライブラリでの設定方法 1 StdJaBook.document (| 2 title = {title}; 3

    author = {author}; 4 show-title = true; 5 show-toc = false; 6 |) ?:((| 7 StdJaBook.default-config with 8 show-pages = false; 9 paper-size = A5Paper; 10 |))'< 11 +p{test} 12 >
  3. 5/14 exdeisgn での設定方法 1 document (| 2 title = {title};

    3 author = {author}; 4 date = {2022/9/24}; 5 show-title = true; 6 show-toc = false; 7 style = ArticleJa.a4paper ; 8 design = ArticleJa.article; 9 header-footer = ArticleJa.normalHF; 10 fonts = ArticleJa.fonts; 11 |) '< 12 +p{test} 13 >
  4. 6/14 SLYDIFIでの設定方法 1 document '< 2 +set-config (| 3 SlydifiThemeAkasaka.default-config

    with 4 color-bg = Color.of-css `lightcyan`; 5 color-emph = Color.of-css `darkred`; 6 |); 7 +make-title (| 8 title = {|title|}; 9 author = {|author|}; 10 date = {|2022/9/24|}; 11 |); 12 +frame {} <> 13 >
  5. 7/14 思い出す話 去年の SATySFi Conf 2021 での Murase さんの発表: 「SATySFi

    で DSL を作る / 使うと便利って話」 https://docs.google.com/presentation/d/1CmP_OdwNTNx46M0mqlK_EyO123 BOGQNMTb25SwFhVnI/edit#slide=id.p 1 \cmd ( 2 open TestModule in 3 config 4 |> set-hoge 42 5 |> head {text} 6 |> set-fuga 100 7 |> body '<+code(`code`);> 8 );
  6. 8/14 v0.0.x での実装例 GitHub の template 機能で使えるように実装 https://github.com/puripuri2100/satysfi-class-template 使用例 1

    document ( 2 open Cls in 3 default-config 4 |> set-title {title} 5 |> set-author {author} 6 |> set-show-toc true 7 |> set-title-page false 8 ) '< 9 +p{test} 10 >
  7. 9/14 v0.1.x での実装例 使用例 1 module Local = struct 2

    module MyCls1Settings = struct 3 val config = Clsor.default () 4 |> Clsor.set-font-size-normal 10pt 5 end 6 module MyCls = Clsor.Make MyCls1Settings 7 end 8 --------------------------------------------------------- 9 Local.MyCls.document '< 10 +Local.MyCls.p{test} 11 >
  8. 10/14 設定関数の扱い 1 document ( 2 open Cls in 3

    default-config 4 |> set-title {title} 5 |> set-author {author} 6 |> set-show-toc true 7 |> set-title-page false 8 ) '< 9 +p{test} 10 > set-title や set-show-toc、 default-config の取扱いについて扱う
  9. 10/14 設定関数の扱い default-config は config 型を持つ set-* 関数は x ->

    config -> config 型を持つ という設計にしてあるため、パイプライン演算子で繋げていくことができる。
  10. 10/14 設定関数の扱い default-config は config 型を持つ set-* 関数は x ->

    config -> config 型を持つ という設計にしてあるため、パイプライン演算子で繋げていくことができる。 config 型の内部実装は 1 (| 2 title : inline-text list; 3 author : inline-text option; 4 show-toc : bool; 5 ... 6 |) のようなレコードになっている set-* 関数はこのレコード内の必要な項目を書き換える実装である
  11. 11/14 コマンドに影響を与える設定への対処 「+figure コマンドのキャプションの表示を変えられるようにしたい」場合を考える set-fig-caption : (int -> inline-text ->

    inline-boxes) -> config -> config という設定用関数を用意する しかしこのままでは config の影響は document 関数のみに閉じている
  12. 11/14 コマンドに影響を与える設定への対処 「+figure コマンドのキャプションの表示を変えられるようにしたい」場合を考える set-fig-caption : (int -> inline-text ->

    inline-boxes) -> config -> config という設定用関数を用意する しかしこのままでは config の影響は document 関数のみに閉じている そこで可変参照を利用して document 関数内で書き換えを行う
  13. 11/14 コマンドに影響を与える設定への対処 1 let-mutable fig-caption <- (fun n title ->

    ( 2 let n-it = n |> arabic |> embed-string in 3 {図#n-it; #title;} 4 )) 5 6 let document config inner = 7 let () = fig-caption <- config#fig-caption in 8 ... 9 10 let-block ctx +figure title inner = 11 let () = fig-count <- !fig-count + 1 in 12 let caption = !fig-caption !fig-count title in 13 ...
  14. 13/14 コマンドに影響を与える設定への対処 v0.0.x のときと違い、 「クラスモジュール全体に設定が与えられる」という状態であ るため、特別な処理が要らない 1 module Make =

    fun(Config : DocumentConfig) -> struct 2 val config-data = Config.config 3 val block ctx +figure title inner = 4 let () = fig-count <- !fig-count + 1 in 5 let caption = config-data#fig-caption !fig-count titl e in 6 ... のような実装でできる
  15. 13/14 コマンドに影響を与える設定への対処 v0.0.x のときと違い、 「クラスモジュール全体に設定が与えられる」という状態であ るため、特別な処理が要らない 1 module Make =

    fun(Config : DocumentConfig) -> struct 2 val config-data = Config.config 3 val block ctx +figure title inner = 4 let () = fig-count <- !fig-count + 1 in 5 let caption = config-data#fig-caption !fig-count titl e in 6 ... のような実装でできる
  16. 13/14 コマンドに影響を与える設定への対処 v0.0.x のときと違い、 「クラスモジュール全体に設定が与えられる」という状態であ るため、特別な処理が要らない 1 module Make =

    fun(Config : DocumentConfig) -> struct 2 val config-data = Config.config 3 val block ctx +figure title inner = 4 let () = fig-count <- !fig-count + 1 in 5 let caption = config-data#fig-caption !fig-count titl e in 6 ... のような実装でできる