用于 pandoc(带有交叉引用)的 LUAfilter,用于提取表的标签

问题描述 投票:0回答:1

我正在使用 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
lua latex pandoc
1个回答
0
投票

实际上,我认为如果我颠倒调用过滤器的顺序,那么此信息将包含在表格标题中:

pandoc input.md --output=output.tex --from markdown+pipe_tables --to Latex --lua-filter=table.lua --filter pandoc-crossref

© www.soinside.com 2019 - 2024. All rights reserved.