Как переопределить -top-level-Division в pandoc для каждого составного файла в отдельности? - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть куча .md файлов составного содержимого, помеченных заголовками #, ## и т. Д.

Я хочу гибко компилировать новые документы, с составными файлами без изменений, но находящимися на разныхУровни иерархии ToC итогового документа.

Например:

  1. В compiled-1.pdf заголовок верхнего уровня # Foo из constituent-1.md может заканчиваться как "Chapter Foo" - без измененийдо его уровня в иерархии.

  2. Однако в compiled-2.pdf тот же самый # Foo из того же constituent-1.md может закончиться как "Section Foo" --- aпонижение до уровня 2 в иерархии ToC compiled-2.pdf.

В каждом составляющем файле .md заголовок верхнего уровня всегда равен #, а каждый составляющий файл .md всегдарассматривается как единое целое.Следовательно, все заголовки составного файла должны быть понижены в силе одним и тем же фактором.Кроме того, заголовки составного файла никогда не продвигаются.

Я чувствую, что проблема связана с переустановкой -top-level-divison для каждого файла.Как это сделать правильно (используя .yaml config и make)?

Но, возможно, лучшим способом является создание для каждого окончательного документа мастер-файла, который устанавливает иерархию составляющих файлов с комбинацией include ('constituent-1.md') и т. Д. И define ('level', '1') и т. Д. Такой мастер-файл затем предварительно обрабатывается с помощью m4 для поиска и замены # на ## или ### и т. Д., В соответствии с level каждого файла, изатем по трубопроводу pandoc.

Каков наилучший подход?

1 Ответ

0 голосов
/ 27 февраля 2019

Я думаю, что это правильные идеи, но не правильные инструменты.Вместо использования m4 вы можете проверить фильтры pandoc , особенно встроенные фильтры Lua или отличный пакет panflute python.Они позволяют вам манипулировать фактической структурой документа, а не только текстовым представлением.

Например, этот фильтр Lua удаляет все заголовки в документе:

function Header (header)
  header.level = header.level + 1
  return header
end

Аналогично, вы можете определить свой собственныйоператор include, основанный на блоках кода:

```{include="FILENAME.md"}
```

Включить с этим фильтром:

function CodeBlock (cb)
  if not cb.attributes.include then
    return
  end
  local fh = io.open(cb.attributes.include)
  local blocks = pandoc.read(fh:read('*a')).blocks
  f:close()
  return blocks
end

Также возможно применить фильтр только к подмножеству блоков (требуется небольшой взлом):

local blocks = …
local div = pandoc.Div(blocks)
local filtered_blocks = pandoc.walk_block(div, YOUR_FILTER).content

Вы можете комбинировать и расширять эти строительные блоки, чтобы написать свой собственный фильтр и определить свои расширения.Таким образом, можно получить основной документ, который включает все ваши подфайлы и при необходимости сдвигает уровни заголовков.

...