在Typst中创建自定义函数实现数学模式内容着色
在Typst中实现数学内容着色的自定义函数
核心解决方案
针对你的需求,这里有两种简洁可行的函数实现方式,解决调用繁琐和变量未定义的问题:
方案一:直接引用文本模式颜色变量
#let col_math(content, color) = math(fill: color, content)
调用示例(数学模式内直接使用):
$col_math(s_2^-, #red)$
这里#red的作用是在数学模式中切换到代码求值环境,引用文本模式的预定义颜色变量——因为数学模式默认解析数学符号,直接写red会被当作数学标识符而非颜色变量,所以必须加#来获取文本环境的变量。
方案二:传递颜色名字符串
如果觉得加#麻烦,可以让函数接受颜色名字符串,内部自动解析为颜色值:
#let col_math(content, color_name) = math(fill: color(color_name), content)
调用示例:
$col_math(s_2^-, "red")$
这种方式支持所有Typst兼容的颜色名字符串,比如"blue"、"#ff6600"等。
关于#的使用时机
简单总结Typst中#的核心场景:
- 普通文本模式:插入代码表达式(函数调用、变量引用)时必须加#,比如你之前写的
#colMath($s_2^-$, red),就是在文本环境中触发代码执行。 - 数学模式:默认是数学语法解析,若要引用文本环境的变量(如预定义颜色)或执行代码逻辑,需要加#切换到代码环境;传递纯数学内容或字符串时无需加#。
- 代码/函数定义内部:本身处于代码环境,引用变量、调用函数不需要加#。
为什么你的原函数有问题
你之前写的#let colMath(x, color) = text(fill: color)[$#x$]本质是在文本模式的text块中嵌套数学内容,所以必须在文本环境中用#调用,无法直接在数学模式内使用。改用math函数直接构建带填充色的数学内容,就能适配数学模式内的直接调用。
内容的提问来源于stack exchange,提问作者Adron
相关产品推荐
相关产品推荐

