Typst中#()与#{}的差异、适用场景及优先使用场景咨询
Typst中#()与#{}语法的区别及适用场景
核心差异
- #() 是单个表达式嵌入语法,只能容纳纯表达式(不能包含
let变量定义、赋值这类语句),作用是把单个表达式的求值结果直接插入文本流。 - #{} 是完整代码块语法,可以承载多条语句、复杂表达式,支持局部变量定义、
if/for流程控制等逻辑,代码块最后一个表达式的结果会作为最终插入内容。
适用场景
优先/仅适合用#()的情况
- 简单表达式快速嵌入:比如直接计算、变量引用时,写法更简洁紧凑,示例:
Total price: #(subtotal * 1.08) Welcome back, #(user.nickname)! - 避免语法歧义:当表达式后面紧跟标点或文本时,#()的括号能清晰界定表达式范围,可读性更强,示例:
这种场景用#{}也能运行,但#()的写法更自然直观。The result is #(2+3). // 括号明确包裹表达式,不会和后续句号混淆
必须用#{}的情况
- 需要定义局部变量:任何包含
let、set这类语句的逻辑都必须用代码块,示例:#{ let base = 10 let multiplier = 1.5 base * multiplier } - 多语句/复杂逻辑:比如包含循环、条件判断,或者需要先执行样式设置再输出内容的场景,示例:
#{ set text(color: blue, weight: "bold") for i in 1..=3 { Line #i } } - 无返回值但有副作用的操作:比如仅调整文档样式而不需要输出具体内容时,代码块可以承载这类逻辑。
补充说明
对于单个简单表达式,两者功能等价,但#()的写法更轻便;一旦涉及到语句或多步逻辑,只能使用#{}。官方文档的示例也对应了这两种场景:#()用于快速嵌入表达式,{}搭配#形成的#{}用于完整代码块。
内容的提问来源于stack exchange,提问作者dufei
相关产品推荐
相关产品推荐

