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.mdи 02-chapter.mdесть сноска [^1]. По сути, я хотел бы, чтобы Pandoc обрабатывал сноски для каждого файла отдельно и не допускал перекрестных ссылок между моими файлами markdown, но я не вижу способа сделать это.

Есть у кого-нибудь идеи?

решение1

Нет необходимости в lua

Я просто наткнулся на эту --file-scopeопцию. Добавьте это parse.sh, и у вас не будет проблем...

--file-scope

Анализируйте каждый файл по отдельности перед объединением для многофайловых документов. Это позволит сноскам в разных файлах с одинаковыми идентификаторами работать так, как ожидается. Если эта опция установлена, сноски и ссылки не будут работать между файлами.

Руководство пользователя Pandoc

решение2

Pandoc не предназначен для форматирования, но в большинстве случаев он работает достаточно хорошо.

Нет способа заставить pandoc сохранить исходные сноски, поэтому вам придется найти другой метод. Задача состоит в том, чтобы заставить pandoc последовательно читать файлы как отдельные документы, а затем объединить документы в pandoc в конечный документ. Простая передача всех входных файлов (через *.md) заставляет pandocконкатенироватьэти файлы в один документ перед анализом разметки.

Я бы предложил использовать файл "index" (или master). 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

Затем вызовите pandoc с фильтром Lua и главным/индексным файлом в качестве входных данных:

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

Недостаток этого в том, что вам придется редактировать index.mdкаждый раз, когда вы добавляете новый файл Markdown; кроме того, в вывод попадут только метаданные, определенные в файле индекса (хотя оба этих ограничения можно обойти, немного написав код). В остальном это должно делать именно то, что вы ищете.

Связанный контент