web-dev-qa-db-ja.com

Pandoc:脚注の重複-複数のファイル-同じ名前

私は次のようなフォルダ構造を持っています:

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

parse.sh

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

format.sh

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

私の考えは基本的にPandocをコンバーターとしてだけでなくフォーマッターとしても使用することでした-これは脚注を使い始めるまではかなりうまくいきました:

format.shを実行すると、脚注に使用するすべての参照名が数字で上書きされます-これで問題ありませんが、問題は、実行する場合parse.sh次のメッセージが表示されます。

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

問題は 01-chapter.mdおよび02-chapter.md両方の脚注があります[^1]。基本的に、Pandocで各ファイルの脚注を個別に処理し、マークダウンファイル間で相互参照できないようにしたいのですが、これを行う方法がわかりません。

誰かアイデアはありますか?

2
Leun4m

luaは必要ありません

--file-scopeオプションに出くわしました。これをparse.shに追加すると、問題が発生しなくなります...

--file-scope

マルチファイルドキュメントを結合する前に、各ファイルを個別に解析します。これにより、同じ識別子を持つ異なるファイルの脚注が期待どおりに機能するようになります。このオプションが設定されている場合、脚注とリンクはファイル間で機能しません。

Pandocユーザーガイド

2
Leun4m

Pandocはフォーマッターとして機能するようには設計されていませんが、ほとんどの場合、かなりうまく機能します。

元の脚注を保持するためにpandocを取得する方法はないため、別の方法を見つける必要があります。課題は、pandocにファイルを個別のドキュメントとして順番に読み取らせ、pandoc内のドキュメントを組み合わせて最終的なドキュメントにすることです。すべての入力ファイルを(*.md経由で)渡すだけで、pandocはマークダウンを解析する前にこれらのファイルを単一のドキュメントに連結します。

私の提案は、「インデックス」(またはマスター)ファイルを使用することです。 Pandoc Markdownには、子ファイルを含めるための組み込み構文はありませんが、 pandoc Lua filter を使用して独自の構文を作成できます。たとえば、すべてのチャプターを結び付けるファイルを定義します。ファイルはコードブロックに1行ずつリストされます。

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

次のコードをファイルに入れますinclude.luathis Gist から取得)

--- 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を編集する必要があるという欠点があります。また、インデックスファイルで定義されたメタデータのみが出力になります(ただし、これらの制限は両方とも、少しのコーディングで回避できます)。それ以外は、あなたが探していることを正確に行う必要があります。

1
tarleb