请帮助乌克兰!
赞助商
Pandoc   一个通用文档转换器

Typst 属性输出

Pandoc Typst 属性输出

除了 Pandoc 的 Typst 写入器内置的结构属性输出之外,该写入器还可以输出非结构化的 Typst 属性。通过在受支持的元素上设置键为 typst:proptypst: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:proptypst: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 元素。未来可能会支持更多。

  • Span

    typst:text:prop

    内容被包装在 Typst 的 文本元素 中,并设置了指定的属性。

  • Div

    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 属性来递增相应的计数器:rawimage

  • 表格 单元格

    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 输出

Here is some #text(fill: orange)[orange text].

当然,这个简单的过滤器只适用于 Typst 的 预定义颜色。更完整的过滤器还需要转换其值。