Pandoc:重复的脚注 - 多个文件 - 同名

Pandoc:重复的脚注 - 多个文件 - 同名

我有一个如下的文件夹结构:

chapters/
  01-chapter.md
  02-chapter.md
  03-chapter.md
format.sh
parse.sh

解析器

pandoc -t html5+smart -so dist/book.html --html-q-tags chapters/*.md

格式化脚本

for f in chapters/*.md;
  do
    pandoc "$f" -o "$f" -t \
    markdown+smart+footnotes-escaped_line_breaks+example_lists \
    --columns=80;
done

我的想法基本上是不仅将 Pandoc 用作转换器,而且还将其用作格式化程序 - 这种方法效果很好,直到我开始使用脚注:

当我跑步时格式化脚本我用于脚注的每个参考名称都会被数字覆盖 - 这没什么问题,但问题是如果我运行解析器我收到以下消息:

[WARNING] Duplicate note reference '1' at line 360 column 1

问题是01-chapter.md02-chapter.md都有脚注[^1]。基本上,我希望 Pandoc 分别处理每个文件的脚注,并且不允许在我的 markdown 文件之间进行交叉引用,但我看不到任何方法可以做到这一点。

有人有什么想法吗?

答案1

不需要 lua

我刚刚偶然发现了这个--file-scope选项。添加这个选项parse.sh,你就可以摆脱麻烦了……

--file-scope

在合并多文件文档之前,单独解析每个文件。这将允许具有相同标识符的不同文件中的脚注按预期工作。如果设置了此选项,脚注和链接将无法跨文件工作。

Pandoc 用户指南

答案2

Pandoc 并非设计为格式化程序,但它大多数时候运行得相当好。

没有办法让 pandoc 保留原始脚注,所以你必须找到其他方法。挑战在于让 pandoc 按顺序将文件作为单个文档读取,然后将 pandoc 中的文档合并到最终文档中。只需传递所有输入文件(通过*.md)就会导致 pandoc连接在解析 markdown 之前,将这些文件合并为一个文档。

我的建议是使用“索引”(或主)文件。Pandoc Markdown 没有用于包含子文件的内置语法,但我们可以使用pandoc Lua 过滤器。例如,定义一个将所有章节联系在一起的文件,其中文件在代码块中每行列出一个:

``` include
chapters/1.md
chapters/2.md
chapters/3.md
```

将以下代码放入文件中include.lua(取自这个要点

--- Pandoc Lua filter to include other Markdown files
local List = require 'pandoc.List'

function CodeBlock(cb)
  if cb.classes:includes'include' then
    local blocks = List:new()
    for line in cb.text:gmatch('[^\n]+') do
      if line:sub(1,1)~='#' then
        local fh = io.open(line)
        blocks:extend(pandoc.read (fh:read '*a').blocks)
        fh:close()
      end
    end
    return blocks
  end
end

然后使用 Lua 过滤器和主文件/索引文件作为输入调用 pandoc:

pandoc -t html5+smart -so dist/book.html --html-q-tags --lua-filter=include.lua index.md

这样做的缺点是,index.md每当您添加新的 Markdown 文件时,您都必须进行编辑;此外,只有在索引文件中定义的元数据才会进入输出(尽管这两个限制都可以通过一点编码来避免)。除此之外,它应该完全符合您的要求。

相关内容