Skip to content

SATySFi v0.1.xで行なう破壊的変更の案

T. Suwa edited this page Feb 28, 2019 · 10 revisions

これは開発者による検討用・備忘用のメモです.既に或る程度SATySFiに慣れている人でないと理解できないかもしれません.

すぐにでもできるもの

  • page 型の廃止: length * length で置き換え,A4など既定の紙面の寸法は Paper.a4 : length * length などパッケージレヴェルで与える.
  • Unicodeコードポイント1つに対応するデータのために char 型を導入し, 現行の string-unexplode : int list -> stringchar list -> string に変更するなどする.
  • 単行コメントアウトを % から %- に変更し,% から始まるトークンを他の用途に使えるようにする.
  • 新たなプリミティヴ concat-graphics : graphics list -> graphics を導入し,グラフィックス系のプリミティヴで (… -> graphics list) という型の函数の引数をとるものはその箇所を (… -> graphics) に改める.
  • 数式文字クラス( math-char-class )の種類を増やす: PR#163
  • get-initial-context にデフォルトの文中数式用コマンドを指定しなくてよいようにする.
  • mathfonts.satysfi-hashmath-fonts.satysfi-hash に改める.

もう少し検討を要するもの

  • load-image : string -> imageload-pdf-image : string -> int -> image は絶対パスしか受けつけないようにし,相対パスから絶対パスへの変換はプリプロセスの機能で実現する.現状では相対パスは文書ファイルからみた場所(訂正: v0.0.3 まではSATySFiを起動したディレクトリからみた場所, 遅くとも introduce-multi-stage ブランチのmerge 以降の master では文書ファイルからみた場所)として扱われるので,文書本体から切り分けられて別のディレクトリに置いてあるソースファイルから外部ファイルを指定したときに相対パスがそのソースファイルからみた場所にならない.これを改善する意図がある.
  • line-break : bool -> bool -> context -> inline-boxes -> block-boxes の第1・第2引数に与える「段落の直前・直後でページ分割してよいか」と set-paragraph-margin : length -> length -> context -> context で与える「段落の前後にどれだけのマージンを入れるか」とでインターフェイスを統一する.
  • page-break に与える情報を整頓する.ヘッダがどうであるとかフッタがどうであるといった具体的な構造を決め打ちした指定方法ではなく,グラフィックスで指定できるようにした方がよさそう.
  • 縦書き・横書きの共存を目的に,型変数とは別に「縦」か「横」のいずれかをとる 行方向変数 (direction variable) という概念を用意し,型に加える. 例えば read-inline : forall 'd. context -> inline-text -> inline-boxes['d]
  • 補助ファイル(に書き込む|から読み込む)情報をデータベース的に名前空間で分けられるようにする.例えば章のラベルと浮動する図のラベルとは別の名前空間に分けて保持できる.これまでは各クラスファイルはユーザから見てラベルの名前空間が分かれているようにするために内部的に接頭辞をつけて補助ファイルに書き込んでいたが,そういう労力を払わなくて済む.また,できれば文字列以外も記録できるようにしたい(原理的には,Haskellの言葉で言うところの ShowRead のインスタンスの型のデータはすべて書き込み・読み込みができる.型システムがボトルネック).
  • script 型を廃止し,各UnicodeコードポイントごとにどのOpenTypeのScriptTagに関連づけるかのテーブルをcontextに保持させる.フォント設定(とこれを機に新たに導入する 言語設定)はScriptTagごとに行なう.ただし,OpenTypeのScriptTagとUnicode Script Propertyは互換性がないらしい(前者の方が時代的に先行)ので unidata/Script.txt をデフォルトのテーブルとして使うには多少難がある.
  • 複数行にまたがる場合の文字列リテラル(コード例などに使われる)のインデントを処理系側で削らないようにする.除去したい場合はパッケージレヴェルで除去すればよいため.ただし,先頭の改行を除去するかどうかなどのコーナーケースについてよく検討する必要がある.また,プリミティヴ split-into-lines : string -> string list は廃止し,パッケージレヴェルに落とす.
  • 文字列リテラルに関して,現在は空白を除去しない場合に # を,除去する場合に何もつけないという記法をとっているが,これを逆にする.空白を除去したい場合の方が少ないため.ただし,空文字列が #` `# という長ったらしい書き方になってしまうので,代替案を考える.一般的なプログラミング言語に見られる二重引用符による文字列リテラル "…" を導入する?
  • math-paren : paren -> paren -> math -> mathparen = length -> length -> length -> length -> color -> inline-boxes * (length -> length)paren = context -> inline-boxes * (length -> length) に改める.
  • math-radical の平方根の形状を変更できるようにする.
Clone this wiki locally