2020年3月18日

SATySFi用のjlreq作りかけだけど,レコードを引数にとると全部指定しないとならなくなって面倒になる.例えば紙サイズを変更したいだけで

document(|
  title = {たいとる};
  author = {ああああ};
  date = {};
  show-title = true;
  show-toc = false;
|) ?:(|
    paper-size = <紙サイズ>; % 指定したいのはこれだけ!
    twoside = <true/false>;
    horizontal-layout = <横方向配置>;
    vertical-layout = <縦方向配置>;
    header-sep  = <ヘッダと本文の空き>;
    header-height = <ヘッダ高さ>;
    font-size = <フォントサイズ>;
    line-gap = <行間>;
    cjk-font = <和文フォント>;
    latin-font = <欧文フォント>;
|) '<
  (本文)
>
と九つも余計に引数を指定しないとならない.必要ないならば省略できると嬉しいんだけどなぁ,と思ってたどり着いたのがこんなコード.

@require: stdja
let-inline ctx \test l = 
  let-rec aux r lst = 
    match lst with 
    | x :: xs -> aux (x r) xs
    | [] -> r
  in
  let rec = aux (|a = `a`;b = `b`;c = `c`;d = `d`;|) l in
  read-inline ctx (embed-string (`a = ` ^ rec#a ^ `, b = ` ^ rec#b ^ `, c = ` ^ rec#c ^ `, d = ` ^ rec#d))
let a s r = (|a =   s; b = r#b; c = r#c; d = r#d|)
let b s r = (|a = r#a; b =   s; c = r#c; d = r#d|)
let c s r = (|a = r#a; b = r#b; c =   s; d = r#d|)
let d s r = (|a = r#a; b = r#b; c = r#c; d =   s|)
in

document(|
  title = {};
  author = {};
  date = {};
  show-title = false;
  show-toc = false;
|) '<
  +p{\test [a `A`; d `X`];}
>

つまり

document(|
  title = {たいとる};
  author = {ああああ};
  date = {};
  show-title = true;
  show-toc = false;
|) ?:[
  paper-size A4Paper;
] '<
  (本文)
>
みたいに指定することになるんだけど,うーん…….

追記:まともな構文があると教えてもらいました.

0 件のコメント:

コメントを投稿

コメントの追加にはサードパーティーCookieの許可が必要です