この記事は SATySFi Advent Calendar 21 日目の記事です。
もともと個人的なメモとしてまとめていた、SATySFi のページ分割に関するアイデアを公開します。あくまでも一ユーザの意見なのでツメが甘いところが多々あるかと思いますが、その際はご指摘いただけると幸いです。また、具象構文は SATySFi 0.1.0 のものを採用しています。
SATySFi を使ったことがあり、block-boxes 等の概念を理解している人
| :- use_module(library(clpfd)). | |
| :- use_module(library(lists)). | |
| month_rows([ | |
| [[jan, _, _, _, _, _, xxx], [_, _, _, _, _, _, xxx]], | |
| [[_, feb, _, _, _, _, xxx], [_, _, _, _, _, _, xxx]], | |
| [[_, _, mar, _, _, _, xxx], [_, _, _, _, _, _, xxx]], | |
| [[_, _, _, apr, _, _, xxx], [_, _, _, _, _, _, xxx]], | |
| [[_, _, _, _, may, _, xxx], [_, _, _, _, _, _, xxx]], | |
| [[_, _, _, _, _, jun, xxx], [_, _, _, _, _, _, xxx]], |
| module With_position = struct | |
| type 'a t = | |
| { value : 'a | |
| ; pos : Lexing.position | |
| } | |
| end | |
| type 'dict atom = | |
| [ `Symbol of string | |
| | `Vector of 't array |
| % inspired by https://tech.aptpod.co.jp/entry/2020/11/20/160000 | |
| % with http://taku910.github.io/mecab/ | |
| % ref. https://tex.stackexchange.com/questions/500372/conditional-string-replacements-in-lualatex | |
| \documentclass[a4paper]{ltjsarticle} | |
| \usepackage[no-math]{luatexja-fontspec} | |
| \usepackage{luacode,luatexbase} | |
| %\usepackage[callback={preline},verbosity=1]{nodetree} | |
| %\usepackage{lipsum} | |
| \usepackage[textwidth=32em,textheight=5cm,paperwidth=32em,paperheight=5cm]{geometry} |
この記事は SATySFi Advent Calendar 2020 2日目の記事です。
SATySFi向けパッケージマネージャとして、na4zagin3さんが開発されたSatyrographosがあり、現時点で40パッケージ以上が登録されています。これまで、パッケージを導入する際は手動でファイルをダウンロードし、適切な場所に配置したりフォントハッシュの更新を行う必要がありましたが、Satyrographosを使えばコマンドひとつ叩くだけで自動で行ってくれます。
大変便利なSatyrographosですが、欲しいパッケージを探すのには少々苦労します。検索やパッケージ情報の表示を行うコマンドにopam searchやopam showがありますが、もう少し使い勝手の良いものがほしいです。また、SATySFi Wikiにもパッケージ紹介ページは存在しますが、人力での更新なので情報が古くなっています。このような状況のため、SATySFi Conf 2020でもパッケージ一覧サイトがほしいという要望が出ていました。
そこで、Satyrographosパッケージの一覧表示および検索を行えるWebサイト Satyrographos Package Index (GitHub) を作ってみました。なお、本サイトはあくまで非公式のものです。
| let cleardoublepage ctx label = | |
| let hook = line-break false false ctx | |
| (hook-page-break (fun pbinfo _ -> ( | |
| let should-inser-new-page = | |
| (!ref-inserted-page-number + pbinfo#page-number) mod 2 == 0 | |
| in | |
| let () = ref-not-aligned <- !ref-not-aligned || should-inser-new-page in | |
| if !ref-not-aligned | |
| then ( | |
| if should-inser-new-page |
| use std::str; | |
| fn main() { | |
| // -- FROM: vec of chars -- | |
| let src1: Vec<char> = vec!['j','{','"','i','m','m','y','"','}']; | |
| // to String | |
| let string1: String = src1.iter().collect::<String>(); | |
| // to str | |
| let str1: &str = &src1.iter().collect::<String>(); | |
| // to vec of byte |
| @require: stdja | |
| @require: saizeriya | |
| %@import: saizeriya | |
| %------------------------------------------------- メニューデータ | |
| let the-menu = [ | |
| (|calorie=130;cost=299;name=`彩りガーデンサラダ`|); | |
| (|calorie=115;cost=349;name=`小エビのサラダ`|); | |
| (|calorie=134;cost=299;name=`やわらかチキンのサラダ`|); | |
| (|calorie=92;cost=299;name=`わかめサラダ`|); |