120 lines
2.7 KiB
Text
120 lines
2.7 KiB
Text
#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
|
||
```
|