概述
上节我们介绍了文档结构元素的函数,本节介绍一些控制布局使用的函数,掌握他们之后你可以更进一步的控制页面元素的布局。
系列目录
对齐
align(
alignment, // 沿两个轴的对齐方式。默认:start + top
content, // 要对齐的内容。
) -> 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, // 旋转量,角度或弧度,默认为0deg
origin: alignment, // 旋转的中心点,默认center + horizon
content, // 要旋转的内容
) -> 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 + horizon
content, // 要缩放的内容
) -> 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, // 列数,默认为2
gutter: 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, // 内容的排列方向,默认:ttb
spacing: 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, // 列间距,优先于 gutter
row-gutter: auto int relative fraction array, // 行间距,优先于 gutter
content, // 布局的子项
) -> 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, // 位置,默认:start
float: bool, // 是否浮动布局,默认:false
clearance: length, // 放置的元素在浮动布局中的间隙量。默认:1.5em
dx: 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, // 左侧边距100pt
rect( // 内部矩形
width: 100%,
height: 100pt,
fill: rgb("#eee"),
[左侧边距100pt]
)
)
]
#rect()[ // 外部矩形
#pad(
rest:100pt, // 统一边距100pt
rect( // 内部矩形
width: 100%,
height: 100pt,
fill: rgb("#eee"),
[统一边距100pt]
)
)
]
#rect()[ // 外部矩形
#pad(
x:100pt, // 左右边距100pt
rect( // 内部矩形
width: 100%,
height: 100pt,
fill: rgb("#eee"),
[左右边距100pt]
)
)
]