SATySFiのカスタマイズ可能なクラスファイルについてまとめ、新たな手法を2つ提案する
カスタマイズ可能なクラスファイルについてSATySFi Conf 2020@puripuri21002020/7/25
View Slide
自己紹介所属 開成学園開成高等学校学年 高校二年SATYSFI歴 中学三年から高校二年までの約 2 年twitter @puripuri2100mail [email protected]1
自己紹介SATYSFI関連のこと:• SATySFi Advent Calendar (2018 | 2019) の主催2
自己紹介SATYSFI関連のこと:• SATySFi Advent Calendar (2018 | 2019) の主催• satysfi-siunitx とか satysfi-uline とか色々パッケージを作成2
自己紹介SATYSFI関連のこと:• SATySFi Advent Calendar (2018 | 2019) の主催• satysfi-siunitx とか satysfi-uline とか色々パッケージを作成• satysfi-base のお手伝いもしています2
自己紹介SATYSFI関連のこと:• SATySFi Advent Calendar (2018 | 2019) の主催• satysfi-siunitx とか satysfi-uline とか色々パッケージを作成• satysfi-base のお手伝いもしています• SATySFi-API のようなサイトの整備も少しずつ(最近 SATYSFIのドキュメントを作り始めました)2
自己紹介SATYSFI関連のこと:• SATySFi Advent Calendar (2018 | 2019) の主催• satysfi-siunitx とか satysfi-uline とか色々パッケージを作成• satysfi-base のお手伝いもしています• SATySFi-API のようなサイトの整備も少しずつ(最近 SATYSFIのドキュメントを作り始めました)• 「SATySFi に関すること」のような解説記事も書いていました2
今日話すこと• SATYSFIにおけるクラスファイルの役割• 既に存在しているクラスファイルの簡単な紹介• なぜ「カスタマイズ可能なクラスファイル」が必要なのか• 既にあるアプローチ• 新しく提案する方法 1:json ファイルからの生成• 新しく提案する方法 2:unit list と破壊的代入を使った方法• 今後について3
SATYSFIにおけるクラスファイルの役割• document 関数の提供• 版面の設定• フォントの設定• 相互参照• 章節コマンドの提供• 浮動環境や脚注などの版面と深くかかわるコマンドの提供4
既存クラスファイルの紹介stdja* SATySFi 標準のもの5
既存クラスファイルの紹介stdja* SATySFi 標準のものstjarticle stdja にコマンド等を色々付け加えたもの5
既存クラスファイルの紹介stdja* SATySFi 標準のものstjarticle stdja にコマンド等を色々付け加えたものexdesign カスタマイズ可能なもの5
既存クラスファイルの紹介stdja* SATySFi 標準のものstjarticle stdja にコマンド等を色々付け加えたものexdesign カスタマイズ可能なものjlreq JLReq の準拠を目指すもの5
既存クラスファイルの紹介stdja* SATySFi 標準のものstjarticle stdja にコマンド等を色々付け加えたものexdesign カスタマイズ可能なものjlreq JLReq の準拠を目指すものnew-cls 改造前提のもの5
既存クラスファイルの紹介stdja* SATySFi 標準のものstjarticle stdja にコマンド等を色々付け加えたものexdesign カスタマイズ可能なものjlreq JLReq の準拠を目指すものnew-cls 改造前提のものcs-thesis 論文用5
既存クラスファイルの紹介stdja* SATySFi 標準のものstjarticle stdja にコマンド等を色々付け加えたものexdesign カスタマイズ可能なものjlreq JLReq の準拠を目指すものnew-cls 改造前提のものcs-thesis 論文用shinchoku-tairiku 進捗大陸用5
既存クラスファイルの紹介stdja* SATySFi 標準のものstjarticle stdja にコマンド等を色々付け加えたものexdesign カスタマイズ可能なものjlreq JLReq の準拠を目指すものnew-cls 改造前提のものcs-thesis 論文用shinchoku-tairiku 進捗大陸用satysfi-class-yabaitech ヤバイテックトーキョー用5
既存クラスファイルの紹介stdja* SATySFi 標準のものstjarticle stdja にコマンド等を色々付け加えたものexdesign カスタマイズ可能なものjlreq JLReq の準拠を目指すものnew-cls 改造前提のものcs-thesis 論文用shinchoku-tairiku 進捗大陸用satysfi-class-yabaitech ヤバイテックトーキョー用slydifi スライド用5
既存クラスファイルの紹介stdja* SATySFi 標準のものstjarticle stdja にコマンド等を色々付け加えたものexdesign カスタマイズ可能なものjlreq JLReq の準拠を目指すものnew-cls 改造前提のものcs-thesis 論文用shinchoku-tairiku 進捗大陸用satysfi-class-yabaitech ヤバイテックトーキョー用slydifi スライド用steamer スライド用5
なぜ「カスタマイズ可能なクラスファイル」が必要なのかSATYSFIで作られる文書は大きく分けて 2 通り:6
なぜ「カスタマイズ可能なクラスファイル」が必要なのかSATYSFIで作られる文書は大きく分けて 2 通り:• 同人誌や商業誌、部誌などのしっかりした本6
なぜ「カスタマイズ可能なクラスファイル」が必要なのかSATYSFIで作られる文書は大きく分けて 2 通り:• 同人誌や商業誌、部誌などのしっかりした本• レポート6
なぜ「カスタマイズ可能なクラスファイル」が必要なのかSATYSFIで作られる文書は大きく分けて 2 通り:• 同人誌や商業誌、部誌などのしっかりした本• レポート本のクラスファイルは基本的に「オーダーメイド」6
なぜ「カスタマイズ可能なクラスファイル」が必要なのかSATYSFIで作られる文書は大きく分けて 2 通り:• 同人誌や商業誌、部誌などのしっかりした本• レポート本のクラスファイルは基本的に「オーダーメイド」レポートは「使いまわし」で「少しずつ体裁が変わる」6
なぜ「カスタマイズ可能なクラスファイル」が必要なのかSATYSFIで作られる文書は大きく分けて 2 通り:• 同人誌や商業誌、部誌などのしっかりした本• レポート本のクラスファイルは基本的に「オーダーメイド」レポートは「使いまわし」で「少しずつ体裁が変わる」→レポート作成のためには「手軽に」「ちょこっと変更を加えられる」クラスファイルの存在がどうしても必要6
既存アプローチの紹介既存のカスタマイズ可能なクラスファイル7
既存アプローチの紹介既存のカスタマイズ可能なクラスファイル• stdja*7
既存アプローチの紹介既存のカスタマイズ可能なクラスファイル• stdja*• exdesign7
既存アプローチの紹介既存のカスタマイズ可能なクラスファイル• stdja*• exdesign• jlreq7
既存アプローチの紹介(stdja*の場合)• タイトルや著者のデータ、タイトルと目次を表示するかはレコード型で指定• 基本版面に関することをオプション引数の形で変更できる8
既存アプローチの紹介(stdja*の場合)• タイトルや著者のデータ、タイトルと目次を表示するかはレコード型で指定• 基本版面に関することをオプション引数の形で変更できるメリット:• ページサイズの変更とかができる• with を使うことで好きな値だけ変えられる8
既存アプローチの紹介(stdja*の場合)• タイトルや著者のデータ、タイトルと目次を表示するかはレコード型で指定• 基本版面に関することをオプション引数の形で変更できるメリット:• ページサイズの変更とかができる• with を使うことで好きな値だけ変えられるデメリット:• 基本版面以外弄れないので、章節のデザインを弄りたい時に若干困る8
既存アプローチの紹介(stdja*の場合)@require: stdjadocument (|title = {};author = {};show-title = true;show-toc = true;|) ?:(|StdJa.default-config withpager-size = A3Paper;show-pages = false;|) '<+p{段 落}>9
既存アプローチの紹介(exdesign の場合)• 全てのパラメータに対して値を与える• レコード型を上手く使ってパラメータを分類する• 分類したパラメータごとに値を設定し、パッケージで使いまわしできるようにする10
既存アプローチの紹介(exdesign の場合)• 全てのパラメータに対して値を与える• レコード型を上手く使ってパラメータを分類する• 分類したパラメータごとに値を設定し、パッケージで使いまわしできるようにするメリット:• 使いまわし可能• 変更が比較的簡単にできる10
既存アプローチの紹介(exdesign の場合)• 全てのパラメータに対して値を与える• レコード型を上手く使ってパラメータを分類する• 分類したパラメータごとに値を設定し、パッケージで使いまわしできるようにするメリット:• 使いまわし可能• 変更が比較的簡単にできるデメリット:• パラメータ多すぎ• パラメータを弄ると簡単に後方互換性が壊れる10
既存アプローチの紹介(exdesign の場合)@require: class-exdesign/exdesign@require: class-exdesign/article-jadocument (|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{段 落}>11
既存アプローチの紹介(jlreq の場合)• document 型のオプション引数でレコード型を使ってパラメータを弄る• *-scheme 関数があり、これもレコード型を使って設定を弄ることができる12
既存アプローチの紹介(jlreq の場合)• document 型のオプション引数でレコード型を使ってパラメータを弄る• *-scheme 関数があり、これもレコード型を使って設定を弄ることができるメリット:• 設定の変更が非常に楽• 幅広く、良い感じに変更ができる12
既存アプローチの紹介(jlreq の場合)• document 型のオプション引数でレコード型を使ってパラメータを弄る• *-scheme 関数があり、これもレコード型を使って設定を弄ることができるメリット:• 設定の変更が非常に楽• 幅広く、良い感じに変更ができるデメリット:• きちんと版面を練らねばならず、レポート作成用には難易度が高い(設定コピペの誘発)12
新しい提案 1:json ファイルからの生成• json ファイルからクラスファイルを生成する13
新しい提案 1:json ファイルからの生成• json ファイルからクラスファイルを生成するメリット:• 設定の変更が非常に楽• 柔軟な設定ができる• Web 上での自動生成等に応用できる13
新しい提案 1:json ファイルからの生成• json ファイルからクラスファイルを生成するメリット:• 設定の変更が非常に楽• 柔軟な設定ができる• Web 上での自動生成等に応用できるデメリット:• 生成したクラスファイルのメンテが非常に困難13
新しい提案 1:json ファイルからの生成formatcls というソフトウェアを Rust で実装済みhttps://github.com/puripuri2100/formatcls14
新しい提案 1:json ファイルからの生成formatcls というソフトウェアを Rust で実装済みhttps://github.com/puripuri2100/formatclsformatcls -c demo.json -o demo.satyh のような感じで使用。大体 500 行程度のクラスファイルが作成される。14
formatcls について例{"page-size": "b5","left-space" : "20mm","right-space" : "20mm","main-font" : {"size":"12pt","cjk-name":"ipaexm","cjk-ratio":"0.88","cjk-correction":"0.","latin-name":"lmsans","latin-ratio":"1.","latin-correction":"0."},"header-fun":"empty","footer-fun":"empty","sec-depth":2,"sec-name-list" : ["section", "subsection"]}15
新しく提案する方法 2:unit list と破壊的代入を使った方法内部で破壊的代入を使ってデフォルトの値を書き換えるようなinline-text -> unit みたいな型を持つ関数を用意しておき、そこに値を与えて unit list を作る。第一引数に設定値をリストで与え、第二引数に普通のブロックテキストを与える。document 関数内で第一引数を評価するときに値の書き換えが実行され、組版結果に影響を与える。exdesign のレコード型を unit list で置き換えているイメージ。document [Doc.title {title};Doc.page-size Page.b5j;Doc.left-space 20mm;Doc.right-space 20mm] '<+p{text}>16
新しく提案する方法 2:unit list と破壊的代入を使った方法予想されるメリット:• 気軽にパラメータの増減ができる• 見た目がシンプルになる• ある程度使いまわしができる17
新しく提案する方法 2:unit list と破壊的代入を使った方法予想されるメリット:• 気軽にパラメータの増減ができる• 見た目がシンプルになる• ある程度使いまわしができる予想されるデメリット:• パラメータが多すぎてメンテが大変• 予期せぬパラメータの上書きが発生するかも17
今後について• formatcls の改良18
今後について• formatcls の改良• unit list を使ったクラスファイルを作ってみる18
今後について• formatcls の改良• unit list を使ったクラスファイルを作ってみる• 各クラスファイルユーザの感想を集めたい18
今後について• formatcls の改良• unit list を使ったクラスファイルを作ってみる• 各クラスファイルユーザの感想を集めたい• どの手法が良いのかわからないので数を撃ちたい18
まとめ• レポート作成用にカスタマイズ可能なクラスファイルが必要• 既存の手法は主にレコード型を使ったもの• json ファイルを使って自動生成する方法と、unit list を使う方法の 2種類を提案• json ファイルからの生成の方は formatcls というソフトウェアを既に実装済み• unit list の方はこれから実装する必要がある• どの方法が良いのかはわからないので、色々な人に使い倒してもらう必要がある19
想定質問:なぜ Rust で実装したのか• 多くの OS で動く• 書きやすい• 使いたかったsatyrographos でインストールしてもらうために OCaml で書き直すのもアリではある20