Skip to content

如何控制嵌套 emph 和 strong 的样式?

如何控制嵌套 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)*_
Typst compiled image

(来源:How to prevent conflicts between emph and strong overrides for Chinese text? - Questions - Typst Forum

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
Typst compiled image

上例约等于以下内容,靠后的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 compiled image

上例约等于以下内容……

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
Typst compiled image

更复杂的例子

多次用“show-set”规则设置样式,相当于只设置了最后一次。

typst
#show list: set block(stroke: purple)
#show list: set block(stroke: green)

- List
  - Nested
  - List
- Recursive!
Typst compiled image

多次用“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!
Typst compiled image

更复杂的“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!
Typst compiled image

总结

  • “show–set”规则是专门给设置样式设计的,优先使用。
  • “show–函数”规则不是专门设计的,但表达能力强,遇到strong(emph(…))这种没办法的情况再用。
What do you think?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
Comments
  • Latest
  • Oldest
  • Hottest
Powered by Waline v3.5.1

基于 MIT 许可发布