概述
上節我們介紹了文檔結構元素的函數,本節介紹一些控制布局使用的函數,掌握他們之后你可以更進一步的控制頁面元素的布局。
系列目錄
- 1.Typst概述
- 2.Typst標記語法和基礎樣式
- 3.Typst腳本語法
- 4.導入、包含和讀取
- 5.文檔結構元素與函數
- 6.布局函數
對齊
align(alignment, // 沿兩個軸的對齊方式。默認:start + topcontent, // 要對齊的內容。
) -> content
alignment可能的值為:
start
:在文本方向的開頭對齊。end
:在文本方向的末尾對齊。left
:向左對齊。center
:水平對齊。right
:在右側對齊。top
:在頂部對齊。horizon
:垂直對齊。bottom
:在底部對齊。
整體使用:
#set align(center)
這是第一段 \
這是第二段 \
這是第三段 \
#align(left)[左對齊]
#align(center)[居中對齊]
#align(right)[右對齊]
#rect(width: 100%,height: 200pt
)[#align(left+top)[left+top]#align(center+horizon)[center+horizon]#align(right+bottom)[right+bottom]
]
旋轉與角度
rotate(angle, // 旋轉量,角度或弧度,默認為0degorigin: alignment, // 旋轉的中心點,默認center + horizoncontent, // 要旋轉的內容
) -> content
angle可以賦予:
- 角度值:如120deg,代表120°
- 弧度值:如1.57rad,代表1/2弧度,也就是90°
// 以默認旋轉中心,順時針旋轉45°
#rotate(45deg)[#rect()[旋轉的內容]
]
// 以默認旋轉中心,逆時針旋轉45°
#rotate(-45deg)[#rect()[旋轉的內容]
]
// 以默認旋轉中心,順時針旋轉1.57弧度
#rotate(1.57rad)[#rect()[旋轉的內容]
]
// 以左上角為旋轉中心,順時針旋轉30°
#rotate(30deg,origin: top+left)[#rect()[旋轉的內容]
]
縮放和翻轉(鏡像)
scale(x: ratio, // 水平縮放因子,默認:100%y: ratio, // 垂直縮放因子,默認:100%origin: alignment, // 縮放變換的原點,默認:center + horizoncontent, // 要縮放的內容
) -> content
#rect(width:100%,
)[#set align(center)這里是原始效果// 水平翻轉#scale(x:50%)[這里是水平壓縮50%]#scale(x:150%)[這里是水平拉伸150%]#scale(x:-100%)[這里是水平翻轉]// 垂直翻轉#scale(y:50%)[這里是垂直壓縮50%]#scale(y:450%)[這里是垂直拉伸450%]#scale(y:-100%)[這里是垂直翻轉]
]
移動
move(dx: relative, // 水平位移dy: relative, // 垂直位移content, // 要移動的內容
) -> content
#rect(inset: 0pt, move(dx: 6pt, dy: 6pt,rect(inset: 8pt,fill: white,stroke: black,[這里是內容])
))
block和box
block和box都可以看作是一個容器,只不過:
- block是塊級元素,無論寬度是否撐滿頁面寬度,始終是獨占一行
- box是行內元素,可以在行內與文字進行混排
block(width: auto relative,height: auto relative,breakable: bool,fill: none color gradient pattern,stroke: none length color gradient stroke pattern dictionary,radius: relative dictionary,inset: relative dictionary,outset: relative dictionary,spacing: relative fraction,above: relative fraction,below: relative fraction,clip: bool,nonecontent,
) -> content
box(width: auto relative fraction,height: auto relative,baseline: relative,fill: none color gradient pattern,stroke: none length color gradient stroke pattern dictionary,radius: relative dictionary,inset: relative dictionary,outset: relative dictionary,clip: bool,nonecontent,
) -> content
分欄
columns(int, // 列數,默認為2gutter: relative, // 列間距,默認:4%content, // 分欄的內容
) -> content
強制換行可以用colbreak()
:
colbreak(weak:bool //如果為 true,則如果當前列已為空,則跳過列分隔符。默認:false
) -> content
局部分欄
#columns()[ //默認分兩欄#("這里是一段重復文本" * 20)#colbreak() //強制分欄#("這里是一段重復文本" * 20)
]
整頁分欄
#set page(columns: 2) // 設置當前頁面整體分為兩欄== 分欄#("這里是一段重復文本" * 20)
#colbreak() //強制分欄
#("這里是一段重復文本" * 20)
水平和垂直分布
stack(dir: direction, // 內容的排列方向,默認:ttbspacing: none relative fraction, // 內容間距relative fraction content, // 要排列二點內容
) -> content
dir可能的值為:
ltr
:從左到右。rtl
:從右到左。ttb
:從上到下。btt
:從下到上。
#stack(rect[第1個],rect[第2個],rect[第3個],
)
#stack(dir:direction.ltr, // 由左向右排列rect[第1個],rect[第2個],rect[第3個],
)
#stack(dir:direction.ltr,spacing: 5pt, // 設定水平間距rect[第1個],rect[第2個],rect[第3個],
)
水平和垂直間距
// 水平間距
h(relative fraction, // 間距值weak: bool,
) -> content
// 垂直間距
v(relativefraction, // 間距值weak: bool,
) -> content
隨便寫點什么 #h(2em) 后續的內容。
隨便寫點什么 #h(1fr) 后續的內容。\
隨便寫點什么2 #h(1fr) 后續的內容。
隨便寫點什么3 #v(1em) 后續的內容。
網格布局
grid(columns: auto int relative fraction array, // 列數或列設置rows: auto int relative fraction array, // 行數或行設置gutter: auto int relati vefraction array, // 行列間距column-gutter: auto int relative fraction array, // 列間距,優先于 gutterrow-gutter: auto int relative fraction array, // 行間距,優先于 guttercontent, // 布局的子項
) -> content
#grid(columns: 2,rect[12],rect[12],rect[12],rect[12]
)
// 統一設置rect的樣式
#set rect(width: 100%,height: 100pt
)#grid(columns: (100pt,1fr), // 左側寬100pt,右側為頁面剩余寬度rect[1],rect[2],rect[3],rect[4]
)
#set rect(width: 100%,height: 100pt
)#grid(columns: (100pt,1fr),gutter: 5pt, // 統一設置行列間距rect[1],rect[2],rect[3],rect[4]
)
絕對定位
place()
用于將內容絕對定位。
place(auto alignment, // 位置,默認:startfloat: bool, // 是否浮動布局,默認:falseclearance: length, // 放置的元素在浮動布局中的間隙量。默認:1.5emdx: relative, // 水平位移dy: relative, // 垂直位移content, // 定位的內容
) -> content
隱藏
hide(content // 要隱藏的內容
) -> content
重復
repeat(content // 要重復的內容
) -> content
內容邊距
pad(left: relative, top: relative,right: relative,bottom: relative,x: relative,y: relative,rest: relative,content,
) -> content
#rect()[ // 外部矩形#pad( left:100pt, // 左側邊距100ptrect( // 內部矩形width: 100%,height: 100pt,fill: rgb("#eee"),[左側邊距100pt]))
]
#rect()[ // 外部矩形#pad( rest:100pt, // 統一邊距100ptrect( // 內部矩形width: 100%,height: 100pt,fill: rgb("#eee"),[統一邊距100pt]))
]
#rect()[ // 外部矩形#pad( x:100pt, // 左右邊距100ptrect( // 內部矩形width: 100%,height: 100pt,fill: rgb("#eee"),[左右邊距100pt]))
]