Typst 属性输出
Pandoc Typst 属性输出
除了 Pandoc 的 Typst 写入器内置的结构属性输出之外,该写入器还可以输出非结构化的 Typst 属性。通过在受支持的元素上设置键为 typst:prop
或 typst:text:prop
形式的属性来实现。
Typst 属性
Typst 允许将视觉和布局属性作为参数指定给元素
#block(fill=orange)[Hello]
以及 set-rules
#set text(fill=blue); Hello
参数值是可以使用 Typst 语言任何功能的 Typst 代码。
Pandoc Typst 属性输出
对于受支持的 Pandoc 元素集,Pandoc Typst 写入器会将属性作为对应 Typst 元素或 set-text 规则的参数输出。
Typst 写入器会查找键为 typst:prop
或 typst:text:prop
形式的属性,并假定这些值是原始 Typst 代码。
prop
是要设置的属性的名称。
例如,使用 HTML 输入运行 pandoc -f html -t typst
命令
<div typst:inset="10pt">foo</div>
会生成 Typst 输出
#block(inset: 10pt)[
foo]
而使用 HTML 输入
<div typst:text:fill="purple">foo</div>
会生成 Typst 输出
#block[
#set text(fill: purple); foo
]
Typst 写入器不检查 prop
或其值的有效性。由于 Typst 是一种静态类型语言,不正确的属性名称或值通常会导致编译失败。
支持的元素
目前支持以下 Pandoc AST 元素。未来可能会支持更多。
-
typst:text:prop
-
内容被包装在 Typst 的 文本元素 中,并设置了指定的属性。
-
typst:prop
-
prop
作为参数输出到 Typst 的 块元素。 typst:text:prop
-
在块内容的开头,
prop
作为参数输出到 set-text 规则。
-
typst:prop
-
prop
作为参数输出到 Typst 的 表格元素。 typst:text:prop
-
表格被包装在 Typst 的 文本元素 中,其中
prop
是其参数之一。 typst:no-figure
(类)-
默认情况下,Pandoc 会将表格包装在 Typst 的 图元素 中。如果表格具有此类别,则只输出表格元素本身。这可以避免 Typst 的
table
类型的交叉引用计数器递增。 typst:figure:kind
-
如果设置了此属性,Pandoc 会将表格包装在 Typst 的 图元素 中,并带有指定的
kind
属性。这对于应在文档中交叉引用为Table ...
以外的其他内容的表格很有用。Typst 将使用kind
属性来递增相应的计数器:raw
和image
。
表格 单元格
typst:prop
-
prop
作为参数输出到 Typst 表格的 单元格元素。 typst:text:prop
-
在单元格内容的开头,
prop
作为参数输出到 set-text 规则。
Lua 过滤器示例
这是一个 Lua 过滤器的最小示例,它将 span 元素上的 CSS color
属性转换为 Typst 文本元素上等效的 fill
参数。
function styleToTable(style)
if not style then return nil end
local ret = {}
for clause in style:gmatch('([^;]+)') do
k,v = clause:match("([%w-]+)%s*:%s*(.*)$")
ret[k] = v
end
return ret
end
function Span(span)
local style = styleToTable(span.attributes['style'])
if not style then return end
if style['color'] then
span.attributes['typst:text:fill'] = style['color']
end
return span
end
给定 HTML 输入
<p>Here is some <span style="color:orange">orange text</span>.</p>
该命令
pandoc -f html -t typst --lua-filter ./typst-property-example.lua
将生成 Typst 输出
#text(fill: orange)[orange text]. Here is some
当然,这个简单的过滤器只适用于 Typst 的 预定义颜色。更完整的过滤器还需要转换其值。