Розрив сторінки розмітки Pandoc


113

Нещодавно я почав використовувати розмітку Pandoc, що здається гарною альтернативою LaTeX, оскільки мій документ не має багатьох математичних формул, і я не маю жодного досвіду роботи з LaTeX, що в поєднанні з меншим за 2 тижні терміном подання робить це хорошим рішенням.

Одна річ, яку я не зміг обійти, - це як змусити її залишити решту сторінки порожньою, чи хтось може допомогти?


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

Відповіді:


135

Схоже, розмітка pandoc використовує для цієї мети стандартні теги LaTeX:

\newpage і \pagebreak


9
Обидва працюють (спасибі!), Але яка різниця між ними або вони абсолютно рівноцінні?
Калин

15
нова сторінка закінчує поточну сторінку, тоді як розрив сторінки - це більше доброзичливий запит - це може статися або не статися. Дивіться 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 .


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

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

0

не можу редагувати відповідь Лукаса Северіна, сказати чергу повну, тому додайте сюди інформацію.

спосіб 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--від

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

наприклад

-t html+raw_tex: вихід увімкнути raw_tex

-f markdown-raw_tex-raw_attribute: введення відключити raw_tex та raw_attribute

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.