我正在使用 pandoc (带有 pandoc-crossref 过滤器)将 markdown 文档转换为 LATEX。但我希望表作为常规(浮动)表环境输出,而不是作为(非浮动)长表输出。我编写了一个 LUA 过滤器来执行此操作,它是成功的,只是它无法提取有关表的 pandoc-crossref 标签的信息。我需要提取此信息,以便可以将此标签作为 LATEX 输出的一部分包含在内(从而交叉引用该表)。这是一个最小的例子。
首先,这是一个最小的 Markdown 文档 (input.md),其中仅包含一个带有标签 tbl:table1 的表格(可以通过 pandoc-crossref 读取):
| First Header | Second Header |
|:-------------|:--------------|
| Content Cell | Content Cell |
| Content Cell | Content Cell |
: Table example {#tbl:table1}
其次,这是我的最小 LUA 过滤器 (table.lua),它尝试从此 Markdown 文档中提取此标签 (tbl:table1):
function Table(elem)
local id = elem.attr.identifier or ''
if id ~= '' then
print("Table label: " .. id)
else
print("Table does not have a label")
end
end
return {
{ Table = Table }
}
第三,当我从命令提示符运行 pandoc 时,我希望这个 LUAfilter 在命令提示符窗口中打印“Table label: tbl:table1”,但它却打印“Table does not have a label”。这是我在命令提示符中的命令行:
pandoc input.md --output=output.tex --from markdown+pipe_tables --to latex --filter pandoc-crossref --lua-filter=table.lua
非常感谢任何帮助!
顺便说一下,这是我更广泛的 LUA 过滤器,它(几乎成功)输出一个表而不是一个长表:
function Table(tbl)
local simpleTable = pandoc.utils.to_simple_table(tbl)
local blocks = pandoc.Blocks{}
-- Function to create a LaTeX row
local function create_latex_row(cells)
local latex_row = ""
for i, cell in ipairs(cells) do
for _, content in ipairs(cell) do
latex_row = latex_row .. pandoc.write(pandoc.Pandoc({content}), "latex")
end
if i < #cells then
latex_row = latex_row .. " & "
end
end
return latex_row .. " \\\\"
end
-- Determine the number of columns (using header or first row)
local num_cols = 0
if simpleTable.header and #simpleTable.header > 0 then
num_cols = #simpleTable.header
elseif #simpleTable.rows > 0 then
num_cols = #simpleTable.rows[1]
end
-- Assume all columns are left-aligned for simplicity
local col_alignment = string.rep("l", num_cols)
-- Begin table environment
blocks:insert(pandoc.RawBlock("latex", "\\begin{table}[tbp]"))
-- Add caption
if tbl.caption then
local caption_text = pandoc.utils.stringify(tbl.caption)
blocks:insert(pandoc.RawBlock("latex", "\\caption{" .. caption_text .. "}"))
end
-- Add label using tbl.attr.identifier
-- This is the part that doesn't work
if tbl.attr and tbl.attr.identifier and tbl.attr.identifier ~= "" then
blocks:insert(pandoc.RawBlock("latex", "\\label{" .. tbl.attr.identifier .. "}"))
end
blocks:insert(pandoc.RawBlock("latex", "\\centering"))
blocks:insert(pandoc.RawBlock("latex", "\\begin{tabular}{" .. col_alignment .. "}"))
-- Process header
if simpleTable.header and #simpleTable.header > 0 then
local header_row = create_latex_row(simpleTable.header)
blocks:insert(pandoc.RawBlock("latex", header_row))
end
-- Process rows
for _, row in ipairs(simpleTable.rows) do
local latex_row = create_latex_row(row)
blocks:insert(pandoc.RawBlock("latex", latex_row))
end
-- End tabular and table environment
blocks:insert(pandoc.RawBlock("latex", "\\end{tabular}"))
blocks:insert(pandoc.RawBlock("latex", "\\end{table}"))
return blocks
end
实际上,我认为如果我颠倒调用过滤器的顺序,那么此信息将包含在表格标题中:
pandoc input.md --output=output.tex --from markdown+pipe_tables --to Latex --lua-filter=table.lua --filter pandoc-crossref