2024年5月4日

Typstの行取り改訂版.段間の取り方がわからない…….

#let gyodori(
  lines: 2,
  before_space: 0,
  after_space: 0,
  x
) = {
  context{
    // 和文文字の縦方向長さ
    let letter_height = measure(box[阿]).height
    // 段落間の長さ(block(spacing:**)のやつ)を計測
    let block_spacing = measure(block[#par[阿];#par[阿]]).height - 2 * letter_height
    // baselineskip
    let baselineskip = letter_height + par.leading
    let be_sp = {
      if type(before_space) == int { before_space * baselineskip }
      else { before_space }
    }
    let aft_sp = {
      if type(after_space) == int { after_space * baselineskip }
      else { after_space }
    }
    // 本文のテキスト長さの計算
    let textlen = {
      let totaltextlen = {
        page.width - {
          if page.margin == auto {
            (5/21) * {
              if page.width < page.height { page.width}
              else { page.height }
            }
          } else if(type(page.margin)) == dictionary {
            let margin_keys = page.margin.keys()
            let left_margin = {
              if(margin_keys.contains("left")) {
                page.margin.left
              } else if(margin_keys.contains("inside")){
                page.margin.inside
              } else { 0pt }
            }
            let right_margin = {
              if(margin_keys.contains("right")){
                page.margin.right
              } else if(margin_keys.contains("outside")){
                page.margin.outside
              } else { 0pt }
            }
            right_margin + left_margin
          } else { 2 * page.margin }
        }
      }
      // 段間の取得方法がわからない.2*は根拠なしというか多分間違っている
      (totaltextlen -  (page.columns - 1) * 2 * columns.gutter)/page.columns
    }
    // とりあえずブロックに入れる
    let b = block(width: textlen, x)
    // 長さ計算
    let total_len = baselineskip * (lines - 1) + letter_height
    let ue = (total_len - measure(b).height)/2 + be_sp
    let shita = (total_len - measure(b).height)/2 + aft_sp
    block[
      #v(ue)
      #b
      #v(shita)
    ]
  }
}

0 件のコメント:

コメントを投稿

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