Pandoc markdown разрыв страницы


недавно я начал использовать Pandoc markdown, который кажется хорошей альтернативой LaTeX, так как мой документ не имеет много математических формул, и у меня нет никакого опыта работы с LaTeX, что в сочетании с менее чем 2-недельным сроком подачи делает его хорошим решением.

одна вещь, которую я не смог обойти, - это как заставить его оставить остальную часть страницы пустой, может ли кто-нибудь помочь?

3 80

3 ответа:

похоже, что pandoc markdown использует стандартные теги LaTeX для этой цели:

\newpage и \pagebreak

TL; DR: use \newpage и фильтр Lua ниже, чтобы получить разрывы страниц во многих форматах.

Pandoc анализирует все входные данные во внутренний формат документа. Этот формат не имеет специального способа представления разрывов страниц, но по-прежнему можно кодировать информацию другими способами. Один из способов-использовать сырой латекс \newpage. Это отлично работает при выводе LaTeX (или pdf, созданный через LaTeX). Тем не менее, вы столкнетесь с проблемами при таргетинге на различные форматы, такие как HTML или docx.

простое решение при таргетинге на другие форматы-использовать pandoc filter который может преобразовать представление внутреннего документа таким образом, что он удовлетворяет наши потребности. Pandoc 2.0 и позже даже позволяет использовать интерпретатор Lua для выполнения этого преобразования.

предположим, что мы указываем разрывы страниц, помещая \newpage в строке, такие как пустые строки, Вот так:

lorem ipsum

\newpage

more text

The \newpage будет разбирается как RawBlock содержащего сырья TeX. Блок будет включен в Вывод только в том случае, если целевой формат может содержать необработанный TeX (т. е. LaTeX, Markdown, Org и т. д.).

мы можем использовать простой фильтр Lua для перевода этого при таргетинге на другой формат. Следующие работы для docx, LaTeX и легкой разметки.

--- Return a block element causing a page break in the given format.
local function newpage(format)
  if format == 'docx' then
    local pagebreak = '<w:p><w:r><w:br w:type="page"/></w:r></w:p>'
    return pandoc.RawBlock('openxml', pagebreak)
  elseif format:match 'html.*' then
    return pandoc.RawBlock('html', '<div style=""></div>')
  elseif format:match '(la)?tex' then
    return pandoc.RawBlock('tex', '\newpage{}')
  elseif format:match 'epub' then
    local pagebreak = '<p style="page-break-after: always;"> </p>'
    return pandoc.RawBlock('html', pagebreak)
  else
    -- fall back to insert a form feed character
    return pandoc.Para{pandoc.Str '\f'}
  end
end

-- Filter function called on each RawBlock element.
function RawBlock (el)
  -- check that the block is TeX or LaTeX and contains only \newpage or
  -- \newpage{} if el.format:match '(la)?tex' and content:match
  -- '\newpage(%{%})?' then
  if el.text:match '\newpage' then
    -- use format-specific pagebreak marker. FORMAT is set by pandoc to
    -- the targeted output format.
    return newpage(FORMAT)
  end
  -- otherwise, leave the block unchanged
  return nil
end

Я заметил, что это не работает .док и. файлы odt форматы. Обходной путь, который я нашел, состоял в том, чтобы вставить горизонтальную линию ----------------- и отформатируйте стиль "горизонтальная линия", чтобы сломать страницу и быть невидимым, используя текстовый редактор (ibre office в моем случае)