Podział strony z cenami Pandoc

113

Niedawno zacząłem stosować przeceny Pandoc, które wydają się dobrą alternatywą dla LaTeX-a, ponieważ mój dokument nie ma wielu formuł matematycznych i nie mam ŻADNEGO doświadczenia z LaTeX, co w połączeniu z mniej niż 2-tygodniowym terminem składania wniosków sprawia, że ​​jest to dobre rozwiązanie.

Jedna rzecz, której nie udało mi się znaleźć, to jak zmusić go do pozostawienia pustej reszty strony. Czy ktoś może pomóc?

LucasSeveryn
źródło
5
Markdown o smaku Pandoc jest również świetny, gdy używa się formuł matematycznych.
A. Donda

Odpowiedzi:

135

Wygląda na to, że markdown pandoc używa do tego celu standardowych tagów LaTeX:

\newpage i \pagebreak

LucasSeveryn
źródło
9
Obie działają (dzięki!), Ale jaka jest różnica między nimi, czy też są dokładnie równoważne?
Kalin
15
newpage kończy bieżącą stronę, podczas gdy pagebreak jest bardziej przyjazną prośbą - może się zdarzyć lub nie. Zobacz personal.ceu.hu/tex/breaking.htm
parvus
5
Dzieje się tak, ponieważ surowe polecenia lateksowe są przekazywane bezpośrednio, jeśli dane wyjściowe rozumieją polecenia lateksu.
Matthew Pickering
23

TL; DR : użyj \newpagei filtru Lua poniżej, aby uzyskać podziały stron w wielu formatach.

Pandoc analizuje wszystkie dane wejściowe do wewnętrznego formatu dokumentu. Ten format nie ma dedykowanego sposobu przedstawiania podziałów stron, ale nadal można zakodować informacje w inny sposób. Jednym ze sposobów jest użycie surowego LaTeXa \newpage. Działa to doskonale podczas wyprowadzania LaTeX (lub PDF utworzonego przez LaTeX). Jednak można napotkać problemy podczas kierowania na różne formaty, takie jak HTML lub docx.

Prostym rozwiązaniem w przypadku kierowania na inne formaty jest użycie filtru pandoc, który może przekształcić wewnętrzną reprezentację dokumentu tak, aby odpowiadała naszym potrzebom. Pandoc 2.0 i nowsze wersje pozwalają nawet na użycie dołączonego interpretera Lua do wykonania tej transformacji.

Załóżmy, że wskazujemy podziały stron, umieszczając \newpagelinię otoczoną pustymi liniami, na przykład:

lorem ipsum

\newpage

more text

\newpageBędą analizowane jako RawBlock surowców zawierających TeX . Blok zostanie uwzględniony w danych wyjściowych tylko wtedy, gdy format docelowy może zawierać surowy TeX (tj. LaTeX, Markdown, Org itp.).

Możemy użyć prostego filtra Lua, aby przetłumaczyć to, gdy celujemy w inny format. Poniższe działa dla docx , LaTeX , epub i lekkich znaczników.

--- 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

Opublikowaliśmy zaktualizowaną, bardziej funkcjonalną wersję . Jest dostępny z oficjalnego repozytorium pandoc lua- filter .

tarleb
źródło
8
Działa to pięknie, aby wymusić \newpagepodziały stron w formacie wyjściowym MS Word pandoc. Aby użyć tego filtra, zapisz kod w tej odpowiedzi np. pagebreak.luaI wywołaj pandoc z--lua-filter=pagebreak.lua
Christian Long
3

Zauważyłem, że to nie działa w przypadku formatów .doc i .odt. Rozwiązaniem, które znalazłem, było wstawienie poziomej linii -----------------i sformatowanie stylu „poziomej linii”, aby złamać stronę i być niewidocznym za pomocą edytora tekstu (w moim przypadku ibre office)

Joaquin
źródło
Jak byś ty format the "horizontal line" style to break a page?
nilon
Wiem tylko o wynikach HTML, które konsekwentnie drukuję do pdf. Chrome ma naprawdę fajną implementację interpretacji CSS do druku. W tym przypadku hr{opacity:0;page-break-after: always;}spełnia swoje zadanie. Możesz poświęcić inny element, jeśli chcesz go użyć <hr>do czegoś innego.
Joaquin
0

nie można edytować odpowiedzi LucasSeveryna, powiedział, że kolejka jest pełna, więc dodaj tutaj trochę informacji.

sposób 1: + raw_tex

\newpagei \pagebreakpotrzebuję raw_texrozszerzenia.

// z pandoc 2.9.2.1, nie działa z wyjściem docx lub html, mówi --verbose

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

sposób 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>
```

// również nie obsługuje formatu wejściowego gfm.
// to zadziałało z wyjściem docx, nie działało z wyjściem html.

rozszerzenie UWAGA

to wymaga +raw_texrozszerzenia formatu. który nie obsługuje wszystkich wariantów przecen w 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.

tak -f markdownbędzie działać, ale -f gfmnie działa.

rozszerzenie formatu

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

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

na przykład

-t html+raw_tex: wyjście włącz raw_tex

-f markdown-raw_tex-raw_attribute: input wyłącz raw_tex i raw_attribute

yurenchen
źródło