次のようなフォルダ構造があります。
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.md
、 と02-chapter.md
の両方に脚注があることです[^1]
。基本的に、私は Pandoc が各ファイルの脚注を個別に処理し、マークダウン ファイル間での相互参照を許可しないようにしたいのですが、これを実現する方法がわかりません。
誰か何かアイデアはありますか?
答え1
luaは必要ありません
偶然そのオプションを見つけました--file-scope
。これを追加すれparse.sh
ば問題は解決します...
--file-scope
複数ファイルのドキュメントを結合する前に、各ファイルを個別に解析します。これにより、同じ識別子を持つ異なるファイル内の脚注が期待どおりに機能するようになります。このオプションが設定されている場合、脚注とリンクはファイル間で機能しません。
答え2
Pandoc はフォーマッタとして機能するようには設計されていませんが、ほとんどの場合、適切に機能します。
pandocに元の脚注を保存させる方法はないので、別の方法を見つける必要があります。課題は、pandocにファイルを個別の文書として順番に読み込ませ、pandoc内の文書を最終文書に結合することです。すべての入力ファイルを(経由して*.md
)渡すだけで、pandocは連結するマークダウンを解析する前に、これらのファイルを 1 つのドキュメントにまとめます。
私の提案は「インデックス」(またはマスター)ファイルを使用することです。Pandoc Markdownには子ファイルを含めるための組み込み構文はありませんが、pandoc Lua フィルターたとえば、すべての章を結び付けるファイルを定義します。コード ブロックでは、ファイルが 1 行に 1 つずつリストされます。
``` 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
これには、新しい Markdown ファイルを追加するたびに編集する必要があるという欠点がありますindex.md
。また、インデックス ファイルで定義されたメタデータのみが出力に反映されます (ただし、これらの制限は両方とも、少しコーディングするだけで回避できます)。それ以外は、まさに必要なことを実行するはずです。