我正在阅读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 }}
无需过滤!