我有一个如下的文件夹结构:
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.md
和02-chapter.md
都有脚注[^1]
。基本上,我希望 Pandoc 分别处理每个文件的脚注,并且不允许在我的 markdown 文件之间进行交叉引用,但我看不到任何方法可以做到这一点。
有人有什么想法吗?
答案1
不需要 lua
我刚刚偶然发现了这个--file-scope
选项。添加这个选项parse.sh
,你就可以摆脱麻烦了……
--file-scope
在合并多文件文档之前,单独解析每个文件。这将允许具有相同标识符的不同文件中的脚注按预期工作。如果设置了此选项,脚注和链接将无法跨文件工作。
答案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 文件时,您都必须进行编辑;此外,只有在索引文件中定义的元数据才会进入输出(尽管这两个限制都可以通过一点编码来避免)。除此之外,它应该完全符合您的要求。