如何控制嵌套 emph 和 strong 的样式?
在“show–函数”内嵌套 show 规则,可以设置strong(emph(…))和emph(strong(…))的样式。
typst
#show strong: set text(red)
#show emph: set text(yellow)
#show strong: it => {
show emph: set text(green)
it
}
#show emph: it => {
show strong: set text(blue)
it
}
- *Strong*
- _Emph_
- *_Strong(Emph)_*
- _*Emph(Strong)*_
show 规则的优先顺序
show 规则的原理可能和你想得不一样,导致调试困难,所以在此一并解释下。
(以下内容摘自 Which show rule takes precedence? - Questions - Typst Forum)
“show–set”规则:设置所选内容的样式
“show–set”规则设置所选内容的样式,后续同类规则可以覆盖先前样式。
typst
#show heading: set text(purple)
#show heading: set text(green)
= Green上例约等于以下内容,靠后的green覆盖了靠前的purple。
typst
#heading({
set text(purple)
set text(green)
[Green]
})“show–函数”规则:给所选内容套一层函数
“show–函数”规则给所选内容套一层函数,后续同类规则会在此基础上叠加。注意 show 规则始终应用于“所选内容”,而这未必等于先前“show–函数”的返回值。
typst
#show heading: it => { set text(purple); it }
#show heading: it => { set text(green); it }
= Purple上例约等于以下内容……
typst
#show heading: it => { set text(purple); it }
#{
set text(green)
heading[Purple]
}……又继续约等于以下内容。因此靠前的purple最终生效。
typst
#{
set text(green)
{
set text(purple)
heading[Purple]
}
}“show–函数”规则套上的函数一般很难解下,除非所选内容本身提供方法,比如it.body。
typst
#show heading: it => { set text(purple); it }
#show heading: it => { set text(green); it.body }
= Green更复杂的例子
多次用“show-set”规则设置样式,相当于只设置了最后一次。
typst
#show list: set block(stroke: purple)
#show list: set block(stroke: green)
- List
- Nested
- List
- Recursive!
多次用“show-函数”规则包装函数,相当于包装了好几层函数。
typst
#show list: block.with(stroke: purple)
#show list: block.with(stroke: green)
// 等价版本:
// #show list: it => block(stroke: purple, it)
// #show list: it => block(stroke: green, it)
- List
- Nested
- List
- Recursive!
更复杂的“show-函数”规则例子如下。
typst
#show list: it => {
set block(stroke: purple)
grid(columns: 2, gutter: 1em, it, [Purple])
}
#show list: it => {
set block(stroke: green)
grid(columns: 2, gutter: 1em, it, [Green])
}
- List
- Nested
- List
- Recursive!
总结
- “show–set”规则是专门给设置样式设计的,优先使用。
- “show–函数”规则不是专门设计的,但表达能力强,遇到
strong(emph(…))这种没办法的情况再用。





