Typst set 规则与 show 规则完整指南:30 秒选对工具
【免费下载链接】typstA markup-based typesetting system that is powerful and easy to learn.项目地址: https://gitcode.com/GitHub_Trending/ty/typst
上次交付模板,我只想居中一个章节标题,却在文件顶部顺手写了一条全局样式规则。结果整篇 Typst 文档排版全乱了,连页眉页脚都被带偏。问题出在混淆了set 规则和show 规则的分工:前者改的是元素的参数值,后者换的是元素的渲染模板。把这条边界记住,Typst 样式问题的一大半当场消失。
🧭 一张表看懂两者分工
本节直接给结论:什么场景选哪个,30 秒扫完。
| 维度 | set 规则 | show 规则 |
|---|---|---|
| 改动对象 | 元素的属性值 | 元素的整套渲染逻辑 |
| 工作方式 | 静默写入默认值,不产出内容 | 接收原元素,返回替代内容 |
| 典型用途 | 页面尺寸、字号、对齐方式 | 标题自定义、引用重排 |
| 表达力 | 低,只能改"已有开关" | 高,能拼出全新结构 |
落到具体动作,选型看这张决策表:
| 场景 | 选哪个 | 一句话理由 |
|---|---|---|
| 改页面纸张、边距、字号 | set 规则 | 现成属性,调旋钮即可 |
| 全文统一段落对齐、行距 | set 规则 | 一次设置,级联生效 |
| 给一级标题换外观 | show 规则 | 默认渲染满足不了,要换模板 |
| 不同级别标题用不同样式 | show 规则 | 需要按条件分支处理 |
| 把引用、脚注改造成自定义格式 | show 规则 | 涉及结构重组,不是改值 |
set 规则拆解:只动旋钮,不换模具
本节解决"set 能干什么、干不了什么"的问题。
一句话定性:set 规则是给元素类型登记默认参数,像给设备写配置项,写完之后它才"照单执行"。
它的核心行为是作用域内的级联生效:写在块内的 set,只管块里的内容;写在文档顶部的 set,管到文件末尾。下面这段代码演示局部覆盖与自动恢复:
// 全局:正文 11pt #set text(size: 11pt) // 仅在本块内关闭两端对齐 #block[ #set par(justify: false) 这段文字不强制对齐 ] 到这里又恢复两端对齐观察点:块结束后段落重新两端对齐,说明 set 的影响止步于容器边界,不会向外泄漏。
set 的边界也很清楚:它只能调元素"本来就有的属性"。想加个角标、换套编号体系这种"属性表里不存在的东西",set 无能为力,该交给 show 了。
show 规则拆解:整个渲染过程推倒重来
本节解决"show 到底换掉了什么"的问题。
一句话定性:show 规则是一个内容转换函数,原元素进、新内容出。默认渲染逻辑只是没写 show 时的后备方案,一旦被命中就整体失效。
// 只拦截一级标题,换成"居中 + 小型大写" #show heading.where(level: 1): it => { set text(size: 13pt) align(center, smallcaps(it.body)) }观察点:输出一级标题变小大写居中,而二级及以下标题保持默认外观——这是靠where 条款过滤出来的,没被拦到的元素完全不受影响。
where 是 show 的安全带。缺了它,规则会命中该类型的每一个元素,这是后面要讲的高频坑。
🔧 双栏论文样式的完整流程
本节用一次学术会议双栏论文排版,演示两条规则从头到尾的分工。
流程固定为三步:先用 set 铺底子,再用 show 做定制,最后写内容。基础样式全部走 set:
// 页面与正文基础参数,一次配齐 #set page(paper: "a4", columns: 2, gutter: 0.8cm, numbering: "1") #set text(size: 10.5pt) #set par(justify: true, leading: 0.8em)观察点:双栏、10.5pt 正文、两端对齐全部由属性值决定,没有任何渲染逻辑被改动,这正是 set 的主场。
会议要求一级标题居中并使用小型大写,默认渲染给不了,引入 show:
// 仅重做一级标题,其余标题走默认 #show heading.where(level: 1): it => { set align(center) smallcaps(it.body) }观察点:一级标题换了外观,正文的字号、对齐仍由前面的 set 掌管。分工线很干净——值归 set,模板归 show,互不越界。
🚧 三个最常见的 Typst 样式翻车点
本节把优先级冲突、作用域泄漏这类高频问题收敛成一张对照表,问题与解法一一对应。
| 症状 | 原因 | 解法 |
|---|---|---|
| set 过的参数"失效",标题样式整体变了 | 同类型上又写了 show,替换渲染盖掉了默认外观 | 把参数搬进 show 规则体内,别再两头设 |
| 一处局部 set 污染了整份文档 | 规则写在文档顶层,作用域一路覆盖到文末 | 用 block、align 等容器包起来,缩小范围 |
| show 误伤了不该动的元素 | 缺 where 过滤,命中了全部同类元素 | 补上 where(level: 1) 之类的条件 |
最容易踩的是第一条。看这个最小冲突现场:
#set heading(numbering: "1.") #show heading: it => [自定义标题: #it.body] = 引言观察点:输出结果是"自定义标题:引言",编号彻底消失。show 的替换发生在 set 生效之后,原元素的整套外观被丢弃,编号想保留就必须在规则体内手动渲染。
选型口诀与最佳实践清单
本节给一条能背走的口诀,再附一份日常可用的清单。
set 调值,show 换体。参数够用时别碰 show,需要换渲染体时 set 帮不上忙。
最佳实践清单:
- 默认先试 set 规则,属性表里能找到的开关一律用 set。
- show 规则必须带 where 条件,裸写全局替换只在项目级模板里谨慎使用。
- 所有 set 与 show 集中放在文件开头或独立模板文件中,作用域一眼可读。
- 组合时先 set 定基础,再 show 做定制,两条规则各占一层,不交叉设同一属性。
- 改完标题、页眉这类元素后,通读一遍 where 条件,确认没拦错人。
延伸阅读:
- 官方教程中的样式与页面设置章节:docs/content/tutorial/
- 各元素属性与规则参考文档:docs/content/reference/
- 项目入口文档,含两条规则的官方定位说明:README.md
【免费下载链接】typstA markup-based typesetting system that is powerful and easy to learn.项目地址: https://gitcode.com/GitHub_Trending/ty/typst
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考