Разрыв страницы pandoc markdown


113

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

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


5
Markdown со вкусом пандока также отлично подходит для использования математических формул.
А. Донда,

Ответы:


135

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

\newpage и \pagebreak


9
Оба работают (спасибо!), Но в чем разница между ними или они точно эквивалентны?
Калин

15
newpage завершает текущую страницу, тогда как pagebreak - это скорее дружеский запрос - это может произойти, а может и не произойти. См. Personal.ceu.hu/tex/breaking.htm
parvus

5
Это связано с тем, что необработанные латексные команды передаются напрямую, если выходные данные понимают латексные команды.
Мэтью Пикеринг

23

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

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

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

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

lorem ipsum

\newpage

more text

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

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

--- 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 '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
  -- \pagebreak.
  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

Мы опубликовали обновленную, более функциональную версию . Он доступен в официальном репозитории pandoc lua-filters .


8
Это прекрасно работает, чтобы принудительно \newpageразрывать страницы в формате вывода MS Word от pandoc. Чтобы использовать этот фильтр, сохраните код в этом ответе, например, pagebreak.luaи вызовите pandoc с помощью--lua-filter=pagebreak.lua
Christian Long

3

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


Как бы вы format the "horizontal line" style to break a page?
nilon 08

Я знаю только о выводе HTML, который впоследствии распечатываю в pdf. В Chrome есть действительно хорошая реализация интерпретации CSS для печати. В этом случае hr{opacity:0;page-break-after: always;}делает свою работу. Вы можете пожертвовать другим элементом, если хотите использовать его <hr>для чего-то другого.
Хоакин

0

не могу отредактировать ответ LucasSeveryn, очередь сказала, что очередь заполнена, поэтому добавьте сюда некоторую информацию.

способ 1: + raw_tex

\newpageи \pagebreakнужно raw_texпродление.

// с pandoc 2.9.2.1, не работает с выводом docx или html, --verbose говорит

[INFO] Not rendering RawBlock (Format "tex") "\\pagebreak"
[INFO] Not rendering RawBlock (Format "tex") "\\newpage"

способ 2: + raw_attribute

https://pandoc.org/MANUAL.html#extension-raw_attribute

```{=openxml}
<w:p>
  <w:r>
    <w:br w:type="page"/>
  </w:r>
</w:p>
```

// также не поддерживается в формате ввода gfm.
// это работало для вывода docx, а не для вывода html.

УВЕДОМЛЕНИЕ о расширении

это требует +raw_texрасширения формата. который не поддерживает все варианты уценки в pandoc.

https://pandoc.org/MANUAL.html#markdown-variants

Note, however, that commonmark and gfm have limited support for extensions.  

Only those listed below (and smart, raw_tex, and hard_line_breaks) will work.  

The extensions can, however, all be individually disabled.

Also, raw_tex only affects gfm output, not input.

так -f markdownбудет работать, но -f gfmне работать.

расширение формата

https://pandoc.org/MANUAL.html#option--from

Extensions can be individually enabled or disabled by appending 
+EXTENSION or -EXTENSION to the format name.

например

-t html+raw_tex: output enable raw_tex

-f markdown-raw_tex-raw_attribute: input отключить raw_tex и raw_attribute

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.