這个程式借Knuth ê排版理論，但是為著欲予列位知影所以mā是佇tsia介紹：



![a.svg](:/af607cb6cd2a4c34ab3c80f65efcee84)

### 2.2 一个盒仔ê結構
 #### 2.2.1 咱這馬來看一个盒仔ê (Box) 結構，ē當分做若以上ê圖講ê部件：
 
`Box is a subtype of Element`

|屬性英語名|型別|臺語解說|
|-----|----|-----|
|  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 | `elementsSpaging[i] == elements[i] 基點之間ê距離 (BaseSkip)` (px)
| pageNo | PageNo |  所屬佇ê頁數 |


其中
```OCaml
Position = struct {x: Float, y : Float}
Direction = Up | Down | Left | Right
```
#### 2.2.2相關ê函數：

|英語名|型別|臺語解說|
|-----|---|-------|
|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 -> 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
 new_a_box : Option Box
```



其中
```OCaml
Option = Result a | Exception str
```
