#set text( size: 12pt, font: ("Linux Libertine", "Noto Serif CJK TC"),// "Linux Libertine Mono O" ) #let hd1(txt) = box[ #set text( font: ("FreeSans", "Noto Sans CJK TC"),// "Linux Libertine Mono O" ) = #txt ] #let hd2(txt) = box[ #set text( font: ("FreeSans", "Noto Sans CJK TC"),// "Linux Libertine Mono O" ) == #txt ] 這个程式借Knuth ê排版理論,但是為著beh予列位知影所以mā是佇tsia介紹: #figure([#image("a.svg")], caption: [ a.svg ] ) === 2.2 一个盒仔ê結構 <一个盒仔ê結構> ==== 2.2.1 咱tsit-má來看一个盒仔(Box) ê 結構,ē當分做若以上ê圖講ê部件: `Box is a subtype of Element` #align(center)[#table( columns: 3, align: (col, row) => (auto,auto,auto,).at(col), inset: 6pt, [屬性英語名], [型別], [臺語解說], [basePoint], [Position], [定義安khǹg盒仔ê基點。], [baseLineDirection], [Rection], [定義基線(安khǹg元素ê基準線)ê方向], [width], [float], [基線ê長度(pt)], [height], [float], [BaseLine 射出去ê方向ê「倒pîng」ê長度 (pt)(m̄是kui个ê懸度 totalHeight)], [depth], [float], [BaseLine 射出去ê方向ê「正pîng」 ê 長度 (pt)], [elements], [Element List], [所有內底收囥ê元素ê列單(list),照baseLineDirection ê 方向,沿 baseLine 排in ê基點], [elementsBaseSkip], [float List], [`elementsSpaging[i] == elements[i] 基點之間ê距離 (BaseSkip)` (px)], [pageNo], [Int], [所屬佇ê頁數], ) ] 其中 ```ocaml Position = struct {x: Float, y : Float} Direction = Up | Down | Left | Right ``` ==== 2.2.2相關ê函數: <相關ê函數> #align(center)[#table( columns: 3, align: (col, row) => (auto,auto,auto,).at(col), inset: 6pt, [英語名], [型別], [臺語解說], [len\_of\_elements], [box -\> int], [len\_of\_elements box \= length (box.elements)], [totalHeight], [box -\> float], [`totalHeight box = box.height + box.depth`], [insert\_element], [box -\> element List -\> float -\> Option], [插入一个`element List`內底ê逐个元素kàu一个Box,逐个baseSkip是固定ê float,轉來`Result Box` á是`Exception`(that滿ê時)。(例見下kha)], ) ] ```ocaml let a_box = Box{ basePoint = (70.0,50.0), baseLineDirection = DOWN, width = 400.0, height = 700.0, depth = 0.0, elements = [], elementsBaseSkip = [], pageNo = 3 }; let a_char_list = List.map [天, 地, 儂] fun x -> CharToBox x 12.0 (*font-size*) "AR PL New Sung" (*font-family*) 300 (*font weight*) Normal (*font style*);; let new_a_box = insert_element a_box a_char_list 15 (* new_a_box : Option Box *) ``` 其中 ```ocaml Option = Result a | Exception str ```