如何在Typst的#list函数中插入自定义函数生成的单词列表?
问题解决:自定义函数输出适配Typst list函数
问题分析
你的bullet函数当前返回的是拼接后的单个文本块(比如[Hello;],[Word.]),而Typst的list函数需要的是多个独立的列表项参数,直接传入会被当成单个列表项处理,导致不符合预期的输出。
解决方案:修改bullet函数返回元素列表
调整bullet函数,让它返回处理好标点的元素数组,再通过**展开操作符...**把数组元素拆成list的独立参数:
#let bullet(list_bullet) = { list_bullet.map((content, index) => { // 根据是否为最后一个元素添加对应标点 if index == list_bullet.len() - 1 { #[#content .] } else { #[#content ;] } }) } #let example = ("Hello", "Word") // 用展开操作符拆分数组,传入list作为独立项 #list( marker: [#text(rgb(0,158,161))[#sym.circle.filled]], spacing: 8pt, indent: 12pt, ...bullet(example) )
执行后就能得到预期输出:
- Hello; - Word.
两种list调用方式的差异
方式一(无效)
#list(..., bullet(example))
这里bullet(example)返回的是一个单个数组对象,list函数会把这个对象当成唯一的列表项,所以输出会把整个拼接内容放在一个项目里,出现- [Hello ;], [Word .]的结果。
方式二(有效)
#list(..., [Hello;], [Word.])
这里直接传入了两个独立的内容块,完全匹配list函数的可变参数要求(接受任意数量的列表项),因此会生成两个独立的列表项,符合预期。
内容的提问来源于stack exchange,提问作者Con5tantine_83
相关产品推荐
相关产品推荐

