Pandoc是否支持其模板中的Markdown表的创建



我正在阅读pandoc手册nd,如果我正确理解了这一点,它支持使用模板文件和包含用于模板中使用的变量的yaml文件。它还说YAML支持任何任意对象(甚至清单(。但是,我想询问是否可以使用YAML数据在模板中渲染降压表。示例仅显示一个简单的密钥和值映射。


编辑:我创建了一个可test.md文件,其中包含此

---
table:
  caption: Cities
  headers: [city, population]
  rows:
    - [Berlin, '3,748,148']
    - [Tokyo, '13,839,910']
---
$table$
**Random Text**

并使用此命令使用Tarleb提供的过滤器: pandoc -f markdown -t docx --lua-filter=yaml_table.lua -o target.docx testtable.md

但是,似乎输出文件仍然不包含表。我想念什么吗?


编辑:我意识到模板文件的指定与输入不同当我制作testtable.md时,它可以正常工作,仅包含以下内容:

---
table:
  caption: Cities
  headers: [city, population]
  rows:
    - [Berlin, '3,748,148']
    - [Tokyo, '13,839,910']
---

并创建了一个名为Markdowntmpl.md的模板文件,包含以下

$table$
**Random Text**

然后我使用以下命令:

pandoc -f markdown -t markdown --template=markdowntemplate.md --lua-filter=yaml_table.lua -o target.md testtable.md

输出:

  city     population
  -------- ------------
  Berlin   3,748,148
  Tokyo    13,839,910
  : Cities
**Random Text**

然后我可以从中创建一个Docx文档。

也可以将所有可表示的元素放入元数据字段中。插入复杂元素的最简单方法是将newline保留的YAML语法用于多行字符串。例如,

---
table: |
  | city   | population |
  |--------|------------|
  | Berlin |  3,748,148 |
  | Tokyo  | 13,839,910 |
---

这将table定义为包含表的元数据字段。


没有定义表的"本地" yaml方法,但是您可以使用pandoc lua滤镜滚动。

说一个人想定义这样的桌子:

---
table:
  caption: Cities
  headers: [city, population]
  rows:
    - [Berlin, '3,748,148']
    - [Tokyo, '13,839,910']
---

然后可以使用以下过滤器将其转换为潘多克表。

local List = require 'pandoc.List'
function repeated(item, times)
  local result = {}
  for i = 1, times do result[i] = item end
  return result
end
function to_table (tbl)
  if tbl.t ~= 'MetaMap' or not tbl.rows then
    return nil
  end
  -- Turn MetaInlines into blocks
  local to_blocks = function (x) return {pandoc.Plain(List:new(x))} end
  local headers = (List:new(tbl.headers)):map(to_blocks)
  local rows = List:new(tbl.rows):map(
    function (row) return List:new(row):map(to_blocks) end
  )
  local columns = #rows[1]
  local aligns = tbl.aligns or repeated(pandoc.AlignDefault, columns)
  local widths = tbl.widths or repeated(0, columns)
  return pandoc.Table(List:new(tbl.caption), aligns, widths, headers, rows)
end
function Meta (meta)
  for k, v in pairs(meta) do
      local success, result = pcall(to_table, v)
      if success and result then
        meta[k] = pandoc.MetaBlocks{result}
      end
  end
  return meta
end

我决定回答,因为我有类似的问题&阅读这给我带来了新的视角。

基本上,您可以使用${table.rows[ & ]} \之类的东西渲染表。特别是,此代码应在您的示例中进行:

begin{tabular}[t]{ll}
  ${ for(table.rows) }
  ${ table.rows[ & ] }\
  ${ endfor }
end{tabular}

(根据需要调整tabular环境(。

解释是for(table.rows)子句将通过您的YAML列表(在rows范围内的破折号定义的权利(迭代。在此for循环中,您可以将项目引用为(令人困惑的(table.rows(因此,它指的是循环中的当前行(。语法table.rows[ & ]指示Pandoc使用分隔符 & 扩展所述项目(本身就是列表(。

因此,扩展的代码看起来像:

begin{tabular}[t]{ll}
  Berlin & 3,748,148 \
  Tokyo & 13,839,910 \
end{tabular}

最后,要用标题和标题渲染桌子,只需做:

begin{tabular}[t]{ll}
  ${ table.headers[ & ] }
  midrule
  ${ for(table.rows) }
  ${ table.rows[ & ] }\
  ${ endfor }
end{tabular}
caption{${ table.caption }}

无需过滤!

最新更新