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

格式.sh

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

我的想法基本上是不僅使用 Pandoc 作為轉換器,而且還作為格式化程序 - 這工作得很好,直到我開始使用腳註:

當我跑步時格式.sh我用於腳註的每個參考名稱都會被數字覆蓋 - 這很好,但問題是如果我運行解析器我收到以下訊息:

[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

在合併多文件文檔之前單獨解析每個文件。這將允許具有相同標識符的不同文件中的腳註按預期工作。如果設定此選項,腳註和連結將無法跨文件工作。

潘多克使用者指南

答案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 過濾器和 master/index 檔案作為輸入呼叫 pandoc:

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

index.md這樣做的缺點是每當添加新的 Markdown 文件時都必須進行編輯;此外,只有索引檔案中定義的元資料才會進入輸出(儘管這兩個限制可以透過一些編碼來避免)。除此之外,它應該完全符合您的要求。

相關內容